[英]Automatically restart a python if it closes or crashes
我有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个文件,以防它们关闭或崩溃。 如果其中只有一个已关闭,则仅重新启动,或者如果其中两个已关闭,则都重新启动,依此类推
我只是从另一个重复的问题( 监视并重新启动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
命令指定了窗口标题,因此我的代码可以使用。 键入start /?
在新的cmd窗口中。
我call
向其发送参数(窗口标题和文件名)的infinite
子例程。 可以使用%1
(第一个参数)和%2
(第二个参数)进行访问。
在infinite
子例程中,我搜索窗口标题( WINDOWTITLE
)EQUAL( eq
)以格式化window title - filename
WINDOWTITLE
。 即使它不存在, tasklist
也会通过以下消息返回错误errorlevel
值为0
:
信息:没有运行符合指定条件的任务。
由于此处PID
字符串不存在(如果找到,它将存在),因此我们使用findstr
搜索它。 如果找到,则errorlevel
将为0
。 否则,将为1
。
如果错误errorlevel
为1
,则意味着未找到该进程,这意味着该文件已关闭。 因此,我们使用发送的参数重新打开它( start "window title (%1)" "filename (%2)"
)。
正如我们call
ed infinite
子例程一样,在它结束后,我们将check_python_files
返回check_python_files
子例程,直到用户终止或关闭计算机为止。
如稍后在聊天中所讨论的,当我们以标准方式运行python文件(以start "window title"
)时,窗口标题将是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,它将执行string指定的命令,然后终止。
概要:
应该运行命令以获取有关其工作方式的更多信息 :
call /?
start /?
goto /?
tasklist /?
findstr /?
cmd /?
我建议在新的cmd窗口中运行以上命令。
非常抱歉让您陷入困境。 无论如何,谢谢您为我提供了这么好的信息,以帮助我了解我错了。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.