Jak odzyskać kod wyjścia, korzystając z subprocessmodułu i communicate()metody Pythona ?
Odpowiedni kod:
import subprocess as sp
data = sp.Popen(openRTSP + opts.split(), stdout=sp.PIPE).communicate()[0]
Czy powinienem to robić w inny sposób?
Jak odzyskać kod wyjścia, korzystając z subprocessmodułu i communicate()metody Pythona ?
Odpowiedni kod:
import subprocess as sp
data = sp.Popen(openRTSP + opts.split(), stdout=sp.PIPE).communicate()[0]
Czy powinienem to robić w inny sposób?
Odpowiedzi:
Popen.communicateustawi returncodeatrybut po zakończeniu (*). Oto odpowiednia sekcja dokumentacji:
Popen.returncode
The child return code, set by poll() and wait() (and indirectly by communicate()).
A None value indicates that the process hasn’t terminated yet.
A negative value -N indicates that the child was terminated by signal N (Unix only).
Więc możesz to zrobić (nie przetestowałem tego, ale powinno działać):
import subprocess as sp
child = sp.Popen(openRTSP + opts.split(), stdout=sp.PIPE)
streamdata = child.communicate()[0]
rc = child.returncode
(*) Dzieje się tak ze względu na sposób, w jaki jest zaimplementowany: po skonfigurowaniu wątków do odczytu strumieni dziecka, po prostu wywołuje wait.
from subprocess import Popena następnie po prostu użyj Popenzamiast tego, subprocess(or sp).Popenco powiedziałbym, prawdopodobnie zwiększa czytelność i skraca wiersze
process.communicate()a następnie przypisać returncodedo jakiejś zmiennej. Jeśli przypisanie zostało wykonane przed wywołaniem communicate, jest None.
Najpierw upewnij się, że proces został zakończony, a kod powrotu został odczytany przy użyciu tej .waitmetody. To zwróci kod. Jeśli chcesz uzyskać do niego dostęp później, jest on przechowywany jak .returncodew Popenobiekcie.
.communicate()już czeka na zakończenie podprocesu.
.poll() zaktualizuje kod powrotu.
Próbować
child = sp.Popen(openRTSP + opts.split(), stdout=sp.PIPE)
returnCode = child.poll()
Ponadto, po .poll()nazwie, kod powrotu jest dostępny w obiekcie jako child.returncode.
exitcode = data.wait(). Proces potomny zostanie zablokowany, jeśli zapisze na standardowym wyjściu / błędzie i / lub odczyta ze standardowego wejścia, a nie ma peerów.
To zadziałało dla mnie. Drukuje również dane wyjściowe zwrócone przez proces potomny
child = subprocess.Popen(serial_script_cmd, shell=True, stdout=subprocess.PIPE, stderr=subprocess.STDOUT)
retValRunJobsSerialScript = 0
for line in child.stdout.readlines():
child.wait()
print line
retValRunJobsSerialScript= child.returncode