首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >替换Python 3中的getstatusoutput

替换Python 3中的getstatusoutput
EN

Stack Overflow用户
提问于 2012-07-05 20:40:33
回答 3查看 10.9K关注 0票数 14

因为commands模块从Python2.6开始就被弃用了,所以我正在寻找替代commands.getstatusoutput的最佳方法,它返回命令的返回代码和输出的元组。subprocess模块是相当明显的,然而,它并没有提供getstatusoutput的直接替代。在一个关于getstatusoutput的相关问题中讨论了一个潜在的解决方案--然而,我没有考虑重写原始函数(无论如何它的LOC值都少于10LOC),但我想知道是否有更直接的方法。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2012-07-05 22:05:46

没有直接的替代方法,因为commands.getstatusoutput是一个糟糕的API;它组合了stderr和stdout,没有提供单独检索它们的选项。

您应该使用的方便的API是subprocess.check_output,因为如果命令失败,它将抛出一个异常。

此外,subprocess没有提供在单个调用中检索输出和状态的方法,这似乎有点不足,但它很容易解决;以下是链接问题的答案:

代码语言:javascript
复制
def get_status_output(*args, **kwargs):
    p = subprocess.Popen(*args, **kwargs)
    stdout, stderr = p.communicate()
    return p.returncode, stdout, stderr

如果您希望stdoutstderr一起使用,请使用stderr=subprocess.STDOUT

票数 17
EN

Stack Overflow用户

发布于 2013-04-03 00:53:59

getstatusoutput返回(来自Python3.1) :)参见:http://docs.python.org/3.3/library/subprocess.html#legacy-shell-invocation-functions

票数 9
EN

Stack Overflow用户

发布于 2014-05-03 22:00:06

从标题回答这个问题:这是一个基于asyncio的getstatusoutput()实现--它是code example from the docs that is modified to follow more closely subprocess.getstatusoutput() interface

代码语言:javascript
复制
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):

代码语言:javascript
复制
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))
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/11344557

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档