python check_输出失败,退出状态为1,但Popen适用于同一命令

2024-09-27 09:31:38 发布

您现在位置:Python中文网/ 问答频道 /正文

用于标识Xcode是否在Mac上运行的命令:cmd = "ps -ax | grep -v grep | grep Xcode"

如果Xcode没有运行,那么上面的命令在subprocess模块的Popen方法中运行良好,但在check_output方法中引发CalledProcessError。我试图通过下面的代码检查stderr,但未能获得适当的信息来理解原因。

from subprocess import check_output, STDOUT, CalledProcessError

psCmd = "ps -ax | grep -v grep | grep Xcode"
o = None
try:
    o = check_output(psCmd, stderr=STDOUT, shell=True)
except CalledProcessError as ex:
    print 'Error:', ex, o

异常消息如下:

Error: Command 'ps -ax | grep -v grep | grep Xcode' returned non-zero exit status 1 None

问:为什么上面的命令对Popen有效,但对check_输出失败?

注意:如果Xcode正在运行,则命令对这两种方法都很有效。


Tags: 方法命令noneoutputcheckstderrstdoutax
3条回答

check_output()按预期工作。以下是它在Popen()方面的简化实现:

def check_output(cmd):
    process = Popen(cmd, stdout=PIPE)
    output = process.communicate()[0]
    if process.returncode != 0:
        raise CalledProcessError(process.returncode, cmd, output=output)
    return output

grep返回1如果它没有找到任何东西,也就是说,如果Xcode没有运行,应该会出现异常。

注意:如实现所示,即使发生异常,也可以获得输出:

#!/usr/bin/env python
from subprocess import check_output, STDOUT, CalledProcessError

cmd = "ps -ax | grep -v grep | grep Xcode"
try:
    o = check_output(cmd, stderr=STDOUT, shell=True)
    returncode = 0
except CalledProcessError as ex:
    o = ex.output
    returncode = ex.returncode
    if returncode != 1: # some other error happened
        raise

您可以使用pgrep -a Xcode命令代替(注意:以p开头)或使用psutil模块作为可移植代码:

#!/usr/bin/env python
import psutil # $ pip install psutil

print([p.as_dict() for p in psutil.process_iter() if 'Xcode' in p.name()])

在Python文档中:“如果返回代码为非零,则会引发一个CalledProcessError。”。这就是Xcode不运行时的情况;最后的grep Xcode以非零状态退出,因为grep找不到您要查找的字符串Xcode。因此,check_output()将引发异常。

顺便说一下,我是在the Python subprocess documentation找到这个的。

如果grep命令grep Xcode没有返回结果,那么该命令的returncode将是非零的,这就是为什么check_output调用CalledProcessError,这就是您在print命令的输出中看到的

若要获取命令的输出(无论是错误还是成功),请使用以下代码:

#!/usr/bin/python
from subprocess import check_output, STDOUT, CalledProcessError

psCmd = "ps -aef | grep -v grep | grep Xcode"
o = None
o = check_output(psCmd+";exit 0", stderr=STDOUT, shell=True)

check_output只在返回代码为0时显示命令的输出,否则它调用异常。

相关问题 更多 >

    热门问题