【问题标题】:Python: get output from a command line which exits with nonzero exit codePython:从以非零退出代码退出的命令行获取输出
【发布时间】:2011-06-28 13:52:32
【问题描述】:

我在 Windows Server 2008 R2 x64 机器上使用 Python 2.7.1

我正在尝试获取命令行进程的输出,该进程在输出我需要的信息后给出非零退出状态。

我最初使用subprocess.check_output,并捕获了以非零退出状态发生的 CalledProcessError,但是当返回码存储在错误中时,没有输出显示这一点。

针对给出输出但退出状态为 0 的情况运行此程序可以正常工作,我可以使用 subprocess.check_output 获取输出。

我的假设是输出被写入 STDOUT,但异常从 STDERR 中提取其“输出”。我试图重新实现 check_output 的功能,但是当我相信我应该看到 STDOUT 和 STDERR 的输出时,我仍然没有得到任何输出。我当前的代码如下(其中“命令”是我正在运行的命令的全文,包括参数:

process = subprocess.Popen(command, stdout=subprocess.PIPE, 
stderr=subprocess.STDOUT, universal_newlines=True)
output = process.communicate()
retcode = process.poll()
if retcode:
    raise subprocess.CalledProcessError(retcode, image_check, output=output)
    return output 

这在变量输出中为我提供了以下信息:[('', None)]

我的subprocess.Popen 代码正确吗?

【问题讨论】:

  • .communicate()之后,你可以直接使用process.returncode而不是process.poll()
  • 如何使用 Python 从命令行获取输出:stackoverflow.com/a/20456745/445131

标签: python subprocess stdout windows-server-2008-r2 stderr


【解决方案1】:

这里有一个问题可能会打击你- http://bugs.python.org/issue9905

【讨论】:

    【解决方案2】:

    您的代码工作正常。事实证明,您正在调用的进程可能正在输出到 CON。看下面的例子

    import subprocess
    
    def check_output(command):
        process = subprocess.Popen(command, shell=True, stdout=subprocess.PIPE, stderr=subprocess.STDOUT, universal_newlines=True)
        output = process.communicate()
        retcode = process.poll()
        if retcode:
                raise subprocess.CalledProcessError(retcode, command, output=output[0])
        return output 
    
    command = "echo this>CON"
    
    print "subprocess -> " + subprocess.check_output(command, shell=True)
    print "native -> " + str(check_output(command))
    
    try:
        subprocess.check_output("python output.py", shell=True)
    except subprocess.CalledProcessError, e:
        print "subproces CalledProcessError.output = " + e.output
    
    try:
        check_output("python output.py")
    except subprocess.CalledProcessError, e:
        print "native CalledProcessError.output = " + e.output
    

    输出

    subprocess -> 
    native -> ('', None)
    stderr subproces CalledProcessError.output = stdout
    native CalledProcessError.output = stderr stdout
    

    很遗憾,我不知道如何解决这个问题。请注意,subprocess.check_output results 仅包含标准输出的输出。您的 check_output 替换将输出 stderr 和 stdout。

    在检查 subprocess.check_output 之后,它确实会生成一个 CalledProcessError,其输出仅包含标准输出。

    【讨论】:

    • 我很确定这就是它的发展方向。我能够与供应商取得联系,并发现了一些额外的未记录参数,这些参数阻止了非零退出状态的发生,所以我的脚本现在正在工作,尽管我仍然想知道如何从 CON 捕获输出。跨度>
    【解决方案3】:

    您是否尝试过 python 文档页面中提到的stderr=subprocess.STDOUT

    要同时捕获结果中的标准错误,请使用 stderr=subprocess.STDOUT:

    这是一个测试代码:

    import subprocess
    
    try:
        subprocess.check_output('>&2 echo "errrrr"; exit 1', shell=True)
    except subprocess.CalledProcessError as e:
        print 'e.output: ', e.output
    
    
    try:
        subprocess.check_output('>&2 echo "errrrr"; exit 1', shell=True, stderr=subprocess.STDOUT)
    except subprocess.CalledProcessError as e:
        print 'e.output: ', e.output
    

    输出:

    errrrr
    e.output:  
    e.output:  errrrr
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-10-28
      • 1970-01-01
      • 2020-10-25
      • 1970-01-01
      • 1970-01-01
      • 2020-07-21
      • 1970-01-01
      • 2018-11-04
      相关资源
      最近更新 更多