Python 子进程输出到标准输出

22

我正在使用subprocess模块从Python中运行二进制文件。

为了捕获由该二进制文件产生的输出,我正在使用:

proc = subprocess.Popen (command_args, shell=False, stdout=subprocess.PIPE)
out = proc.communicate()[0]
#print the output of the child process to stdout
print (out)

这段代码的作用是在进程执行完成后将输出打印出来。有没有办法在程序执行的同时将输出打印到标准输出?我真的需要查看输出结果,因为这些程序可能运行很长时间。

感谢帮助。


没关系,伙计们,我想我找到了解决方案:`基本上你有三个选择:使用线程在不阻塞主线程的情况下读取另一个线程。 选择stdout、stderr而不是通信。这样你可以在数据可用时读取,避免阻塞。 让库来解决这个问题,twisted是一个明显的选择。` - therealtypon
5
如果您找到了另一个答案,例如https://dev59.com/4lPTa4cB1Zd3GeqPgBMR#4585898,请链接到该答案,而不是在评论中复制自己的问题的答案。 - phooji
抱歉。我以为评论中的重点是 https://dev59.com/4lPTa4cB1Zd3GeqPgBMR… 的精髓。下次我会牢记这一点的。 - therealtypon
2个回答

21

简单来说,不要将输出发送到管道中:

proc = subprocess.Popen (command_args, shell=False)
proc.communicate()

3
@josh: 是的,这是预期的,也是代码不将结果存储在变量中的原因。由于我们没有将输出发送到管道中,子进程将继承当前进程的标准输出(stdout),这意味着一切都将直接打印到终端上。 - Sven Marnach
抱歉,你是对的 - 我没有仔细阅读问题,我假设他想要做我想做的事情,即实时输出到标准输出,然后在之后捕获输出。 - josh
1
@josh:如果您可以在等待输出时阻止,并且处理输出不需要很长时间,您可以简单地将参数bufsize=1传递给Popen()以进行行缓冲,逐行读取输出,一旦获取它,立即将其打印并处理。 - Sven Marnach
不错的技巧,我可以看到在cmd上打印的行,如何将其存储到一个变量中以便稍后使用? - pelos

0
这对我有用:
如果需要在 PowerShell 中执行命令:
import subprocess

S_V = subprocess.Popen(["powershell.exe", 'your command'   ], stdout=subprocess.PIPE)
out, err = S_V.communicate()
print (out)
print (err )

或者如果需要在 CMD 中执行命令:

name=subprocess.check_output('whoami')  # replace your command with 'whoami'
name=name.decode("utf-8") 
print (name)

注意:whoami 显示当前登录到本地系统的用户。

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