Python Popen的行为不像子进程

时间:2012-07-31 15:23:05

标签: python subprocess

我的问题是这个 - 我需要从子进程获取输出并且我使用以下代码来调用它 - (可以随意忽略长参数。导入的东西是stdout = subprocess.PIPE)< / p>

        (stdout, stderr) = subprocess.Popen([self.ChapterToolPath, "-x",  book.xmlPath , "-a", book.aacPath , "-o",   book.outputPath+ "/" + fileName + ".m4b"], stdout= subprocess.PIPE).communicate()
        print stdout

感谢下面的回答,我已经能够获得该程序的输出,但我仍然在等待进程终止之后才得到任何东西。有趣的是,在我的调试器中,控制台中有各种各样的文本,它们都被忽略了。但是当任何东西以黑色写入控制台时(我正在使用pycharm),程序继续没有问题。主程序是否可以等待某种输出才能继续前进?这是有道理的,因为我正在尝试与它进行通信....我可以在控制台中看到的文本和使其进入标准输出的实际文本之间有区别吗?我如何收集写入控制台的文字?

谢谢!

2 个答案:

答案 0 :(得分:2)

the documentation for subprocess.call()的第一行描述如下:

  

运行args描述的命令。等待命令完成,然后返回returncode属性。

因此,它必须等待子进程退出。

相比之下,

subprocess.Popen()不会这样做,返回一个句柄的句柄,而不是communicate()

答案 1 :(得分:1)

获取程序的所有输出:

from subprocess import check_output as qx

output = qx([program, arg1, arg2, ...])

在程序运行时获取输出:

from subprocess import Popen, PIPE

p = Popen([program, arg1, ...], stdout=PIPE)
for line in iter(p.stdout.readline, ''):
    print line,

如果在交互式运行时逐行打印,则program'侧可能存在缓冲问题,但如果作为子进程运行则缓冲其输出。根据您的操作系统或程序,有各种解决方案,例如,您可以使用pexpect module运行它。