Код возврата возвращается при вызове poll
и также (после того, как poll
не вернул None
) доступен через атрибут returncode
.Вы уже используете это в своем коде, поэтому я не уверен, в чем ваша проблема.
Если вы хотите обновить свой элемент управления во время работы вашего процесса, используйте readline
вместо read
: последний будет ждать, пока будет представлен весь вывод, в то время как первый будет ждать символа новой строки.Чтобы привести полный пример с использованием имен переменных:
from subprocess import Popen, PIPE
self.myproc = Popen('dir /s', shell=True, stdout=PIPE, stderr=PIPE)
while self.myproc.poll() == None:
self._parent.AppendUpdate(self.myproc.stdout.readline())
self._parent.AppendUpdate('Return code was ' + self.myproc.returncode)
Обратите внимание, что вам может потребоваться .strip()
результат readline
, поскольку он будет содержать символ новой строки.
Редактировать: Чтобы устранить путаницу между выводом сценария и его кодом возврата, выполните следующее.Во-первых, скрипт Python на уровне модуля не может возвращать значение: это приведет к синтаксической ошибке.Поэтому следует различать вывод скрипта и код возврата, который он дает.
Вывод скрипта в приведенном выше примере читается с использованием метода self.myproc.stdout.readline
.Каждый раз, когда внешний процесс генерирует строку выведенного текста, вызов этой функции приведет к ее извлечению.
Однако код возврата (или состояние выхода) - это целое число, которое передается от дочернего процесса к родительскому (ваш) процесс, указывающий состояние, в котором дочерний процесс завершился.В Python вы делаете это с помощью функции sys.exit
.Чаще всего, когда это значение равно нулю, это указывает на успех;ненулевое значение отображает какую-то ошибку.
Скажем, ваш дочерний скрипт процесса выглядит так:
import sys
# Do some stuff
print 'pass' # Gets to stdout
sys.exit(0) # Return code
Выполнение этого внешнего файла (назовем его test.py
) с помощью Popen
класс, мы получим pass
, когда мы прочитаем self.myproc.stdout
, и 0
, когда мы прочитаем self.myproc.poll
(или self.myproc.returncode
после первого опроса).
Цель этогоКод возврата состоит в том, что вам не нужно анализировать весь вывод дочернего процесса, чтобы определить, преуспел ли он в своей работе: вы можете определять свои собственные коды выхода.Например, вы можете рассматривать 0
как успех, 1
как сбой, 2
как какой-то неверный ввод данных, 9
неизвестную ошибку и так далее.Таким образом, вы можете просто poll
продолжать процесс и на основании кода завершения, возвращенного этим опросом, вы напрямую знаете, был ли он успешным.Обратите внимание, что это немного менее применимо к вашему случаю, так как вам все равно нужен вывод дочернего процесса, но все же легче проанализировать число, чем строку, чтобы определить успех.