【问题标题】: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 的过程没有显示在屏幕上,这是我不希望发生的。

【问题讨论】:

  • 您是否在命令行内联运行 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

标签: python subprocess os.system


【解决方案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 并直接进入内核。 (终端只是在你的屏幕上显示程序输入/输出的程序,这里不进图。)
    猜你喜欢
    • 2012-01-05
    • 2013-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-06-28
    • 2021-12-04
    • 1970-01-01
    • 1970-01-01
    • 2012-01-02
    相关资源
    最近更新 更多