Python中的退出代码

sun*_*eep 185 python exit-code

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

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

Dav*_*sta 205

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

脚本很可能永远不会调用exit方法,而0是默认的退出代码.

  • 根本不确定.在Unix/Linux中,标准是:在一切正常的情况下退出0.键入命令,然后回显$?:如果读取0,则返回没有错误.我们的想法是进行标准测试.如果代码xyz.py没有遇到任何错误,它应该返回0! (10认同)
  • 如果您想更改退出代码,更愿意使用内置的 exit 干净地退出,请参阅[此答案](http://stackoverflow.com/a/42719261/363437) (2认同)

Eig*_*gir 94

以下文档sys.exit:

可选参数arg可以是一个整数,给出退出状态(默认为零)或其他类型的对象.如果它是整数,则零被认为是"成功终止",并且任何非零值被贝壳等视为"异常终止".大多数系统要求它在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
Run Code Online (Sandbox Code Playgroud)

我个人尝试使用我在/usr/include/asm-generic/errno.h(在Linux系统上)找到的退出代码,但我不知道这是否正确.

  • errno.h通常用于函数调用退出代码.尝试标准化程序退出代码导致/usr/include/sysexits.h出现在大多数POSIX系统上. (9认同)
  • 从另一篇文章中我发现了这个链接:http://tldp.org/LDP/abs/html/exitcodes.html可能会有用.:) (3认同)
  • 很高兴知道“Unix 程序通常使用 2 来表示命令行语法错误”! (2认同)
  • @dantiston **同意。**顽固地染在羊毛中的Gentoo拥护者,但直到今天,我才知道……。(_我的耻辱现在结束了。非常感谢斯托曼。 (2认同)

Oli*_*Oli 27

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

例如,权限被拒绝是错误代码13:

import errno, sys

if can_access_resource():
    do_something()
else:
    sys.exit(errno.EACCES)
Run Code Online (Sandbox Code Playgroud)

  • 这是不正确的.这些errno不能用作进程退出代码.这些是用于程序内部使用的低级错误代码,特别是那些用C语言编写的代码.对于Python,尽可能使用异常. (32认同)
  • 抱歉,但我也对此投了反对票,因为它具有误导性。退出状态代码和错误号不可互换/互补。使用给定的示例,“权限被拒绝”的_错误代码_为 13(根据 `errno` 和 [errno.h](https://github.com/freebsd/freebsd/blob/master/sys/sys/errno.h) h#L51-L188)),但_退出状态代码_为 77(根据 `os` 和 [sysexits.h](https://github.com/freebsd/freebsd/blob/master/include/sysexits.h# L96-L116))。发出前者的程序是非标准的(_de facto vel jure_),并且不会与正确期望后者的其他程序很好地配合。 (3认同)
  • 你是对的.这些将在内部使用.但是您通常不会在最终用户级别引发异常.你使用sys.exit(x),x是你任意选择的整数.但是你可以使用那些以EX_开头并在'os'模块中定义的那些.像os.EX_OK或os.EX_IOERR (2认同)

laf*_*ste 24

对于记录,您可以使用此处定义的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
Run Code Online (Sandbox Code Playgroud)

  • 我以为你在开玩笑,帕维尔。事实上你不是在开玩笑:https://github.com/johnthagen/exitstatus/blob/master/exitstatus.py (8认同)
  • 该包的整体为 0 表示成功,1 表示失败。 (6认同)
  • 根据[docs](https://docs.python.org/3/library/os.html#process-management),这些仅在Unix操作系统上可用,因此它不是完全可移植的. (2认同)
  • 如果您想要可在所有操作系统上使用的可移植 POSIX 代码,请参阅 [`exitstatus`](https://pypi.org/project/exitstatus/) PyPI 包。 (2认同)

Sam*_*der 14

退出代码0通常意味着"这里没有错".但是,如果脚本的程序员不遵循惯例,您可能需要咨询源代码以了解它的含义.通常将非零值作为错误代码返回.


Har*_*lby 6

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


S.L*_*ott 5

操作系统命令具有退出代码.查找linux退出代码以查看有关此内容的一些材料.shell使用退出代码来确定程序是否有效,出现问题或失败.有一些努力来创建标准(或至少常用的)退出代码.请参阅此高级Shell脚本发布.


pho*_*nix 5

如果您想要可移植地使用标准POSIX退出代码,请参阅PyPI上的exitstatus包.

安装包:

pip install exitstatus
Run Code Online (Sandbox Code Playgroud)

在您的代码中使用:

import sys
from exitstatus import ExitStatus

sys.exit(ExitStatus.success)
Run Code Online (Sandbox Code Playgroud)


Fli*_*McF 5

答案是“取决于退出代码零是什么意思”

但是,在大多数情况下,这意味着“一切都很好”


我喜欢POSIX:

因此,在外壳上,我将输入:

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

如果我的python脚本调用,sys.exit(0)则外壳返回“ OK”

如果我的python脚本调用sys.exit(1)(或任何非零整数),则外壳程序返回“不正确”

了解外壳程序是您的工作,并阅读脚本的文档(或源代码)以了解退出代码的含义。

  • 为了完整起见,如果 Python 脚本引发错误或有语法错误,将打印“Not OK”。 (2认同)

小智 5

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

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

提到的文档内容如下:

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

然后:

退出(代码=无)

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

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


Luk*_*ski 5

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

  • exit 用于交互式 shell。sys.exit 用于脚本。另请参阅此答案:/sf/answers/455079411/ (6认同)