0

我的问题是——我需要从子进程获取输出,我使用以下代码来调用它——(随意忽略长参数。导入的东西是 stdout= subprocess.PIPE)

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

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

谢谢!

4

2 回答 2

2

文档subprocess.call()的第一行是这样描述的:

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

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

subprocess.Popen()相比之下,不这样做,而是返回一个进程的句柄,而不是 then communicate()

于 2012-07-31T15:24:51.773 回答
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 模块运行它。

于 2012-07-31T16:38:43.043 回答