Python中的退出码标准

12 投票
3 回答
5615 浏览
提问于 2025-04-16 19:55

在Python中(特别是Python的命令行工具),有没有什么固定的退出代码标准或者保留的退出代码呢?比如在UNIX平台上,C语言有一个叫做/usr/include/sysexits.h的文件,或者你可以查看这个链接http://tldp.org/LDP/abs/html/exitcodes.html,它是关于Bash脚本的退出代码的。

3 个回答

1

os模块提供了一些可以使用的退出代码常量。

sys.exit(os.EX_OK)
sys.exit(os.EX_USAGE)

关于可移植性

虽然退出代码很有用,但它们可能会带来可移植性的问题。文档中提醒:

注意:这些代码在所有Unix平台上可能并不都可用,因为不同平台之间会有一些差异。这些常量的定义取决于底层平台。

所以,如果你想使用退出代码,并且你的代码需要在不同环境中都能运行,你就得多做一些错误检查。sys.exit()的文档建议在失败时使用字符串错误信息或者整数1。

import os
import sys

try:
    subcommand = sys.argv[1]
except IndexError:
    try:
        sys.exit(os.EX_USAGE)
    except AttributeError:
        sys.exit("missing argument: subcommand")

对于成功退出:

import os
import sys

subcommand = sys.argv[1]

if subcommand == 'noop':
    try:
        sys.exit(os.EX_OK)
    except:
        sys.exit()

print(subcommand)

考虑到退出代码带来的额外复杂性,如果你并不真的需要它们,可能可以选择不使用。

2

可以查看关于 sys.exit() 的文档

这个可选的参数 arg 可以是一个整数,用来表示退出状态(默认是零),也可以是其他类型的对象。如果是整数,零表示“正常结束”,而任何非零的值则被认为是“异常结束”,这在命令行等环境中都是这样理解的。大多数系统要求这个值在 0 到 127 之间,超出这个范围可能会产生不确定的结果。有些系统会为特定的退出代码赋予特定的含义,但这些通常没有统一标准;例如,Unix 系统通常用 2 来表示命令行语法错误,用 1 来表示其他类型的错误。

18

如果你在一个POSIX平台上,你可以通过os模块来访问sysexit.h中的常量:

>>> import os
>>> os.EX_ <tab pressed>
os.EX_CANTCREAT    os.EX_NOHOST       os.EX_OK           os.EX_SOFTWARE
os.EX_CONFIG       os.EX_NOINPUT      os.EX_OSERR        os.EX_TEMPFAIL
os.EX_DATAERR      os.EX_NOPERM       os.EX_OSFILE       os.EX_UNAVAILABLE
os.EX_IOERR        os.EX_NOUSER       os.EX_PROTOCOL     os.EX_USAGE

撰写回答