如果 Python 程序被杀死,则自动重新启动它

Posted

技术标签:

【中文标题】如果 Python 程序被杀死,则自动重新启动它【英文标题】:Automatically restart a Python program if it's killed 【发布时间】:2017-10-22 02:00:43 【问题描述】:

我运行一个 Python Discord 机器人。我导入了一些模块并有一些事件。有时,脚本似乎因某种未知原因而被杀死。也许是因为错误/异常或某些连接问题?我不是 Python 专家,但我设法让我的机器人工作得很好,我只是不完全理解它是如何工作的(因为程序除了等待事件之外什么都不做)。无论哪种方式,我都希望它在停止后自动重新启动。

我使用 Windows 10,如果我不想要该窗口,只需双击它或通过 pythonw.exe 启动我的程序。验证我的程序是否仍在运行的最佳方法是什么(它不必是即时的,可以每 X 分钟进行一次验证)?我想过使用批处理文件或其他 Python 脚本,但我不知道该怎么做。

感谢您的帮助。

【问题讨论】:

也许您可以编写一个脚本,每分钟检查您的脚本是否正在运行,如果没有则重新启动它?只是一个快速的想法。 @creyD 是的。这样做的最佳方法是什么?我应该使用 Python、批处理还是其他方式?如果您认为 Python 是最好的方法,那至少会为我指明一个进一步过滤搜索的方向(因为我没有对 Python 中的 OS 库进行太多实验)。 我猜@Gahan 也回答了你的问题。我会为该任务编写一个简单的批处理脚本。您甚至可以使用 windows 启动此脚本,因此即使您的系统出现故障,它也会重新启动。 atexit 不是最简单的选择吗? @WhatsThePoint 我想这取决于脚本是如何结束的,我现在并不完全知道。我认为这可能是我遇到互联网连接问题时,可能来自 discord.py API,但我非常不确定,因为我对 Python 的了解非常有限。如果脚本完全被杀死(例如,我打开任务管理器并杀死它),我认为 atexit 不会起作用。 【参考方案1】:

你可以写另一个python code (B)来调用你原来的python code (A),使用Popensubprocess。在python code (B) 中,要求程序wait 为您的python code (A)。如果'A'error code 退出,则recall 来自B

我提供了一个 python_code_B.py 的例子

import subprocess

filename = 'my_python_code_A.py'
while True:
    """However, you should be careful with the '.wait()'"""
    p = subprocess.Popen('python '+filename, shell=True).wait()

    """#if your there is an error from running 'my_python_code_A.py', 
    the while loop will be repeated, 
    otherwise the program will break from the loop"""
    if p != 0:
        continue
    else:
        break

这通常在 Unix / Windows 系统上运行良好。在最新代码更新的 Win7/10 上测试。

另外,请从“真实终端”运行 python_code_B.py,这意味着从命令提示符或终端运行,而不是在 IDLE 中运行。

【讨论】:

谢谢,我会进一步研究 subprocess 和 popen,总体上看起来很简单。 感谢您的编辑,这正是我想要的。我在玩***.com/questions/325463/…。 我很高兴我的例子很有帮助 我会让它运行几天,看看它是否提高了稳定性。如果是这样,我将改进它以管理返回代码,因为在没有任何验证的情况下,如果我在 A 脚本中出现语法错误,B 脚本将尝试每秒启动 A 数百次。 另外,从 cmd.exe 运行 B 脚本而不是直接用 Windows 启动它有什么影响?询问您是否建议使用终端(我猜您的意思是 cmd 在 Windows 中)。将来我可能想在 Windows 中将 pythonw.exe 与计划任务一起使用,以使其更加透明......【参考方案2】:

对于您所说的问题,我更喜欢使用 python subprocess 调用来重新运行 python 脚本或使用 try blocks。 这可能对您有帮助。 检查此示例尝试块代码:

try:
  import xyz # consider it is not exist or any error code
except:
  pass # go to next line of code to execute

【讨论】:

您愿意详细说明 try 块吗?例如,如果程序被杀死,它应该如何通过 try 块?另外,我确实了解基本语法并且可以实现它,但是我应该在我的所有事件中添加 try 块吗?我应该准确检查什么?至于子流程,我还没有读到,所以我现在就写,谢谢。 或者 try 块应该在另一个程序中,该程序仅用作启动器并在程序停止时触发异常? 在 try 块中写入您的代码,如果它无法执行它会转到除了块,您还可以在该块中编写替代代码,或者如果您想跳过它,您可以在该代码中写入 pass 假设您没有模块名称 XYZ,如果您正常导入它,它会给您导入错误,但您可以在 try 块中将其写为:try: import XYZ except: pass

以上是关于如果 Python 程序被杀死,则自动重新启动它的主要内容,如果未能解决你的问题,请参考以下文章

Android:如果任务管理器杀死,则重新调用应用程序

在应用程序被杀死并重新启动后,Android 应用程序黑暗主题消失了

应用程序被杀死时Android后台服务正在重新启动

iOS 应用程序被杀死并重新启动显示我的最后一个 VC

从后台被杀死的应用程序中恢复 - 重新启动时调用哪些方法?

监控程序崩溃