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!

Ogłoszenie

Prosimy o pomoc dla małej Julki — przekaż 1% podatku na Fundacji Dzieciom zdazyć z Pomocą.
Więcej informacji na dug.net.pl/pomagamy/.

#1  2011-12-05 12:08:35

  ethanak - Użytkownik

ethanak
Użytkownik
Skąd: Ungwenor
Zarejestrowany: 2010-07-19
Serwis

[SOLVED][python] Popen.communicate i tajemniczy zwis

Prosty kod...

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)


Nim mechaniczne larum zagrasz mi, kanalio,
głosząc nadejście Javy - śmiertelnego wroga!
Zespół Adwokacki Dyskrecja

Offline

 

#2  2011-12-05 13:23:25

  zlyZwierz - Moderator

zlyZwierz
Moderator
Zarejestrowany: 2005-02-18
Serwis

Re: [SOLVED][python] Popen.communicate i tajemniczy zwis

Kod:

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

 

#3  2011-12-05 13:43:32

  ethanak - Użytkownik

ethanak
Użytkownik
Skąd: Ungwenor
Zarejestrowany: 2010-07-19
Serwis

Re: [SOLVED][python] Popen.communicate i tajemniczy zwis

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:

Kod:

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...


Nim mechaniczne larum zagrasz mi, kanalio,
głosząc nadejście Javy - śmiertelnego wroga!
Zespół Adwokacki Dyskrecja

Offline

 

#4  2011-12-06 08:14:40

  ethanak - Użytkownik

ethanak
Użytkownik
Skąd: Ungwenor
Zarejestrowany: 2010-07-19
Serwis

Re: [SOLVED][python] Popen.communicate i tajemniczy zwis

Po sprawdzeniu wydaje mi się że ten sposób działa bezbłędnie


Nim mechaniczne larum zagrasz mi, kanalio,
głosząc nadejście Javy - śmiertelnego wroga!
Zespół Adwokacki Dyskrecja

Offline

 

Stopka forum

Powered by PunBB
© Copyright 2002–2005 Rickard Andersson
Nas ludzie lubią po prostu, a nie klikając w przyciski ;-)