Как получить код выхода при использовании метода связи подпроцесса Python? - PullRequest
164 голосов
/ 12 апреля 2011

Как мне получить код завершения при использовании модуля Python subprocess и метода communicate()?

Соответствующий код:

import subprocess as sp
data = sp.Popen(openRTSP + opts.split(), stdout=sp.PIPE).communicate()[0]

Должен ли я делать это по-другому?

Ответы [ 5 ]

230 голосов
/ 12 апреля 2011

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.

8 голосов
/ 12 апреля 2011

Сначала необходимо убедиться, что процесс завершен и код возврата считан методом .wait.Это вернет код.Если вы хотите получить к нему доступ позже, он сохраняется как .returncode в объекте Popen.

6 голосов
/ 12 апреля 2011

exitcode = data.wait().Дочерний процесс будет заблокирован, если он записывает в стандартный вывод / ошибку и / или читает из стандартного ввода, и нет равноправных узлов.

2 голосов
/ 31 августа 2017

.poll() обновит код возврата.

Попробуйте

child = sp.Popen(openRTSP + opts.split(), stdout=sp.PIPE)
returnCode = child.poll()

Кроме того, после вызова .poll() код возврата доступен в объекте как child.returncode.

1 голос
/ 05 апреля 2019

Это сработало для меня.Он также печатает выходные данные, возвращенные дочерним процессом

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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...