两个代码段之间是否存在差异:
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内部。
答案 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退出。