如果 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)
,使用Popen
从subprocess
。在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 程序被杀死,则自动重新启动它的主要内容,如果未能解决你的问题,请参考以下文章