防止Python脚本失败

防止Python脚本失败,python,try-catch,except,Python,Try Catch,Except,我有一个python脚本,它将在树莓上全天候运行至少五个月,如果出现任何问题,我将无法访问它来重新启动它。它使用各种库连接到sql数据库、无线RFID阅读器等 它基本上是几十行定义函数,通过usb/串行将raspberry连接到设备,然后是一个大的,而True:循环 我希望确保,如果发生错误,代码将继续运行(或重试,直到没有错误发生),并且不会被错误卡住。我已经读到我可以使用try:Except: 你有什么资源可以让我学习如何使python脚本防弹,或者如何做到这一点的想法吗?try是一个很好的

我有一个python脚本,它将在树莓上全天候运行至少五个月,如果出现任何问题,我将无法访问它来重新启动它。它使用各种库连接到sql数据库、无线RFID阅读器等

它基本上是几十行定义函数,通过usb/串行将raspberry连接到设备,然后是一个大的
,而True:
循环

我希望确保,如果发生错误,代码将继续运行(或重试,直到没有错误发生),并且不会被错误卡住。我已经读到我可以使用
try:Except:


你有什么资源可以让我学习如何使python脚本防弹,或者如何做到这一点的想法吗?

try
是一个很好的资源

这里,我尝试调用一个环境变量。如果未设置,我将尝试设置它。如果我不能设置它,我会让用户知道发生了什么,这样他们就不会害怕

试试看:
os.environ['R_HOME']
除:
打印(“”)
\u2717错误:R,`os.environ['R_HOME']`的默认Jupyter/Conda路径未定义,无法打印其路径。
这应该在运行Docker映像时设置,如下所示:
`-e R_HOME=/opt/conda/lib/R`
""")
尝试:
打印(“\u0009试图手动设置'os.environ['R_HOME']'”)
os.environ['R_HOME']='/opt/conda/lib/R'
除:
print(“\u0009未能设置'R_HOME',这不能是同时具有R和Python内核的conda管理的jupyter环境。”)
其他:
打印(“\u0009\u2713--'R\u HOME'现在是”`+os.environ['R\u HOME']+“`.”)
其他:
print(“\u0009\u2713--`rpy2`访问的Jupyter R环境的路径是”“+os.environ['R_HOME']+”“。\n”)

实际上,try:except:块应该可以,但需要注意的是,您应该确保在except:块中记录错误和堆栈跟踪;在您的情况下,这可能只是意味着要么打印到保存其输出的控制台,要么将日志保存到日志文件,或者让脚本向您发送电子邮件。例如:

导入回溯

try:
    #Code that may cause an exception.
except Exception as e:
    print(e)
    print(traceback.format_exec())

使用systemdmonitrunit注册它。这些是服务经理,当他们正在观看的程序死亡时,他们会注意到它的缺失,并使用您提供的命令行机制重新启动它。让您的头脑绕过它们可能有点棘手(并提供pid或其他方案来“签署”python脚本的存在),但这正是它们的设计目的。我自己也很喜欢runit,但systemd(可能很不幸)出现在大多数Linux发行版上

您所依赖的其他东西,不仅仅是脚本,也可能需要类似的监视,尽管通常情况下,数据库服务器从一开始就已经配置好了

过去,确保良好的编码卫生、质量和测试,在任何程序本身(用Python或其他语言)中解决您的需求类型,都是徒劳无益的、错误地令人放心的追求。高可用性机制依赖于辅助/主或同级系统,其中第二个程序重新启动第一个程序。而不是从你自己的编程技巧中“希望最好”

正如@Ondrej K也说过的,这最好留给您的发行版使用-init是另一个致力于此的框架。对于配置良好的Linux系统来说,五个月的正常运行时间是完全合理的期望。而且,正如他指出的,这些机制还包括系统重启

需要明确的是:您仍然需要确保您的程序在任何情况下都能自行处理—例如,如果程序遇到写入权限错误,循环重新启动将毫无帮助


另外,如果Pi是联网的,ssh在您需要访问它时可能会有所帮助。

没有办法,因为硬件可能会出现故障。这取决于您预期(并希望处理)的故障类型,但通常我会说您应该保留“保持活动”/“自动重新启动”/。。。而不是让发行版来处理它。启动流程,如果流程终止,则继续执行。根据您的init及其功能,您可能已经获得了该功能,只需注册另一个服务即可。这也可能涵盖正在进行电源循环的主机,而您在脚本本身中确实无法对其执行任何操作。