Python:运行os.system后如何获取stdout?

时间:2013-09-11 10:54:33

标签: python python-2.7 stdout stderr os.system

我想在运行stdout电话后在变量中获得os.system

让我们以此行为例:

batcmd="dir"
result = os.system(batcmd)

result将包含错误代码(Windows下的stderr 0或上述示例的某些linux下的1

如何在执行命令中不使用重定向的情况下获取上述命令的stdout

6 个答案:

答案 0 :(得分:92)

如果您只需要stdout输出,那么请查看subprocess.check_output()(在Python 2.7中添加):

import subprocess

batcmd="dir"
result = subprocess.check_output(batcmd, shell=True)

由于您使用的是os.system(),因此您必须设置shell=True才能获得相同的行为。您确实希望注意big red warning message关于将不受信任的参数传递给shell。

如果您还需要捕获stderr,只需在呼叫中添加stderr=subprocess.STDOUT即可:

result = subprocess.check_output([batcmd], stderr=subprocess.STDOUT)

将错误输出重定向到默认输出流。

答案 1 :(得分:18)

这些答案对我不起作用。我不得不使用以下内容:

import subprocess
p = subprocess.Popen(["pwd"], stdout=subprocess.PIPE)
out = p.stdout.read()
print out

或者作为一个函数(在Python 2.6.7上使用shell = True并且在2.7之前没有添加check_output,这使得它在这里无法使用):

def system_call(command):
    p = subprocess.Popen([command], stdout=subprocess.PIPE, shell=True)
    return p.stdout.read()

答案 2 :(得分:5)

我想扩展Windows解决方案。使用IDLE与Python 2.7.5,当我从文件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开关,它似乎会使窗口挂起,因为它正在运行子进程cmd.exe并等待进一步输入 - 输入'exit'然后点击[enter]发布。但是使用/ K开关它可以很好地工作并返回到python提示符。 Allrightee然后。

更进一步......我认为这很酷......当我在Expts.py中这样做时:

import subprocess
r = subprocess.call("cmd.exe dir",shell=False) 
print r

...一个新的DOS窗口弹出并保持在那里只显示“cmd.exe”而不是“dir”的结果。当我添加/ C开关时,DOS窗口会在我看到任何内容之前打开和关闭非常快(正如预期的那样,因为/ C在完成时终止)。当我改为添加/ K开关时,DOS窗口会弹出并保持不变,并且我得到了我期望的所有输出,包括目录列表。

如果我从DOS Python命令窗口尝试相同的事情(subprocess.call而不是subprocess.check_output);所有输出都在同一窗口内,没有弹出窗口。没有开关,再次忽略“dir”部分,并且提示从python提示符更改为DOS提示符(因为cmd.exe子进程在python中运行;再次键入'exit',您将返回到python提示符)。添加/ K开关打印出目录列表并将提示从python更改为DOS,因为/ K不会终止子进程。将开关更改为/ C为我们提供所有预期的输出AND返回到python提示符,因为子进程根据/ C终止。

对于啰嗦的回应感到抱歉,但我对这个董事会感到很沮丧,因为许多简洁的'答案'最多不起作用(似乎是因为他们没有经过测试 - 就像Eduard F的回应一样,我的错误是或者更糟糕的是,它们是如此简洁,以至于它们根本没有帮助(例如,'尝试subprocess而不是os.system'......是的,好的,现在是什么?)。相比之下,我提供了我测试过的解决方案,并展示了它们之间的细微差别。花了很多时间,但...... 希望这会有所帮助。

答案 3 :(得分:3)

void data_labeling::on_next_clicked() { int i = 0; QString filename1 = "/home/jin/test/test.jpg"; QFileInfo fileinfo1(filename1); QString foldername1 = fileinfo1.path(); QDir dir(foldername1); dir.setNameFilters(QStringList()<< "*.jpeg" << "*.jpg"); QStringList images = dir.entryList(); QImage image(images[i]); QPixmap::fromImage(image); int w = ui->face_pic->width(); int h = ui->face_pic->height(); ui->face_pic->setPixmap(QPixmap::fromImage(image).scaled(h,w,Qt::KeepAspectRatio)); } 也有效。

commands

适用于linux,python 2.7。

答案 4 :(得分:3)

import subprocess
string="echo Hello world"
result=subprocess.getoutput(string)
print("result::: ",result)

答案 5 :(得分:1)

我不得不使用os.system,因为子进程在执行较大任务时给了我一个内存错误。此问题的参考here。因此,为了获得os.system命令的输出,我使用了以下解决方法:

false