子进程无法成功重新启动目标 python 文件

subprocess can't successfully restart the targeted python file

我编写了一个程序 my_test.py 从 Web 获取数据并存储到 mysql。 但是程序my_test.py崩溃了很多(我的编程技术不好...)我试着监控它的状态并在崩溃时重新启动它。 我使用带有以下代码的子流程模块。

import subprocess
import time
p = subprocess.Popen(['python.exe', r'D:\my_test.py'], shell=True)
while True:
    try:
        stopped = p.poll()
    except:
        stopped = True
    if stopped:
        p = subprocess.Popen(['python.exe', r'D:\my_test.py'], shell=True)
    time.sleep(60)

但是当my_test.py崩溃时,跳出一个windows警告window提醒我my_test.py挂了,我会选择哪个动作:停止,调试。 .. 像那样的东西。 my_test.py 似乎被警报 windows 冻结了,上面的代码无法成功重启它。 只有当我通过选择 'close' 手动关闭 window 时,它才会重新启动。

是否有解决此问题的方法,使我的代码在出现故障时可以成功重启my_test.py

对于我糟糕的英语给您带来的不便,我们深表歉意,在此先感谢您的宝贵建议。

你的问题分为两部分:

  • 如何处理调试对话框。你可以试试这个:How do I disable the 'Debug / Close Application' dialog on Windows Vista?

  • 如何自动重启脚本

如何重启

优先顺序:

  1. 修复 my_test.py,以避免因已知问题导致崩溃
  2. 使用监督程序 运行 您的脚本,例如 upstartsupervisord -- 如果它崩溃,他们可以自动重启它
  3. 编写你自己的主管程序,你必须维护它自己的错误

如果您能找到适用于 Windows(upstartsupervisord不要在 Windows) 上工作。

您当前的主管脚本可以改进,以避免在程序崩溃后等待一分钟再重新启动,如果它已经 运行 已经超过一分钟:

#!/usr/bin/env python3
import sys
import subprocess
import time
try:
    from time import monotonic as timer
except ImportError:
    from time import time as timer # time() can be set back

while True:
    earliest_next_start = timer() + 60
    subprocess.call([sys.executable, r'D:\my_test.py'])
    while timer() < earliest_next_start:
        time.sleep(max(0, earliest_next_start - timer()))