我收到一条消息说script xyz.py returned exit code 0
。这是什么意思?
Python中的退出代码是什么意思?那里有多少?哪些是重要的?
您正在寻找sys.exit()
脚本中的调用。该方法的参数作为退出代码返回给环境。
脚本很可能从不调用exit方法,而 0 是默认退出代码。
从文档中sys.exit
:
可选参数 arg 可以是给出退出状态的整数(默认为零),也可以是其他类型的对象。如果它是一个整数,则零被认为是“成功终止”,任何非零值都被 shell 等视为“异常终止”。大多数系统要求它在 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 系统上)找到的退出代码,但我不知道这是否是正确的做法。
作为记录,您可以使用此处定义的 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
有一个errno
定义标准退出代码的模块:
例如,Permission denied是错误代码13:
import errno, sys
if can_access_resource():
do_something()
else:
sys.exit(errno.EACCES)
退出代码 0 通常意味着“这里没有问题”。但是,如果脚本的程序员没有遵循约定,您可能必须查阅源代码以了解其含义。通常一个非零值作为错误代码返回。
答案是“取决于退出代码零的含义”。
但是,在大多数情况下,这意味着“一切正常”。
我喜欢 POSIX:
所以,在 shell 中,我会输入:
python script.py && echo 'OK' || echo 'Not OK'
如果我的 Python 脚本调用sys.exit(0)
,shell 返回“OK”
如果我的 Python 脚本调用sys.exit(1)
(或任何非零整数),shell 将返回“Not OK”。
您的工作是精通 shell,并阅读脚本的文档(或源代码)以了解退出代码的含义。
遵循Unix 退出代码 0 - 成功/正常,1 - 不成功/错误。您可以简单地使用exit(0)
或exit(1)
调用而不导入sys
模块。
如果您想便携地使用标准 POSIX 退出代码,请参阅exitstatus
PyPI 上的包。
安装包:
$ pip install exitstatus
在您的代码中使用:
import sys
from exitstatus import ExitStatus
sys.exit(ExitStatus.success)
操作系统命令具有退出代码。查找Linux 退出代码以查看有关此的一些材料。shell 使用退出代码来决定程序是否工作、有问题或失败。有一些努力来创建标准(或至少是常用的)退出代码。请参阅此Advanced Shell Script发布。
我建议使用内置的 exit(0) 彻底关闭,而不是使用 sys.exit()
我不确定这是否是个好建议。
提到的文档内容如下:
站点模块(在启动期间自动导入,除非给出 -S 命令行选项)将几个常量添加到内置命名空间。它们对交互式解释器 shell 很有用,不应在程序中使用。
然后:
退出(代码=无)
打印时打印消息的对象,例如“使用 quit() 或 Ctrl-D(即 EOF)退出”,并在调用时使用指定的退出代码引发 SystemExit。
如果我们将它与sys.exit()文档进行比较,它使用的机制与引发SystemExit
异常的机制相同。
退出代码仅具有脚本作者指定的含义。Unix 的传统是退出代码 0 表示“成功”,其他都是失败。确定给定脚本的退出代码含义的唯一方法是检查脚本本身。
许多编程语言的退出代码由程序员决定。所以你必须查看你的程序源代码(或手册)。零通常意味着“一切顺利”。
为了允许异常处理程序和其他事情执行,我建议使用内置的干净关闭exit(0)
而不是使用sys.exit()
它突然终止进程。