Як отримати код виходу під час використання subprocessмодуля Python та communicate()методу?
Відповідний код:
import subprocess as sp
data = sp.Popen(openRTSP + opts.split(), stdout=sp.PIPE).communicate()[0]
Чи варто робити це іншим способом?
Як отримати код виходу під час використання subprocessмодуля Python та communicate()методу?
Відповідний код:
import subprocess as sp
data = sp.Popen(openRTSP + opts.split(), stdout=sp.PIPE).communicate()[0]
Чи варто робити це іншим способом?
Відповіді:
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.
from subprocess import Popenа потім просто використовувати, Popenзамість subprocess(or sp).Popenчого, я б сказав, мабуть, збільшує читабельність і скорочує рядки
process.communicate()а потім призначити returncodeякусь змінну. Якщо призначення виконано перед викликом communicate, є None.
Спочатку слід переконатися, що процес завершився, а код повернення був прочитаний за допомогою .waitметоду. Це поверне код. Якщо ви хочете отримати доступ до нього пізніше, він зберігається як .returncodeв Popenоб’єкті.
.communicate()вже чекає, коли підпроцес закінчиться.
.poll() оновить код повернення.
Спробуйте
child = sp.Popen(openRTSP + opts.split(), stdout=sp.PIPE)
returnCode = child.poll()
Крім того, після .poll()викликається код повернення доступний в об'єкті як child.returncode.
exitcode = data.wait(). Дочірній процес буде заблокований, якщо він записує на стандартний вихід / помилку та / або читає зі стандартного вводу, і немає однолітків.
Це працювало для мене. Він також друкує результати, повернені дочірнім процесом
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