从Python子进程返回值

时间:2011-11-09 05:46:41

标签: python subprocess

我想获取输出(print语句)并从python子进程返回状态以及显示日志信息。我在Windows XP上使用Python 2.5。我如何获得返回码?在这个提取中,我正在读取输出,以便我可以将其重定向到在单独的线程中的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 个答案:

答案 0 :(得分: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)

请注意,您可能需要.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),当我们读出passself.myproc.stdout时,我们会0当我们在第一轮投票后宣读self.myproc.poll(或self.myproc.returncode)时。

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