我有一个命令,在命令行上工作得很好。它有很多参数,比如cmd --thing foo --stuff bar -a b input output
我想从python运行这个程序并阻塞它,等待它完成。当脚本将内容打印到stdout
和stderr
时,我希望它立即显示给用户。
哪个模块适合这个?
我试过:
import commands
output = commands.getoutput("cmd --thing foo --stuff bar -a b input output")
print output
这很好,只是stdout
直到结束才返回。
import os
os.system("cmd --thing foo --stuff bar -a b input output")
这将在实际完成命令时打印所有输出。
import subprocess
subprocess.call(["cmd", "--thing foo", "--stuff bar", "-a b", "input", "output"])
这不能以某种方式正确地传递参数(我还没有找到确切的问题,但是cmd
拒绝了我的输入)。如果我将echo
作为第一个参数,当我将命令直接粘贴到终端时,它会打印出工作正常的命令。
import subprocess
subprocess.call("cmd --thing foo --stuff bar -a b input output")
与上述完全相同。
commands.getstatusoutput()不起作用吗?它会立刻恢复你的状态。
如果您不需要处理代码中的输出,只需要在它发生时向用户显示它(从您的Q中看不清楚,从您自己的答案来看似乎是这样),最简单的方法是:
也就是说,不要使用任何管道——让stdout和stderr显示在终端上。这应该可以避免缓冲的任何问题。一旦你在图片中放置了管道,缓冲通常是一个问题,如果你想在它发生时显示输出(我很惊讶你的自我回答没有这个问题;-)。
对于显示和捕获,顺便说一句,我总是建议
pexpect
(和wexpect
在Windows上)精确地解决缓冲问题。你必须分别引用每个字段,即从它们的参数中分割选项。
否则你就可以像这样有效地运行cmd
要将输出放入管道中,需要对其进行稍微不同的调用
相关问题 更多 >
编程相关推荐