确保Python脚本即使在出错时也能持续运行的方法
我刚开始学习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服务来运行。如果是这样的话,有一些库可以帮你处理这些行为,然后你可以利用你平台自带的服务管理代码来重新启动程序,假如它意外退出的话。