我收到一条消息说script xyz.py returned exit code 0。这是什么意思?
script xyz.py returned exit code 0
Python中的退出码是什么意思?有多少个?哪些是重要的?
退出代码0通常表示“这里没有问题”。但是,如果脚本的程序员没有遵循约定,您可能需要参考源代码来了解它的含义。通常非零值作为错误代码返回。
退出码只有脚本作者指定的意义。Unix的传统是,退出码0表示“成功”,否则就是失败。要确定给定脚本的退出码意味着什么,唯一的方法是检查脚本本身。
在许多编程语言中,退出码由程序员决定。因此您必须查看您的程序源代码(或手册)。零通常表示“一切都很好”。
你在脚本中寻找对sys.exit()的调用。该方法的参数作为退出代码返回给环境。
sys.exit()
脚本很可能从未调用退出方法,而0是默认的退出代码。
来自sys.exit的文档:
sys.exit
可选参数arg可以是 给出退出状态的整数 (默认为0),或其他类型 的对象。如果是整数,则为零 被认为是"成功终止" 并且考虑任何非零值 “异常终止”由炮弹和 等等。大多数系统都需要它 在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系统上),但我不知道这是否是正确的事情。
/usr/include/asm-generic/errno.h
操作系统命令有退出码。寻找Linux退出码来查看一些关于这方面的材料。shell使用退出代码来决定程序是否工作、是否存在问题或是否失败。有一些努力来创建标准的(或者至少是常用的)退出码。请看这个高级Shell脚本帖子。
有一个errno模块定义了标准退出码:
errno
例如,没有权限是错误代码13:
import errno, sys if can_access_resource(): do_something() else: sys.exit(errno.EACCES)
为了记录,您可以使用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
如果你想可移植地使用标准POSIX退出码,请参阅PyPI上的exitstatus包。
exitstatus
安装包:
$ pip install exitstatus
在你的代码中使用:
import sys from exitstatus import ExitStatus sys.exit(ExitStatus.success)
答案是“取决于退出代码0的含义”。
然而,在大多数情况下,这意味着“一切都好”。
我喜欢POSIX:
因此,在shell中,我键入:
python script.py && echo 'OK' || echo 'Not OK'
如果我的Python脚本调用sys.exit(0), shell返回'OK'
sys.exit(0)
如果我的Python脚本调用sys.exit(1)(或任何非零整数),shell返回'Not OK'。
sys.exit(1)
巧妙地使用shell是您的工作,并阅读脚本的文档(或源代码)以了解退出代码的含义。
为了允许异常处理程序和其他事情执行,我建议使用内置的exit(0)干净地关闭,而不是使用sys.exit(),后者会突然终止进程。
exit(0)
我建议使用内置的exit(0)干净地关闭,而不是使用sys.exit()
我不确定这是不是一个好建议。
文档中提到的写道:
site模块(在启动过程中自动导入,除非给出了-S命令行选项)将几个常量添加到内置名称空间。它们对于交互式解释器shell和不应该在程序中使用非常有用。
然后:
退出(代码=没有) 对象,在打印时,打印类似“使用quit()或Ctrl-D(即EOF)退出”的消息,并在调用时引发带有指定退出码的SystemExit。
退出(代码=没有)
对象,在打印时,打印类似“使用quit()或Ctrl-D(即EOF)退出”的消息,并在调用时引发带有指定退出码的SystemExit。
如果我们将它与sys.exit ()文档进行比较,它使用的机制与引发SystemExit异常的机制相同。
SystemExit
继Unix退出码 0 -成功/ OK, 1 -非成功/错误。你可以简单地使用exit(0)或exit(1)调用,而不导入sys模块。
exit(1)
sys
Python的部分:
with open("error_code.log", 'w') as file: file.write('2') # this will trigger a warning
然后在yml文件中:
.step_name: variables: # my vars script: - python my_code.py arg1 arg2 - exit `cat error_code.log` allow_failure: exit_codes: - 2