从Python子进程返回值

use*_*168 8 python subprocess

我想从python子进程获取输出(打印语句)和返回状态以及显示日志信息.我在Windows XP上使用Python 2.5.我如何获得返回码?在这个提取中,我正在读取输出,以便我可以将其重定向到TextCtrl在单独的线程中的wxPython 中显示.

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     
Run Code Online (Sandbox Code Playgroud)

jro*_*jro 7

返回代码由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)
Run Code Online (Sandbox Code Playgroud)

请注意,你可能想.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
Run Code Online (Sandbox Code Playgroud)

使用类执行此外部文件(让我们调用它test.py)Popen,我们将pass在读出self.myproc.stdout时以及0读出时self.myproc.poll(或self.myproc.returncode在第一次轮询之后)获得.

此返回代码的目的是您不必解析所有子进程的输出以确定它是否在其作业中成功:您可以自由定义自己的退出代码.例如,您可以考虑0成功,1成为失败,2成为某种无效输入,9未知错误等等.这样,您可以继续保持poll流程,并根据该轮询返回的退出代码直接知道它是否成功.请注意,这有点不太适用于您的情况,因为您仍然需要子进程的输出,但仍然更容易解析数字而不是字符串来确定成功.