获取命令的退出代码

4
例如,我有一个命令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的过程没有显示在屏幕上,这就是我不希望发生的事情。

“subprocess.call()”函数的返回值是什么? - The Pjot
你是否在命令行上直接运行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。 - eel ghEEz
2个回答

10

subprocess.call 直接返回退出码:

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

你的尝试使用echo $?的原因是不起作用的,因为echo(通常)和$?(确切地说)都是shell的构造,而在Python中不存在。

哦!非常感谢,它有效了。那么 Python 所做的不仅仅是将完全相同的命令复制到终端并调用它吗? - Jieke Wei
这取决于具体情况。如果您传递一个字符串(只是commandA),并设置shell=True,那么Python会将其发送到shell(通常是bash)。但随之而来的是通常与shell相关的引号、空格、转义等问题,因此一般不建议这样做。另一方面,如果您将命令作为列表传递(commandA.split()),Python将不使用shell并直接转到内核。(_终端_只是显示程序输入/输出的程序,在这里并没有进入画面。) - Thomas

2

这取决于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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接