【问题标题】:Python - subprocess - getstatusoutputPython - 子进程 - getstatusoutput
【发布时间】:2014-01-07 22:49:54
【问题描述】:

我也是 Python 和编程的新手。我从 Google 的 python 类中知道如何使用以下命令运行外部命令:

(状态,输出)= commands.getstatusoutput(cmd)
if status: ## 错误情况,将命令的输出打印到 stderr 并退出
sys.stderr.write(输出)
sys.exit(1)

但我认为 commands 模块已经过时了。我想要状态和输出,所以如果有任何错误,我可以使用 sys.stderr.write() 打印输出。那么,subprocess 模块中是否有任何等效的命令?我目前正在使用:

subprocess.call(args,shell=False) 现在。

谢谢!

【问题讨论】:

  • subprocess.check_outputtry 块中将是最接近的等价物。

标签: python subprocess output


【解决方案1】:

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

【讨论】:

  • 如果子进程生成足够的输出来填充 stderr 的操作系统管道缓冲区,您的代码就会死锁。
【解决方案2】:

也可以这样做,代码少一点

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

【讨论】:

    【解决方案3】:

    getstatusoutput 所做的是将stdoutstderr 输出交错在一个变量中。这将非常接近地复制 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

    【讨论】:

    【解决方案4】:

    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
    

    两者都返回与原始commands.getstatusoutput() 不同的status。见Python Issue: Document & unittest the subprocess.getstatusoutput() status value

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-04-29
      • 2014-09-19
      • 1970-01-01
      • 2010-11-17
      • 1970-01-01
      • 1970-01-01
      • 2019-05-06
      相关资源
      最近更新 更多