returncode由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()结果,因为它将包含换行符。
编辑:要解决脚本输出与其返回代码之间的混淆,请执行以下操作。首先,模块级的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,并且根据该轮询返回的退出代码,您可以直接知道它是否成功。请注意,这对您的案例不太适用,因为您无论如何都需要子进程的输出,但是解析数字比字符串更容易确定成功与否。