我也是Python和编程的新手。我从Google的python类中知道如何使用以下命令运行外部命令:
(status,output)= commands.getstatusoutput(cmd)
如果状态:##错误情况,将命令的输出打印到stderr并退出
sys.stderr.write(输出)
sys.exit(1)
但我认为命令模块已经过时了。我想要状态和输出,所以我可以使用sys.stderr.write()打印输出,如果有任何错误。那么, subprocess 模块中是否有任何等效命令?我目前正在使用:
现在subprocess.call(args,shell = False)。
谢谢!
答案 0 :(得分:2)
subprocess.getstatusoutput()
in Python 3有could be implemented as:
from subprocess import check_output, CalledProcessError, STDOUT
def getstatusoutput(cmd):
try:
data = check_output(cmd, shell=True, universal_newlines=True, stderr=STDOUT)
status = 0
except CalledProcessError as ex:
data = ex.output
status = ex.returncode
if data[-1:] == '\n':
data = data[:-1]
return status, data
两者都返回status
,与原始commands.getstatusoutput()
不同。请参阅Python Issue: Document & unittest the subprocess.getstatusoutput() status value。
答案 1 :(得分:1)
也可以用更少的代码
来做到这一点from subprocess import Popen, PIPE
def getstatusoutput(command):
process = Popen(command, stdout=PIPE)
out, _ = process.communicate()
return (process.returncode, out)
code, out = getstatusoutput(["echo", "some text"])
print code
print out
答案 2 :(得分:0)
Popen是一种很好的简单方法:
from subprocess import Popen, PIPE
def local(command):
print 'local', local
process = Popen(command.split(), stdout=PIPE, stderr=PIPE)
out = process.stdout.read()
err = process.stderr.read()
print 'out', out
print 'err', err
returncode = process.wait()
if returncode:
raise Exception(returncode, err)
else:
return out
答案 3 :(得分:0)
getstatusoutput
所做的是将stdout
和stderr
输出交错收集在一个变量中。这将非常密切地复制getstatusoutput
的实际行为在那些不存在的行为上getstatusoutput
并且整个commands
模块已完全在Python 3上删除了) ,除了换行符之外。结果数据位于bytes
。
def getstatusoutput(cmd):
subprocess.Popen(cmd, shell=True, stdout=subprocess.PIPE, stderr=subprocess.STDOUT)
out, _ = process.communicate()
if out[-1:] == b'\n':
out = out[:-1]
return (process.returncode, out)
此函数故意在Python 3上返回bytes
,因为Python 2版本返回str