子进程的IPython Notebook输出

8

在使用IPython笔记本时,由subprocess生成的子进程的输出从未显示在笔记本本身中。例如,这个单元格。

import subprocess
subprocess.check_call(['echo', 'hello'])

仅输出0,并且hello会打印在启动ipython的终端上。

是否有任何配置参数可以调整,使子进程的输出显示在笔记本本身中?


实际上自定义的Python C扩展也将其输出吞噬。 是否有任何解决方法?

3个回答

6
from subprocess import Popen, PIPE
p = Popen (['echo', 'hello'], stdout=PIPE)
out = p.communicate ()
print (out)
(b'hello\n', None)

你也可以类似地查看stderr。

6

如果您希望捕获输出,请使用check_output。而check_call则会返回退出码。

import subprocess
print subprocess.check_output(['echo', 'hello'])

1
使用check_output命令时,完整的输出内容是在命令执行完成后才被捕获的。我想要调用的进程需要长时间运行,并且会输出大量的日志信息到stdout和stderr中。我希望在执行过程中能够查看这些日志信息,因此check_output并不适合我的需求。 - Siyuan Ren
在Python3中:print(subprocess.check_output(['echo', 'hello'])) - vwvan

1

从Python3.5+开始

我认为我应该提供一个更好的答案。现在subprocess模块提供了run方法,根据文档:

调用子进程的推荐方法是对于所有它可以处理的用例都使用run()函数。对于更高级的用例,可以直接使用底层的Popen接口。

from subprocess import run, PIPE

result = run (['echo', 'hello'], stdout=PIPE)
print (result.returncode, result.stdout)

0 b'hello\n'

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接