Python:运行os.system后如何获取标准输出?

Python:运行os.system后如何获取标准输出?,python,python-2.7,stdout,stderr,os.system,Python,Python 2.7,Stdout,Stderr,Os.system,运行os.system调用后,我想在变量中获取stdout 以这一行为例: batcmd="dir" result = os.system(batcmd) result将包含错误代码(stderr0在Windows下或1在某些linux下用于上述示例) 在执行的命令中不使用重定向,如何获取上述命令的stdout 如果您只需要stdout输出,请查看: 因为您使用的是os.system(),所以必须设置shell=True才能获得相同的行为。您确实希望注意有关将不受信任的参数传递给shell的问

运行
os.system
调用后,我想在变量中获取
stdout

以这一行为例:

batcmd="dir"
result = os.system(batcmd)
result
将包含错误代码(
stderr
0
在Windows下或
1
在某些linux下用于上述示例)


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

如果您只需要
stdout
输出,请查看:

因为您使用的是
os.system()
,所以必须设置
shell=True
才能获得相同的行为。您确实希望注意有关将不受信任的参数传递给shell的问题

如果还需要捕获
stderr
,只需将
stderr=subprocess.STDOUT
添加到调用中:

result = subprocess.check_output([batcmd], stderr=subprocess.STDOUT)
将错误输出重定向到默认输出流


如果您知道输出是文本,请添加
text=True
以使用平台默认编码解码返回的字节值;如果该编解码器对于您接收的数据不正确,请使用
encoding=“…”

我想在Windows解决方案上展开讨论。在Python 2.7.5中使用IDLE时,当我从文件Expts.py运行此代码时:

import subprocess
r = subprocess.check_output('cmd.exe dir',shell=False) 
print r
import subprocess
r = subprocess.call("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提示符。好吧

更进一步…我认为这很酷…当我在Expts.py中执行此操作时:

import subprocess
r = subprocess.check_output('cmd.exe dir',shell=False) 
print r
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将提供所有预期的输出,并返回python提示符,因为子进程根据/C终止

对于冗长的回答,我感到抱歉,但我在这个董事会上对许多简洁的“答案”感到失望,这些答案充其量也不起作用(似乎是因为它们没有经过测试——就像Eduard F在我上面的回答,缺少开关),或者更糟的是,它们太简洁了,根本帮不了什么忙(例如,“尝试子流程而不是os.system”…是的,好吧,现在该怎么办??)。相比之下,我提供了经过测试的解决方案,并展示了它们之间的细微差异。花了很多时间,但。。。
希望这能有所帮助。

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

import subprocess
p = subprocess.Popen(["pwd"], stdout=subprocess.PIPE)
out = p.stdout.read()
print out
或者作为一个函数(我在Python 2.6.7上需要使用shell=True,并且直到2.7才添加check_输出,这使得它在这里不可用):


命令也起作用

import commands
batcmd = "dir"
result = commands.getoutput(batcmd)
print result

它在linux、python 2.7上工作。

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

import os

batcmd = 'dir'
result_code = os.system(batcmd + ' > output.txt')
if os.path.exists('output.txt'):
    fp = open('output.txt', "r")
    output = fp.read()
    fp.close()
    os.remove('output.txt')
    print(output)

改为使用
子进程
模块。
操作系统
不允许您访问进程输入或输出。@MartijnPieters这是唯一的方法吗?不,但是
子进程
封装了Windows和POSIX系统之间的差异,比您能够实现的要好得多。为什么要重新发明轮子?相信我,我已经重新发明了以前是风帽轮。来自C背景,进行良好的fork/exec/pipe舞蹈几乎是自然而然的,但是@MartijnPieters是正确的,只需使用subprocess并完成它。Python 2.7添加了,这可能足以满足您的需要,但除此之外,这两个目标几乎是等效的。在Windows中,只有在运行cmd.exe结果=子进程。检查输出([“cmd.exe”,batcmd])
@EduardFlorinescu:或者使用
shell=True
;这在
子流程
文档中提到过,但我在这里已经明确了。在Jupyter笔记本中有没有办法做到这一点?看起来它只返回一个空字符串。@LouisYang:是的,这在Jupyter笔记本中也有效。但是要考虑到当前的工作方式是直接的Python子进程的类型可能不同,您可能希望将
cwd
参数设置为
subprocess.check\u output()
。您的解决方案(subprocess.call(“cmd.exe dir”,shell=False))在Ubuntu12.04下工作,shell=True除外。谢谢!请记住它是。弃用==不会对库进行进一步的代码更改/修复…并且可能会在将来的版本中删除。您可能需要添加一个解释,说明为什么此答案是对当前高级答案的改进。如果是新的api,或者是dep这一点很重要,以便其他人能够区分其利弊。应该提到的是,这确实使用了Python 2的commands模块遗留下来的内容,但是在API中没有标记为不推荐使用
import subprocess
string="echo Hello world"
result=subprocess.getoutput(string)
print("result::: ",result)