Python:如何获得运行os.system后的stdout?
我想在运行os.system
调用之后在variables中获得stdout
。
让我们以这一行为例:
batcmd="dir" result = os.system(batcmd)
result
将包含错误代码(在Windows下为stderr
0
,在上面的例子中,在一些linux下为1
)。
我怎样才能得到上述命令的stdout
,而不使用执行命令中的redirect?
如果你只需要stdout
,那么看看subprocess.check_output()
(在Python 2.7中添加):
import subprocess batcmd="dir" result = subprocess.check_output(batcmd, shell=True)
因为你使用的是os.system()
,你必须设置shell=True
才能得到相同的行为。 你确实想听听有关将不可信的parameter passing给shell的大红色警告信息 。
如果您还需要捕获stderr
,只需将stderr=subprocess.STDOUT
添加到调用中:
result = subprocess.check_output([batcmd], stderr=subprocess.STDOUT)
将错误输出redirect到默认输出stream。
这些答案对我不起作用。 我不得不使用以下内容:
import subprocess p = subprocess.Popen(["pwd"], stdout=subprocess.PIPE) out = p.stdout.read() print out
或者作为一个函数(在Python 2.6.7中,我需要使用shell = True,并且check_output在2.7之前不会被添加,使得它在这里不可用):
def system_call(command): p = subprocess.Popen([command], stdout=subprocess.PIPE, shell=True) return p.stdout.read()
我想扩展Windows解决scheme。 在Python 2.7.5中使用IDLE当我从Expts.py文件运行这个代码时:
import subprocess r = subprocess.check_output('cmd.exe dir',shell=False) print r
…在Python Shell中,我只获得对应于“cmd.exe”的输出; “dir”部分被忽略。 但是,当我添加一个开关,如/ K或/ C …
import subprocess r = subprocess.check_output('cmd.exe /K dir',shell=False) print r
…然后在Python Shell中,我得到了我期望的所有内容,包括目录列表。 呜呼!
现在,如果我在DOS Python命令窗口中尝试任何相同的东西,没有开关,或者使用/ K开关,它似乎会使窗口挂起,因为它正在运行一个subprocesscmd.exe,并等待进一步的inputtypes'exit'然后点击[enter]释放。 但是使用/ K开关可以很好地工作,并返回到python提示符。 那么Allrightee。
更进一步…我认为这很酷…当我在Expts.py中做这个:
import subprocess r = subprocess.call("cmd.exe dir",shell=False) print r
…一个新的DOS窗口popup打开,并保持只显示“cmd.exe”而不是“dir”的结果。 当我添加/ C开关,DOS窗口打开和closures非常快,我可以看到任何东西(如预期的,因为/ C终止完成)。 当我添加/ K开关,DOS窗口popup打开并保持,我得到我期望的所有输出,包括目录列表。
如果我从DOS Python命令窗口尝试相同的操作(subprocess.call而不是subprocess.check_output) 所有的输出都在同一个窗口内,没有popup窗口。 如果没有开关,再次忽略“dir”部分,提示符会从python提示符改变到DOS提示符(因为cmd.exesubprocess正在python中运行;再次input“exit”,您将恢复到python提示符)。 添加/ K开关打印出目录列表并将提示从python更改为DOS,因为/ K不会终止subprocess。 将开关更改为/ C会给我们所有预期的输出,并返回到python提示符,因为subprocess按照/ C结束。
对不起,我对这个冗长的回答感到抱歉,但是我对这个董事会感到沮丧,有许多简单的“答案”,至多不起作用(好像是因为他们没有经过testing – 就像Eduard F在我的上面没有交换机的回答)或者更糟糕的是,他们根本没有什么帮助(例如,“尝试subprocess而不是os.system”…是的,好的,现在怎么办?)。 相反,我提供了我所testing的解决scheme,并展示了它们之间的细微差别。 花了很多时间,但是…希望这有助于。
commands
也起作用。
import commands batcmd = "dir" result = commands.getoutput(batcmd) print result
它适用于Linux,Python 2.7。