Как получить код выхода при использовании метода передачи подпроцессов Python?
Как получить код выхода при использовании модуля Python subprocess
и метода communicate()
?
Соответствующий код:
import subprocess as sp
data = sp.Popen(openRTSP + opts.split(), stdout=sp.PIPE).communicate()[0]
Должен ли я делать это по-другому?
Ответы
Ответ 1
Popen.communicate
установит атрибут returncode
, когда это будет сделано (*). Вот соответствующий раздел документации:
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).
Итак, вы можете просто сделать (я не тестировал его, но он должен работать):
import subprocess as sp
child = sp.Popen(openRTSP + opts.split(), stdout=sp.PIPE)
streamdata = child.communicate()[0]
rc = child.returncode
(*) Это происходит из-за того, как он реализован: после настройки потоков для чтения дочерних потоков он просто вызывает wait
.
Ответ 2
Сначала вы должны убедиться, что процесс завершен, и код возврата был прочитан с помощью метода .wait
. Это вернет код. Если вы хотите получить доступ к нему позже, он будет сохранен как .returncode
в объекте Popen
.
Ответ 3
exitcode = data.wait()
. Дочерний процесс будет заблокирован, если он записывает в стандартный вывод/ошибку и/или читает из стандартного ввода, и нет никаких одноранговых узлов.
Ответ 4
.poll()
обновит код возврата.
Try
child = sp.Popen(openRTSP + opts.split(), stdout=sp.PIPE)
returnCode = child.poll()
Кроме того, после того, как .poll()
называется, код возврата доступен в объекте как child.returncode
.
Ответ 5
Это сработало для меня. Он также печатает выходные данные, возвращаемые дочерним процессом
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