用于标识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正在运行,则命令对这两种方法都很有效。
check_output()
按预期工作。以下是它在Popen()
方面的简化实现:grep
返回1
如果它没有找到任何东西,也就是说,如果Xcode没有运行,应该会出现异常。注意:如实现所示,即使发生异常,也可以获得输出:
您可以使用
pgrep -a Xcode
命令代替(注意:以p
开头)或使用psutil
模块作为可移植代码:在Python文档中:“如果返回代码为非零,则会引发一个CalledProcessError。”。这就是Xcode不运行时的情况;最后的
grep Xcode
以非零状态退出,因为grep
找不到您要查找的字符串Xcode
。因此,check_output()
将引发异常。顺便说一下,我是在the Python subprocess documentation找到这个的。
如果grep命令
grep Xcode
没有返回结果,那么该命令的returncode
将是非零的,这就是为什么check_output
调用CalledProcessError
,这就是您在print
命令的输出中看到的若要获取命令的输出(无论是错误还是成功),请使用以下代码:
check_output只在返回代码为
0
时显示命令的输出,否则它调用异常。相关问题 更多 >
编程相关推荐