确保python脚本始终运行的方法,即使它出错也是如此

时间:2014-09-08 23:26:01

标签: python

我是Python的新手,有一个时间敏感的项目,也是一个原型,无论出现什么错误,我都需要确保它运行。我已经构建了一个python脚本,它可以工作并使用某些输入,这些输入有时会失去连接,从而导致我的脚本退出并出现错误。我想找到一种简单但有效的方法来确保如果退出我的脚本它可以再次自动执行。

我已经读过我可以创建另一个python脚本,它使用subprocess.Popen()来调用我开发的python脚本,但不确定这是否是最好的方法,或者在执行脚本时如何在代码中使用它它错了。

任何人都可以概述一下最好的方法吗?我知道能够处理每个错误是最好的,但是脚本退出可能有很多原因,如果我只是在我开始初始化所有内容后再次运行脚本,它就会起作用。

1 个答案:

答案 0 :(得分: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服务等运行。如果是这样,有些库可以为您包含适当的行为,然后您可以使用您的平台和#39;内置的服务管理代码,用于在程序退出时重新启动程序。