Как получить код выхода при использовании метода передачи подпроцессов 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