获取命令的退出代码

Posted

技术标签:

【中文标题】获取命令的退出代码【英文标题】:Get exit code of a command 【发布时间】:2018-11-04 22:32:28 【问题描述】:

例如,我有一个命令 commandA,想在 commandA 执行后获取退出代码。 CommandA 预计会失败,所以我们应该得到的退出代码是 1。

如果我在终端中键入命令commandA;echo $?,屏幕上会显示一个 1。然而,当我用 python 做这件事时,事情就出错了。

我尝试用os.system(commandA)subprocess.call(commandA.split())调用commandA,然后调用os.popen('echo $?').read(),结果为0。

os.popen('commandA;echo $?').read() 给了我一个正确的结果,但是 commandA 的过程没有显示在屏幕上,这是我不希望发生的。

【问题讨论】:

重复:***.com/questions/1696998/… 您是否在命令行内联运行 Python 脚本? shell 解释器会扩展 $?早,在将字符串传递给 Python 之前。 $ python -c "import os; os.system('echo test; false; echo $?')" test 0$ python -c "import os; os.system('echo test; false; echo \$?')" test 1 【参考方案1】:

这有点取决于 python 版本。你可以这样做:

result=subprocess.check_output(['commandA'],Shell='True')

对于 3.x,您可以这样做:

result = subprocess.run(['ls', '-l'], stdout=subprocess.PIPE)

或者您可以使用 try catch 来仅查看错误。比如:

try:
    output = subprocess.check_output(["command"])
except subprocess.CalledProcessError as e:
    errorCode = e.returncode

【讨论】:

【参考方案2】:

subprocess.call直接返回退出码:

exit_code = subprocess.call(commandA.split())

您对echo $? 的尝试不起作用的原因是echo(通常)和$?(当然)都是shell 的构造,在Python 中不存在。

【讨论】:

哦!非常感谢!有用。那么python所做的不仅仅是将完全相同的命令复制到终端并调用它? 视情况而定。如果您传递一个字符串(只是commandA)并设置shell=True,那么Python 会将它发送到shell(通常是bash)。但是你也会在引用、空格、转义等方面遇到常见的 shell 问题,所以通常不建议这样做。另一方面,如果您将命令作为列表 (commandA.split()) 传递,则 Python 不使用 shell 并直接进入内核。 (终端只是在你的屏幕上显示程序输入/输出的程序,这里不进图。)

以上是关于获取命令的退出代码的主要内容,如果未能解决你的问题,请参考以下文章

如何在windows c++中的cmd中运行命令后获取退出代码

在命令行上完成机器人测试后如何获取退出代码或退出状态

Bash:如何在使用微调器时获取命令的退出代码?

在 Bash 和 KornShell (ksh) 中获取命令的退出代码

从 linux 的 powershell 调用命令获取退出代码

如果 errexit 打开,我如何运行可能失败的命令并获取其退出代码?