我想在运行stdout
电话后在变量中获得os.system
。
让我们以此行为例:
batcmd="dir"
result = os.system(batcmd)
result
将包含错误代码(Windows下的stderr
0
或上述示例的某些linux下的1
。
如何在执行命令中不使用重定向的情况下获取上述命令的stdout
?
答案 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