Python中的退出代码

时间:2008-11-12 20:43:09

标签: python exit-code

我收到一条消息script xyz.py returned exit code 0。这是什么意思?

Python中的退出代码是什么意思?那里有多少?哪些是重要的?

13 个答案:

答案 0 :(得分:185)

您在脚本中寻找的是对sys.exit()的调用。该方法的参数作为退出代码返回到环境中。

脚本很可能永远不会调用exit方法,而0是默认的退出代码。

答案 1 :(得分:85)

来自the documentation for sys.exit

  

可选参数arg可以是   给出退出状态的整数   (默认为零)或其他类型   对象。如果是整数,则为零   被视为“成功终止”   并考虑任何非零值   贝壳和贝壳的“异常终止”   类似。大多数系统都需要它   在0-127范围内,并生产   否定未定义的结果。一些   系统有一个约定   指定具体含义   具体的退出代码,但这些是   一般不发达; Unix的   程序通常使用2作为命令   行语法错误和1为所有其他错误   一种错误。

使用退出代码的一个示例是shell脚本。在bash中,您可以检查特殊变量$?的最后退出状态:

me@mini:~$ python -c ""; echo $?
0
me@mini:~$ python -c "import sys; sys.exit(0)"; echo $?
0
me@mini:~$ python -c "import sys; sys.exit(43)"; echo $?
43

我个人尝试使用/usr/include/asm-generic/errno.h(在Linux系统上)找到的退出代码,但我不知道这是否正确。

答案 2 :(得分:24)

有一个errno模块定义标准退出代码:

例如,权限被拒绝是错误代码 13

import errno, sys

if can_access_resource():
    do_something()
else:
    sys.exit(errno.EACCES)

答案 3 :(得分:21)

对于记录,您可以使用定义here的POSIX标准退出代码。

示例:

import sys, os

try:
    config()
except:
    sys.exit(os.EX_CONFIG) 
try:
    do_stuff()
except:
    sys.exit(os.EX_SOFTWARE)
sys.exit(os.EX_OK) # code 0, all ok

答案 4 :(得分:14)

0的退出代码通常意味着“这里没有错”。但是,如果脚本的程序员不遵循惯例,您可能需要咨询源代码以了解其含义。通常会将非零值作为错误代码返回。

答案 5 :(得分:5)

操作系统命令具有退出代码。请查看linux exit codes以查看相关内容。 shell使用退出代码来确定程序是否有效,出现问题或失败。有一些努力来创建标准(或至少常用的)退出代码。请参阅此Advanced Shell Script发布。

答案 6 :(得分:5)

如果您想要移植standard POSIX exit codes,请参阅PyPI上的exitstatus包。

安装包:

pip install exitstatus

在您的代码中使用:

import sys
from exitstatus import ExitStatus

sys.exit(ExitStatus.success)

答案 7 :(得分:4)

退出代码仅具有脚本作者指定的含义。 Unix的传统是退出代码0意味着“成功”,其他任何东西都是失败的。确定给定脚本的退出代码的唯一方法是检查脚本本身。

答案 8 :(得分:4)

答案是"取决于退出代码零意味着"

但是,在大多数情况下,这意味着"一切都很好"

我喜欢POSIX:

所以,在shell上,我会输入:

python script.py && echo 'OK' || echo 'Not OK'

如果我的python脚本调用sys.exit(0),则shell返回' OK'

如果我的python脚本调用sys.exit(1)(或任何非零整数),则shell返回' Not OK'

您的工作是聪明地使用shell,并阅读脚本的文档(或源代码)以查看退出代码的含义。

答案 9 :(得分:3)

  

我建议使用内置的exit(0)而不是使用sys.exit()

进行干净关闭

我不确定这是不是一个好建议。

The very documentation mentioned读到:

  

站点模块(在启动期间自动导入,除非给出-S命令行选项),会向内置命名空间添加几个常量。它们对交互式解释器shell很有用,不应该在程序中使用

然后:

  

出口(代码=无)

     

打印时打印消息,如“使用退出()或Ctrl-D(即EOF)退出”,并在调用时,使用指定的退出代码提升SystemExit。

如果我们将其与sys.exit()文档进行比较,则会使用引发SystemExit例外的相同机制。

答案 10 :(得分:2)

许多编程语言中的退出代码取决于程序员。所以你必须查看你的程序源代码(或手册)。零通常意味着“一切都很顺利”。

答案 11 :(得分:1)

跟随unix exit codes 0 -成功/确定, 1 -不成功/错误。您可以简单地使用exit(0)exit(1)调用而无需导入sys模块。

答案 12 :(得分:0)

为了允许异常处理程序和其他东西执行,我建议使用exit(0)内置函数进行干净关闭,而不是使用 $response = $dynamodb->putItem([ .... .... 'Fruits' => ['SS' => $fruits] 突然终止进程。