我想获取输出(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
答案 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
),当我们读出pass
和self.myproc.stdout
时,我们会0
当我们在第一轮投票后宣读self.myproc.poll
(或self.myproc.returncode
)时。
此返回代码的目的是您不必解析所有子进程的输出以确定它是否成功完成了它的工作:您可以自由定义自己的退出代码。例如,您可以认为0
为成功,1
为失败,2
为某种无效输入,9
未知错误,以及等等。这样,您可以保持poll
进程,并根据该轮询返回的退出代码直接知道它是否成功。请注意,这有点不太适用于您的情况,因为您仍然需要子进程的输出,但仍然更容易解析数字而不是字符串以确定成功。