我收到一条消息,上面写着 脚本 xyz.py 返回退出码 0
。这是什么意思?
在 Python 中,退出码代表什么?有多少种退出码?哪些退出码比较重要?
sys.exit()
调用(exit()
调用sys.exit()
)。该方法的参数作为退出代码返回给环境。exit()
“内置”函数(实际上并非总是内置的;例如,当使用-S
开关运行Python时,它将不存在)是错误的解决方案;你需要使用sys.exit()
(它确实可以干净/一致地退出),而不是exit()
(工具可以用奇怪的东西替换它,而sys.exit
通常应该保持不变)。"不干净的退出"函数是os._exit()
,它会突然终止(主要用于在基于fork
的multiprocessing
场景中杀死工作进程,以避免调用父进程在fork
之前设置的清理操作)。 - ShadowRanger从sys.exit
的文档中得知:
可选参数arg可以是一个整数来表示退出状态(默认为0)或者其他类型的对象。如果它是一个整数,那么零被认为是“正常终止”,任何非零值则被认为是“异常终止”并且由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
个人而言,我尝试使用我在Linux系统上找到的/usr/include/asm-generic/errno.h
中的退出代码,但我不知道这是否正确。
1
退出,而当出现实际错误时则以 2
退出,感谢 Stallman。 - Cecil Curry记录一下,您可以使用在这里定义的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
模块定义了标准退出代码:
例如,权限被拒绝 的错误代码是13:
import errno, sys
if can_access_resource():
do_something()
else:
sys.exit(errno.EACCES)
errno
和errno.h中的错误代码是13,但在os
和sysexits.h中的退出状态码是77。发出前者的程序是非标准的(_de facto vel jure_),并且与正确期望后者的其他程序无法协同工作。 - Mark G.退出代码为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表示成功 / OK,1表示失败 / 错误。你可以直接使用exit(0)
或exit(1)
调用,而无需导入sys
模块。
exitstatus
包。$ pip install exitstatus
在你的代码中使用:
import sys
from exitstatus import ExitStatus
sys.exit(ExitStatus.success)
退出代码的含义仅由脚本作者指定。Unix传统是,退出代码0表示“成功”,其他任何代码都表示失败。要确定给定脚本的退出代码含义,唯一的方法是检查脚本本身。