获取命令的退出代码
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 和 KornShell (ksh) 中获取命令的退出代码