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
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
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
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
Po sprawdzeniu wydaje mi się że ten sposób działa bezbłędnie
Offline
Strony: 1