Возвращаемое значение из подпроцесса Python - PullRequest
8 голосов
/ 09 ноября 2011

Я хотел бы получить выходные данные (операторы печати) и вернуть статус из подпроцесса python вместе с отображением информации журнала.Я использую Python 2.5 на Windows XP.Как мне получить код возврата?Здесь, в этом фрагменте, я читаю вывод, чтобы я мог перенаправить его для отображения в wxPython TextCtrl в отдельном потоке.

self.myproc.poll()                      
if self.myproc.returncode is None:             
    # Still running so check stdout
    txt = self.myproc.stdout.read(self._readblock)     
    if txt:        
        # Add to UI's update queue
        self._parent.AppendUpdate(txt)        
    else:   
        break     

1 Ответ

7 голосов
/ 09 ноября 2011

Код возврата возвращается при вызове 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 продолжать процесс и на основании кода завершения, возвращенного этим опросом, вы напрямую знаете, был ли он успешным.Обратите внимание, что это немного менее применимо к вашему случаю, так как вам все равно нужен вывод дочернего процесса, но все же легче проанализировать число, чем строку, чтобы определить успех.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...