如果关闭或崩溃,则自动重启python

时间:2018-12-15 19:09:28

标签: python batch-file restart

我有3个python文件:1.py,2.py,3.py,并且我试图制作一个bat批处理文件,以防我的python文件由于某种原因被破坏或关闭时重新启动。 我正在尝试以下代码,但是效果不佳:

@echo off
:Restart
start "1" /wait "C:\Users\PC\Desktop\test\1.py"
start "2" /wait "C:\Users\PC\Desktop\test\2.py"
start "3" /wait "C:\Users\PC\Desktop\test\3.py"
goto Restart

我的目标是仅使用一个bat文件来自动重启我的3个文件,以防它们关闭或崩溃。 如果只有其中一个关闭,则仅重新启动,或者如果其中两个关闭,则重新启动,依此类推

1 个答案:

答案 0 :(得分:1)

我只是从另一个重复的问题(Batch that monitors and restarts a python)复制粘贴我的答案:

在我的情况下,需要“无限循环”和python文件的组合,这会使您的CPU超负荷。修改一段代码(仅适用于单个文件扩展名(*.bat, *.txt))。参见下文,了解更多一般信息。

@echo off
setlocal EnableExtensions

:start_python_files
start "1st" "test1.py"
start "2nd" "test2.py"
start "3rd" "test3.py"

:check_python_files
call:infinite 1st test1.py
call:infinite 2nd test2.py
call:infinite 3rd test3.py
goto:check_python_files

:infinite
tasklist /FI "WINDOWTITLE eq %1 - %2" | findstr /c:PID > nul
rem findstr /c:PID command added above to confirm that tasklist has found the process (errorlevel = 0). If not (errorlevel = 1).
if %errorlevel% EQU 1 (start "%1" "%2")

这种方法可能会持续一段时间,因此,如果文件被关闭(约2-3秒,具体取决于您的CPU过载)。

如果它不适合您,请通知我。我尚未安装python,也不知道打开它们时的命名方式:)。

因此,现在(如您所愿)要求您提供完整的答案,让我解释一下我的代码:

  • 我启用扩展程序(setlocal EnableExtensions)来更改call命令,如下所示:
  

CALL命令现在接受标签作为CALL的目标。语法   是:

     

CALL:标签参数

来自call /?命令。您应该在一个新的cmd中键入它以获得更多信息

  • 我使用start命令指定了窗口标题,因此我的代码可以使用。在新的cmd窗口中键入start /?

  • call子例程infinite向其发送参数(窗口标题和文件名)。可以使用%1(第一个参数)和%2(第二个参数)进行访问。

  • infinite子例程中,我搜索窗口标题(WINDOWTITLE)等于(eq)以格式化window title - filename。即使不存在,tasklist也会返回errorlevel0,并显示以下消息:

  

信息:没有运行符合指定条件的任务。

因为这里PID字符串不存在(如果找到,它将存在),我们将findstr进行搜索。如果找到,则errorlevel将是0。否则,它将是1

  • 如果errorlevel1,则表示未找到该进程,表示文件已关闭。因此,我们使用发送的参数(start "window title (%1)" "filename (%2)")重新打开它。

  • 当我们call子程序infinite结束后,我们将无限期地返回check_python_files子程序进行上述所有操作,直到用户终止或计算机关闭

如稍后在聊天中所讨论的,当我们标准地(使用start "window title"运行python文件时,窗口标题将是python.exe文件的完整路径。我找到了一种解决方法:start cmd /c命令。修改后的代码:

@echo off
setlocal EnableExtensions

:start_python_files
start "1st" "cmd /c test1.py"
start "2nd" "cmd /c test2.py"
start "3rd" "cmd /c test3.py"

:check_python_files
call:infinite 1st test1.py
call:infinite 2nd test2.py
call:infinite 3rd test3.py
goto:check_python_files

:infinite
tasklist /FI "WINDOWTITLE eq %1" | findstr /c:PID > nul
rem findstr /c:PID command added above to confirm that tasklist has found the process (errorlevel = 0). If not (errorlevel = 1).
if %errorlevel% EQU 1 (start "%1" "cmd /c %2")

我刚刚从窗口标题中仅添加了一个cmd /c附加项(并删除了%2),因为这是不必要的。

cmd /c告诉系统运行一个新的cmd,该cmd将执行字符串指定的命令,然后终止。

简介:

  1. 应该运行命令以获取有关其工作方式的更多信息

    • call /?
    • start /?
    • goto /?
    • tasklist /?
    • findstr /?
    • cmd /?

我建议在新的cmd窗口中运行以上命令。

  1. 一些有趣的参考

很抱歉让您陷入困境。无论如何,谢谢您为我提供了这么好的信息,以帮助我了解我哪里做错了。