确保Python脚本即使在出错时也能持续运行的方法

0 投票
1 回答
1204 浏览
提问于 2025-04-20 13:47

我刚开始学习Python,正在做一个时间紧迫的项目,这个项目是个原型,我需要确保它能正常运行,不管出现什么错误。我写了一个Python脚本,它在某些输入下能正常工作,但有时候会失去连接,导致我的脚本因为错误而退出。我想找一个简单有效的方法,确保如果我的脚本退出了,它能自动重新执行。

我听说可以创建另一个Python脚本,使用subprocess.Popen()来调用我开发的那个脚本,但我不确定这是否是最好的方法,或者在代码中如何使用它来执行脚本,如果出现错误的话。

有没有人能告诉我最好的做法是什么?我知道能够处理每个错误是最理想的,但脚本退出的原因可能有很多,只要我重新运行脚本就能正常工作,因为我在一开始就初始化了所有内容。

1 个回答

0

其实你可以在现有的脚本里做一些简单的改动,来解决问题。

假设你现在的顶层代码是这样的:

def main(args):
    # etc.

if __name__ == '__main__':
    import sys
    sys.exit(main(sys.argv))

你可以把它改成这样:

def safe_main(args):
    try:
        main(args)
    except BaseException as e:
        print("I'm logging an exception and restarting: {!r}".format(e))

if __name__ == '__main__':
    import sys
    while True:
        safe_main(sys.argv)

不过,这种方法并不是在所有情况下都有效。如果你的脚本可能会出现崩溃(比如因为调用了不稳定的C语言异常),或者有其他进程会把它杀掉,而你希望它在这些情况下也能重启,那你就需要一个外部的包装程序。但对于大多数情况,这些问题并不会出现。

即使在这种情况下,通常还有比写一个包装脚本更简单、更可靠的选择。例如,你可能希望这个程序作为Unix守护进程、Mac的LaunchAgent或Windows服务来运行。如果是这样的话,有一些库可以帮你处理这些行为,然后你可以利用你平台自带的服务管理代码来重新启动程序,假如它意外退出的话。

撰写回答