/ usr / bin目录中的Python可执行文件包含在sys.exit中

时间:2015-05-10 06:58:48

标签: python

两个代码段之间是否存在差异:

if __name__ == '__main__':
  sys.argv[0] = re.sub(r'(-script\.pyw|\.exe)?$', '', sys.argv[0])
  main()

Vs的

if __name__ == '__main__':
  sys.argv[0] = re.sub(r'(-script\.pyw|\.exe)?$', '', sys.argv[0])
  sys.exit(main())

我看到,我的ubuntu / usr / bin(或)/ usr / local / bin目录中的大多数python可执行文件都使用sys.exit。一旦函数返回,进程就不会停止。

为什么人们将其可执行函数包装在sys.exit中?

注意:此代码取自openstack-nova python客户端,此问题仅针对python的sys.exit而不是openstack内部。

2 个答案:

答案 0 :(得分:3)

sys.exit()可以将正确的退出代码传递给shell。如果您希望在(例如)错误身份验证,网络问题,损坏响应等情况下区分响应,则退出代码对此非常有用。

如果您不使用特定的sys.exit(value),则只有两个选项 - 成功(退出代码0)或抛出异常(退出代码1)。

答案 1 :(得分:2)

实际上有两种方法可以使用sys.exit,如文档中所述。

您的main成功时可返回0,错误时可返回1(或2-127中的任何其他数字);该号码将成为您计划的退出状态。 (数字2具有特殊含义;它表示失败是因为参数无效。如果一些参数解析库无法解析命令行,它们将自动sys.exit(2)。其他数字3-127所有意味着你想要的任何东西。)

或者您可以在成功时返回None,并在失败时返回字符串(或具有有用__str__方法的任何对象)。 None表示退出状态为0,其他任何内容都会print添加到stderr并退出状态为1。

过去传统的做法是使用第二种形式通过return "Failed to open file"函数中的main来表示失败,而文档仍然提到这样做,但它并不是很常见常见的;它可以轻松,更灵活地输出您想要的内容并返回您想要的数字。

如果你在没有sys.exit的情况下落到了剧本的末尾,那就相当于sys.exit(0);如果您通过异常退出,这相当于将追溯传递给sys.exit - 它会将追溯打印到stderr并以状态1退出。