2010-06-08 13 views
16

Próbuję napisać małą aplikację, która korzysta z modułu subprocess.Używanie podprocesu wait() i poll()

Mój program wywołuje zewnętrzne polecenie Bash, które może trochę potrwać. W tym czasie chciałbym pokazać użytkownikowi serię takich komunikatów:

Przetwarzanie. Proszę czekać ...
Wyjście jest foo()

jaki sposób można zrobić to za pomocą Popen.wait() lub Popen.poll(). Czytałem, że muszę używać Popen.returncode, ale jak mogę go uzyskać, aby aktywnie sprawdzić stan, nie wiem.

Odpowiedz

16

Zarówno wait() (z timeout określony) i poll() powrót None jeśli proces nie jest jeszcze ukończony, a coś innego, jeśli proces ma gotowego (myślę liczbę całkowitą, kod wyjścia, mam nadzieję, 0).

Edit:

wait() i poll() mają różne problemy:

  • wait (bez argumentu timeout) będzie blokować i czekać na zakończenie procesu.
  • wait z argumentem limitu czasu będzie czekać timeout sekund na zakończenie procesu. Jeśli się nie zakończy, spowoduje to odrzucenie wyjątku TimeoutExpired. Jeśli zauważysz wyjątek, możesz ponownie przejść do wersji wait.
  • poll zawsze zwraca natychmiast. Skutecznie czeka z przekroczeniem limitu czasu 0, wychwytuje każdy wyjątek i zwraca None, jeśli proces nie został zakończony.
  • Z obu wait lub poll, jeśli proces został zakończony, będzie ustawić popen obiektu returncode (w przeciwnym razie jest to None - można sprawdzić, że tak łatwo, jak dzwoni wait lub poll), a wartość zwracana z funkcji będzie również być kodem powrotu procesu.

</Edycja>

Więc myślę, że należy zrobić coś takiego:

while myprocess.poll() is None: 
    print("Still working...") 
    # sleep a while 

mieć świadomość, że jeśli skrypt bash stwarza wiele wyjścia należy użyć communicate() lub coś podobne do steedout stdout stung , aby zostać wypchane.

+0

Używam komunikacji(). Ale nie rozumiem, jak mogę zwrócić kod zwrotny podczas wykonywania procesu. – user225312

+0

Rozwiązałem go, wykonując następujące czynności: jeśli process.poll() ma wartość None: print 'Working' – user225312

+4

Ta odpowiedź jest błędna. Odpowiedź @ onlynone's answer –

23

@ Odpowiedź extraneon jest trochę wstecz. Zarówno wait(), jak i poll() zwracają kod zakończenia procesu, jeśli proces został zakończony.Metoda poll() powróci None jeśli proces jest wciąż działa i metoda wait() będzie blokować aż proces kończy działanie:

Sprawdź się na następującej stronie: https://docs.python.org/3.4/library/subprocess.html#popen-objects

Popen.poll()

Sprawdź, czy proces dziecko ma zakończony. Ustaw i zwróć atrybut kodu powrotu.

Popen.wait()

Poczekaj na dziecko, aby zakończyć proces. Ustaw i zwróć atrybut kodu powrotu.