Pau*_*jan 8 python unix subprocess
我有一个在命令行上运行良好的命令.它有很多论据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
Run Code Online (Sandbox Code Playgroud)
这项工作很有效,除非stdout直到最后才返回.
import os
os.system("cmd --thing foo --stuff bar -a b input output")
Run Code Online (Sandbox Code Playgroud)
这将在cmd实际完成时打印所有输出.
import subprocess
subprocess.call(["cmd", "--thing foo", "--stuff bar", "-a b", "input", "output"])
Run Code Online (Sandbox Code Playgroud)
这不会以某种方式正确传递参数(我无法找到确切的问题,但cmd拒绝我的输入).如果我把它echo作为第一个参数,它打印出的命令在我直接粘贴到终端时可以正常工作.
import subprocess
subprocess.call("cmd --thing foo --stuff bar -a b input output")
Run Code Online (Sandbox Code Playgroud)
与上面完全相同.
你必须分别引用每个字段,即.从他们的参数中拆分选项.
import subprocess
output = subprocess.call(["cmd", "--thing", "foo", "--stuff", "bar", "-a", "b", "input", "output"])
Run Code Online (Sandbox Code Playgroud)
否则你就像这样有效地运行cmd
$ cmd --thing\ foo --stuff\ bar -a\ b input output
Run Code Online (Sandbox Code Playgroud)
要将输出输入管道,您需要稍微改变它
import subprocess
output = subprocess.Popen(["cmd", "--thing", "foo", "--stuff", "bar", "-a", "b", "input", "output"],stdout=subprocess.PIPE)
output.stdout # <open file '<fdopen>', mode 'rb'>
Run Code Online (Sandbox Code Playgroud)
如果您不需要处理代码中的输出,只需在发生时将其显示给用户(从您的问题中不清楚,从您自己的回答来看似乎是这样),最简单的是:
rc = subprocess.call(
["cmd", "--thing", "foo", "--stuff", "bar",
"-a", "b", "input", "output"])
print "Return code was", rc
Run Code Online (Sandbox Code Playgroud)
即,避免使用任何管道——让 stdout 和 stderr 仅显示在终端上。这应该可以避免任何缓冲问题。一旦您将管道放入图片中,如果您想在发生时显示输出,那么缓冲通常是一个问题(我很惊讶您的自我回答没有这个问题;-)。
对于显示和捕获,顺便说一句,我总是建议pexpect(wexpect在 Windows 上)完全解决缓冲问题。