在使用IPython笔记本时,由subprocess
生成的子进程的输出从未显示在笔记本本身中。例如,这个单元格。
import subprocess
subprocess.check_call(['echo', 'hello'])
仅输出0
,并且hello
会打印在启动ipython的终端上。
是否有任何配置参数可以调整,使子进程的输出显示在笔记本本身中?
实际上自定义的Python C扩展也将其输出吞噬。 是否有任何解决方法?
在使用IPython笔记本时,由subprocess
生成的子进程的输出从未显示在笔记本本身中。例如,这个单元格。
import subprocess
subprocess.check_call(['echo', 'hello'])
仅输出0
,并且hello
会打印在启动ipython的终端上。
是否有任何配置参数可以调整,使子进程的输出显示在笔记本本身中?
实际上自定义的Python C扩展也将其输出吞噬。 是否有任何解决方法?
from subprocess import Popen, PIPE
p = Popen (['echo', 'hello'], stdout=PIPE)
out = p.communicate ()
print (out)
(b'hello\n', None)
如果您希望捕获输出,请使用check_output
。而check_call
则会返回退出码。
import subprocess
print subprocess.check_output(['echo', 'hello'])
从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'
check_output
命令时,完整的输出内容是在命令执行完成后才被捕获的。我想要调用的进程需要长时间运行,并且会输出大量的日志信息到stdout和stderr中。我希望在执行过程中能够查看这些日志信息,因此check_output
并不适合我的需求。 - Siyuan Ren