Nie jesteś zalogowany.
Jeśli nie posiadasz konta, zarejestruj je już teraz! Pozwoli Ci ono w pełni korzystać z naszego serwisu. Spamerom dziękujemy!
Prosimy o pomoc dla małej Julki — przekaż 1% podatku na Fundacji Dzieciom zdazyć z Pomocą.
Więcej informacji na dug.net.pl/pomagamy/.
Strony: 1



Użytkownik
Prosty kod...
import subprocess
a=subprocess.Popen(['cat'],stdin=subprocess.PIPE,stdout=subprocess.PIPE)
b=subprocess.Popen(['cat'],stdin=subprocess.PIPE,stdout=subprocess.PIPE)
print a.communicate('test')No i niestety - wywołanie communicate sobie wisi...
Jest na to jaki sposób czy mam zapomnieć o subprocess i bawić się ręcznie pipe/fork/exec? Szczerze mówiąc nie bardzo mi się chce, a to dość krytyczny kawałek aplikacji...
Ostatnio edytowany przez ethanak (2011-12-06 08:12:51)
Offline


Moderator
process_handle = subprocess.Popen(['/usr/bin/gnokii', '--config', '/etc/gnokiirc', '--sendsms', contact], stdin=subprocess.PIPE, stderr=subprocess.PIPE, shell=False, close_fds=False)
process_handle.stdin.writelines(msg)
(stdout, stderr) = process_handle.communicate()
f = open(logfile, 'a')
f.write(''.join([msg_timestamp, ' :: ', contact, '\n']))
f.write(''.join([msg, '\n']))
f.writelines(''.join([stderr, '\n']))
f.close()
for line in stderr.splitlines():
if re.match('^.+?succ.+?$', line):
if debug:
print "OK"
elif re.match('^.+?fail.+?$', line):
if debug:
print "nie OK"U mnie coś takiego funkcjonuje..
Offline



Użytkownik
A, trochę nie o to chodziło
Sęk w tym że robię dwa obiekty Popen (jeden jest na zapas), bo o ile wywoływany program (closed source niestety, konkretniej txt2pho) działa szybko, o tyle inicjalizacja (wczytanie jakiejś masy bzdurnych danych) trwa. Czyli chciałem coś takiego:
x=Popen(costam) #trochę czasu minęło... while True: p=x x=Popen(costam) # zrobił się fork i sobie czyta swoje dane y=x.communicate(dane) # coś robimy z y co trochę trwa
No i wywołanie x=Popen(...) skutecznie blokuje p.communicate() - tak jakby dwa obiekty się ze sobą gryzły...
Zresztą - znalazłęm gdzieś w czeluściach internetu rozwiązanie - dodanie close_fds=True do parametrów Popen(). Na testowym programie zadziałało... zobaczę wieczorkiem czy mi w rzeczywistej aplikacji zrobi to samo :)
Czyli na razie nie markuję jako rozwiązany...
Offline



Użytkownik
Po sprawdzeniu wydaje mi się że ten sposób działa bezbłędnie
Offline
Strony: 1