Python:显式退出和简单地让执行到达文件末尾有啥区别?

Posted

技术标签:

【中文标题】Python:显式退出和简单地让执行到达文件末尾有啥区别?【英文标题】:Python: what is the difference between an explicit exit and simply letting execution reach the end of the file?Python:显式退出和简单地让执行到达文件末尾有什么区别? 【发布时间】:2018-01-18 20:06:22 【问题描述】:

对于一个不启动任何线程或派生任何进程的简单 python 脚本,简单地让执行到达脚本末尾与显式调用 quit()、exit() 或 sys.exit() 有什么区别?

即有什么区别

def main():
    # do some stuff
    print("Done doing stuff")

if __name__ == '__main__':
    main()

import sys

def main():
    # do some stuff
    print("Done doing stuff")
    # explicit exit
    sys.exit()

if __name__ == '__main__':
    main()

我之所以问这个问题是因为我在脚本终止时遇到了一些奇怪的垃圾收集问题(从 __del__ 引发的异常显然是由于清理事物的顺序)而没有明确的 exit() 调用,并添加明确的exit() 似乎可以纠正这些问题。或者至少在调用exit() 之后没有打印出这些异常,也许它们只是被静音了。

【问题讨论】:

据我所知,sys.exit() 允许“finally”子句,其中构建了清理功能,一些 try 块通过引发异常来激活,从而提供“清理器”退出。 docs.python.org/3/library/sys.html#sys.exit "这是通过引发 SystemExit 异常来实现的,因此由 try 语句的 finally 子句指定的清理操作将得到尊重"。另一个有趣的注释是清理时捕获的缓冲错误,这导致退出代码变为 120 我相信这应该回答你的问题:***.com/questions/19747371/… 所以如果我真的想正常退出,我必须捕获所有异常,手动打印堆栈跟踪,然后调用sys.exit()? 【参考方案1】:

在您发布的情况下,没有区别。但在某些情况下,您可能希望在不等待程序完成的情况下终止程序。

一个平庸的例子:

try:
    ...
except KeyboardInterrupt:
    x = input('Sure you want to exit? y/n')
    if x == 'y':
        quit()
    else:
        pass

【讨论】:

存在一些差异,因为我在某些实例化对象中的 __del__ 中出现异常,这是由于我 时 python 清理事物的顺序显式调用exit()sys.exit() 那你能贴出实际的代码吗?很难看出与您的 sn-p 有何不同。 我现在没有一个好的、可移植的最小示例,因为它涉及 python-ivi、pyvisa、NI-VISA 以及与实际测试设备的开放连接。 我看到的异常是由于一个对象(pyvisa 资源管理器实例)在另一个对象(pyvisa 资源实例)之前被删除......但问题是我不知道为什么 python 是当资源实例有对资源管理器的引用时,首先删除资源管理器实例。显式调用exit() 似乎可以使其正常工作,因此为了进一步调试,我需要更多地了解调用exit() 和不调用exit() 之间的区别,因为这似乎对python 的清理方式有一些影响.

以上是关于Python:显式退出和简单地让执行到达文件末尾有啥区别?的主要内容,如果未能解决你的问题,请参考以下文章

SQL 命令在到达大型 csv 文件末尾之前终止

ifstream.eof() - 在真正结束之前到达文件末尾

在 C# 中使用 ReadBlock 方法时,如何判断何时到达文件末尾?

在一个简单的 jquery 幻灯片放映中,我的班级到达图像的末尾,然后从 DOM 的边缘掉下来

保存设计用户时Rails EOFError(到达文件末尾)

EOFError: 文件末尾到达 Net::HTTP 问题