Python子进程的返回值

Python子进程的返回值,python,subprocess,Python,Subprocess,我想从python子进程中获取输出(打印语句)和返回状态,同时显示日志信息。我正在Windows XP上使用Python 2.5。如何获得返回码呢?在本文摘录中,我正在读取输出,以便将其重定向到单独线程中的wxPythonTextCtrl中显示 self.myproc.poll() if self.myproc.returncode is None: # Still running so check stdout

我想从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     

returncode通过
poll
调用返回,并且也可以通过
returncode
属性访问(一旦
poll
未返回
None
)。您已经在代码中使用了它,所以我不确定您的问题是什么

如果要在进程运行时更新控件,请使用
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()
读取结果,因为它将包含换行符

编辑:要解决脚本输出和返回代码之间的混淆,请执行以下操作。首先,模块级的Python脚本无法返回值:这将产生语法错误。因此,您应该区分脚本的输出和它给出的返回代码

在上面的示例中,脚本的输出是使用
self.myproc.stdout.readline
方法读取的。每次外部进程产生一行输出的文本时,调用该函数将检索它

但是,返回代码(或退出状态)是一个整数,它从子进程传递到父进程(您的)进程,指示子进程退出的状态。在Python中,您可以使用
sys.exit
函数来实现这一点。最常见的情况是,当该值为零时,表示成功;非零值表示某种错误

假设您的子进程脚本如下所示:

import sys
# Do some stuff
print 'pass'    # Gets to stdout
sys.exit(0)     # Return code
使用
Popen
类执行这个外部文件(我们称它为
test.py
),当我们读取
self.myproc.stdout
时,我们将获得
pass
,当我们读取
self.myproc.poll
(或者在第一次轮询后读取
self.myproc.returncode>)时,我们将获得
0


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

我的进程中的命令是一个python文件,并返回一个值,例如字符串“Pass”或“Fail”。我刚刚得到了0或1Ah这样的返回值,然后您只需要分析
stdout
的最后一行。返回码表示程序的退出条件,是一个整数。很抱歉,我没有理解你的评论。为参数起见,调用的进程类似于def main():a=5 b=6 c=a+b print c如果name='main',则返回'PASS':main()如何在此处获取返回值'PASS'?@user974168:由于注释字段有点小,我更新了答案以便更好地解释它。我被这个问题弄糊涂了,提问者说“返回值(列表)打印到标准输出,但没有被捕获[446047544066124379510]”