因为commands模块从Python2.6开始就被弃用了,所以我正在寻找替代commands.getstatusoutput的最佳方法,它返回命令的返回代码和输出的元组。subprocess模块是相当明显的,然而,它并没有提供getstatusoutput的直接替代。在一个关于getstatusoutput的相关问题中讨论了一个潜在的解决方案--然而,我没有考虑重写原始函数(无论如何它的LOC值都少于10LOC),但我想知道是否有更直接的方法。
发布于 2012-07-05 22:05:46
没有直接的替代方法,因为commands.getstatusoutput是一个糟糕的API;它组合了stderr和stdout,没有提供单独检索它们的选项。
您应该使用的方便的API是subprocess.check_output,因为如果命令失败,它将抛出一个异常。
此外,subprocess没有提供在单个调用中检索输出和状态的方法,这似乎有点不足,但它很容易解决;以下是链接问题的答案:
def get_status_output(*args, **kwargs):
p = subprocess.Popen(*args, **kwargs)
stdout, stderr = p.communicate()
return p.returncode, stdout, stderr如果您希望stdout和stderr一起使用,请使用stderr=subprocess.STDOUT。
发布于 2013-04-03 00:53:59
getstatusoutput返回(来自Python3.1) :)参见:http://docs.python.org/3.3/library/subprocess.html#legacy-shell-invocation-functions
发布于 2014-05-03 22:00:06
从标题回答这个问题:这是一个基于asyncio的getstatusoutput()实现--它是code example from the docs that is modified to follow more closely subprocess.getstatusoutput() interface
import asyncio
import locale
from asyncio.subprocess import PIPE, STDOUT
@asyncio.coroutine
def getstatusoutput(cmd):
proc = yield from asyncio.create_subprocess_shell(cmd,
stdout=PIPE, stderr=STDOUT)
try:
stdout, _ = yield from proc.communicate()
except:
try:
proc.kill()
except ProcessLookupError: # process is already dead
pass
raise
finally:
exitcode = yield from proc.wait()
# return text
output = stdout.decode(locale.getpreferredencoding(False))
# universal newlines mode
output = output.replace("\r\n", "\n").replace("\r", "\n")
if output[-1:] == "\n": # remove a trailing newline
output = output[:-1]
return (exitcode, output)它可以在Windows和Unix上运行。要运行它(from the same example):
import os
from contextlib import closing
if os.name == 'nt': # Windows
loop = asyncio.ProactorEventLoop()
asyncio.set_event_loop(loop)
else:
loop = asyncio.get_event_loop()
with closing(loop):
coro = getstatusoutput('python -m platform')
exitcode, stdout = loop.run_until_complete(coro)
if exitcode == 0:
print("Platform:", stdout)
else:
print("Python failed with exit code %s: %s" % (exitcode, stdout))https://stackoverflow.com/questions/11344557
复制相似问题