Jak odzyskać kod wyjścia, korzystając z subprocess
moduł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 subprocess
moduł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.communicate
ustawi returncode
atrybut 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 Popen
a następnie po prostu użyj Popen
zamiast tego, subprocess(or sp).Popen
co powiedziałbym, prawdopodobnie zwiększa czytelność i skraca wiersze
process.communicate()
a następnie przypisać returncode
do 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 .wait
metody. To zwróci kod. Jeśli chcesz uzyskać do niego dostęp później, jest on przechowywany jak .returncode
w Popen
obiekcie.
.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