Python子进程的返回值
我想从python子进程中获取输出(打印语句)和返回状态,同时显示日志信息。我正在Windows XP上使用Python 2.5。如何获得返回码呢?在本文摘录中,我正在读取输出,以便将其重定向到单独线程中的wxPythonPython子进程的返回值,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
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]”