Python 脚本 returns 代码 244 尽管 sys.exit() 代码不同

Python script returns code 244 despite different sys.exit() code

我正在尝试从使用 os.system 调用多个二进制文件的脚本中传递受控错误代码。然而,尽管检查了 os.system 返回的错误代码并捕获了异常,我还是得到了代码 244 以防任何二进制文件无法 运行.

import os, sys

try:
    error_code = os.system('mdkir')
    if error_code != 0:
        sys.exit(500) # Reaches here when running in Debug mode, as expected
    else:
        sys.exit(200)
except:
    sys.exit(500)

Process finished with exit code 244 # Why not 500? 

请建议如何正确执行此操作。此脚本将由基于 flask 的 Web 界面调用。

Linux 中的退出代码是 1 个字节或 8 位。

500 是 0b111110100,即 9 位。前导 1 被修剪以适合 8 位。

我们还剩下 0b11110100。那是 244.

事实上,return 数字有一个无符号短整型的大小,即 2 个字节。所以你可以设置的最大值是255.

如果您设置的值大于 255,python 将 return 您的值乘以 256 的模数。 500 % 256 = 244,这就是为什么 returns 244.

systemexit 是 C 库中一些最古老的 API 调用,它们的使用比严格定义的更进化。在我的系统上,C 调用都使用 64 位整数。 exit 屏蔽除最低 8 位以外的所有位,为您留下 256 个可能的 return 代码。 system 通过 shell 并且不同的 shell 以不同方式处理退出代码。在某些情况下,如果进程以信号结束,则代码将为 128 + 信号编号。在其他情况下,它将是 256 + 信号编号。

通常,您应该坚持使用退出代码 1 到 127。但是您可以将它们定义为任何您想要的。在您的情况下,您可以说退出代码 1 映射到 500,等等……对于其他感兴趣的事情。您最多可以传达 127 件事。它们不一定是错误,退出代码在几个成功案例之间可能不同,就像 HTTP 状态代码一样。