279

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

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

4

13 回答 13

290

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

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

于 2008-11-12T20:50:48.060 回答
123

从文档中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 系统上)找到的退出代码,但我不知道这是否是正确的做法。

于 2008-11-12T21:31:23.093 回答
39

作为记录,您可以使用此处定义的 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
于 2015-06-11T08:53:44.873 回答
21

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

例如,Permission denied是错误代码13

import errno, sys

if can_access_resource():
    do_something()
else:
    sys.exit(errno.EACCES)
于 2008-11-13T07:32:08.153 回答
15

退出代码 0 通常意味着“这里没有问题”。但是,如果脚本的程序员没有遵循约定,您可能必须查阅源代码以了解其含义。通常一个非零值作为错误代码返回。

于 2008-11-12T20:46:28.643 回答
12

答案是“取决于退出代码零的含义”。

但是,在大多数情况下,这意味着“一切正常”。


我喜欢 POSIX:

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

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

如果我的 Python 脚本调用sys.exit(0),shell 返回“OK”

如果我的 Python 脚本调用sys.exit(1)(或任何非零整数),shell 将返回“Not OK”。

您的工作是精通 shell,并阅读脚本的文档(或源代码)以了解退出代码的含义。

于 2017-01-24T18:22:58.250 回答
9

遵循Unix 退出代码 0 - 成功/正常,1 - 不成功/错误。您可以简单地使用exit(0)exit(1)调用而不导入sys模块。

于 2020-07-02T12:06:31.807 回答
6

如果您想便携地使用标准 POSIX 退出代码,请参阅exitstatusPyPI 上的包。

安装包:

$ pip install exitstatus

在您的代码中使用:

import sys
from exitstatus import ExitStatus

sys.exit(ExitStatus.success)
于 2016-06-10T21:17:29.103 回答
5

操作系统命令具有退出代码。查找Linux 退出代码以查看有关此的一些材料。shell 使用退出代码来决定程序是否工作、有问题或失败。有一些努力来创建标准(或至少是常用的)退出代码。请参阅此Advanced Shell Script发布。

于 2008-11-12T23:12:15.247 回答
5

我建议使用内置的 exit(0) 彻底关闭,而不是使用 sys.exit()

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

提到的文档内容如下:

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

然后:

退出(代码=无)

打印时打印消息的对象,例如“使用 quit() 或 Ctrl-D(即 EOF)退出”,并在调用时使用指定的退出代码引发 SystemExit。

如果我们将它与sys.exit()文档进行比较,它使用的机制与引发SystemExit异常的机制相同。

于 2018-02-12T14:41:00.493 回答
4

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

于 2008-11-12T20:46:50.813 回答
2

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

于 2008-11-12T20:48:04.303 回答
-3

为了允许异常处理程序和其他事情执行,我建议使用内置的干净关闭exit(0)而不是使用sys.exit()它突然终止进程。

于 2017-03-10T13:12:44.133 回答