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。