在终端上,我有两个要使用子进程运行的程序
首先,我将调用./matrix-odas &
,以便第一个程序将在后台运行,然后键入第二个命令。第一条命令将返回一些消息。
第二个命令~/odas/bin/odaslive -vc ~/odas/config/odaslive/matrix_creator.cfg
将打开第二个程序,它将继续运行并继续打印文本。我想使用子流程打开这些程序并捕获两个输出。
在教程之前和之后,我从未使用过子过程,我在Jupyter笔记本(python 3.7)上编写脚本是为了轻松查看输出。
from subprocess import Popen, PIPE
p = Popen(["./matrix-odas", "&"], stdout=PIPE, stderr=PIPE, cwd=wd, universal_newlines=True)
stdout, stderr = p.communicate()
print(stdout)
这是我尝试打开第一个程序的代码。但是Jupyter笔记本始终卡在p.communicate()
上,我看不到任何消息。如果不在后台运行第一个程序,则在打印消息后将无法获得命令提示符。
我想知道应该使用哪个子流程函数来解决此问题,以及哪个平台更适合测试子流程代码。任何建议将不胜感激。非常感谢!
答案 0 :(得分:0)
在此示例中,this section of the docs
with Popen(["ifconfig"], stdout=PIPE) as proc:
log.write(proc.stdout.read())
看起来您可以直接从对象访问stdout(我假设是stderr)。我不确定是否需要使用Popen作为上下文管理器来访问该属性。