使用python运行其他程序

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)

与上面完全相同.

Joh*_*ooy 7

你必须分别引用每个字段,即.从他们的参数中拆分选项.

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)


Ale*_*lli 4

如果您不需要处理代码中的输出,只需在发生时将其显示给用户(从您的问题中不清楚,从您自己的回答来看似乎是这样),最简单的是:

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 仅显示在终端上。这应该可以避免任何缓冲问题。一旦您将管道放入图片中,如果您想在发生时显示输出,那么缓冲通常一个问题(我很惊讶您的自我回答没有这个问题;-)。

对于显示捕获,顺便说一句,我总是建议pexpectwexpect在 Windows 上)完全解决缓冲问题。