Python 3.x 替换Python 3中的getstatusoutput

Python 3.x 替换Python 3中的getstatusoutput,python-3.x,python,Python 3.x,Python,自从Python 2.6以来,commands模块就被弃用了,因此我正在研究最好的替换方法,它返回命令的返回代码和输出的元组。该模块非常明显,但是,它不提供getstatusoutput的直接替代品。一个潜在的解决方案在一个相关的问题中进行了讨论-但是,我不打算重写原始函数(它的LOC数至少少于10),但想知道是否有更直接的方法。没有直接替换,因为commands.getstatusoutput是一个糟糕的API;它结合了stderr和stdout,而不提供单独检索它们的选项 您应该使用的方便A

自从Python 2.6以来,commands模块就被弃用了,因此我正在研究最好的替换方法,它返回命令的返回代码和输出的元组。该模块非常明显,但是,它不提供getstatusoutput的直接替代品。一个潜在的解决方案在一个相关的问题中进行了讨论-但是,我不打算重写原始函数(它的LOC数至少少于10),但想知道是否有更直接的方法。

没有直接替换,因为
commands.getstatusoutput
是一个糟糕的API;它结合了stderr和stdout,而不提供单独检索它们的选项

您应该使用的方便API是
子流程。请检查\u output
,因为如果命令失败,它将引发异常

否则,
子流程
不提供在单个调用中检索输出和状态的方法,但这很容易解决,这确实有点缺陷;以下是链接问题的答案:

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
getstatusoutput回来了(来自python 3.1):)请参阅:

回答标题中的问题:这是基于异步的
getstatusoutput()
实现——它是:

它可以在Windows和Unix上运行。要运行它():


你读了那个问题的答案了吗?Pythonic解决方案是使用
Popen.communication
,然后读取
Popen.statuscode
。不过,这将在单独的字符串中提供stdout和stderr。是的,但正如我所说的,我不打算重写commands模块的函数。最初的函数只是简单地使用os.popen,然后读取并关闭管道。这也是建议的新版本所做的(一旦修复,答案中所写的内容)。然而,我希望在标准库中有任何类似于该函数的东西,并且必须维护我自己的替换。谢谢你的回答,它基本上告诉了我我需要知道的。只是一个提示:“communicate()返回一个元组(stdout,stderr)”,不过我不会使用它,至少在Python3.6中它又消失了。4@radtek
导入子流程;subprocess.getstatusoutput(“echo a”)
仍然适用于我(Python 3.6.4 | Anaconda)。问题是关于
导入命令
,就像在
命令中一样。getstatusoutput
,已经不存在了。
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)
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))