如果关闭或崩溃,自动重启 python
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.py"
start "2" /wait "C:\Users\PC\Desktop\test.py"
start "3" /wait "C:\Users\PC\Desktop\test.py"
goto Restart
我的目标是,只要有一个 bat 文件,就可以自动重启我的 3 个文件中的任何一个,以防它们关闭或崩溃。
如果只有其中一个关闭,则只重启它,或者如果其中两个关闭,则重新启动两个,依此类推
我只是 copying-pasting 我对你另一个重复问题 (Batch that monitors and restarts a python) 的回答:
我认为您的情况需要 "infinite loop" 和 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 command now accepts labels as the target of the CALL. The syntax
is:
CALL :label arguments
来自 call /?
命令。您应该在新的 cmd 中键入它以获取更多信息
我用 start
命令指定了 window 标题,所以我的代码可以工作。在新的 cmd window.
中输入 start /?
I call
infinite
子例程向其发送参数(window 标题和文件名)。这些可以通过 %1
(第一个参数)和 %2
(第二个参数)访问。
在 infinite
子程序中,我搜索 window title (WINDOWTITLE
) EQUAL (eq
) 以格式化 window title - filename
.即使它不存在 tasklist
也会 return errorlevel
值 0
与消息:
INFO: No tasks are running which match the specified criteria.
因为这里PID
字符串不存在(如果找到就会存在),我们用findstr
来搜索。如果找到,errorlevel
将是 0
。否则,它将是 1
.
如果errorlevel
为1
,则表示未找到进程,即文件已关闭。因此,我们使用发送的参数 (start "window title (%1)" "filename (%2)"
).
重新打开它
因为我们已经 call
编辑了 infinite
子程序,在它结束后,我们将 return 到 check_python_files
子程序执行上述所有这些无限,直到用户终止或计算机关闭。
正如稍后在聊天中讨论的那样,当我们 运行 python 标准文件(使用 start "window title"
)时 window 标题将是 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")
我刚刚从 window 标题中添加了一个额外的 cmd /c
(并删除了 %2
),因为不需要它。
cmd /c
告诉系统 运行 一个新的 cmd 将执行字符串指定的命令,然后它会终止。
剧情简介:
命令应该是 运行 获取有关它们如何工作的更多信息:
call /?
start /?
goto /?
tasklist /?
findstr /?
cmd /?
我建议 运行 在一个全新的 cmd window 中执行以上操作 window。
一些有趣的参考文献:
真的很抱歉让你陷入这样的困境。不管怎样,谢谢你提供这么好的信息,让我明白我哪里错了。
我有 3 个 python 文件,1.py、2.py、3.py,我正在尝试制作一个 bat 批处理文件来重新启动我的 python 文件,以防它们因某种原因中断或关闭。 我正在尝试使用以下代码,但效果不是很好:
@echo off
:Restart
start "1" /wait "C:\Users\PC\Desktop\test.py"
start "2" /wait "C:\Users\PC\Desktop\test.py"
start "3" /wait "C:\Users\PC\Desktop\test.py"
goto Restart
我的目标是,只要有一个 bat 文件,就可以自动重启我的 3 个文件中的任何一个,以防它们关闭或崩溃。 如果只有其中一个关闭,则只重启它,或者如果其中两个关闭,则重新启动两个,依此类推
我只是 copying-pasting 我对你另一个重复问题 (Batch that monitors and restarts a python) 的回答:
我认为您的情况需要 "infinite loop" 和 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 command now accepts labels as the target of the CALL. The syntax is:
CALL :label arguments
来自 call /?
命令。您应该在新的 cmd 中键入它以获取更多信息
我用
start
命令指定了 window 标题,所以我的代码可以工作。在新的 cmd window. 中输入 I
call
infinite
子例程向其发送参数(window 标题和文件名)。这些可以通过%1
(第一个参数)和%2
(第二个参数)访问。在
infinite
子程序中,我搜索 window title (WINDOWTITLE
) EQUAL (eq
) 以格式化window title - filename
.即使它不存在tasklist
也会 returnerrorlevel
值0
与消息:
start /?
INFO: No tasks are running which match the specified criteria.
因为这里PID
字符串不存在(如果找到就会存在),我们用findstr
来搜索。如果找到,errorlevel
将是 0
。否则,它将是 1
.
如果
errorlevel
为1
,则表示未找到进程,即文件已关闭。因此,我们使用发送的参数 (start "window title (%1)" "filename (%2)"
). 重新打开它
因为我们已经
call
编辑了infinite
子程序,在它结束后,我们将 return 到check_python_files
子程序执行上述所有这些无限,直到用户终止或计算机关闭。
正如稍后在聊天中讨论的那样,当我们 运行 python 标准文件(使用 start "window title"
)时 window 标题将是 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")
我刚刚从 window 标题中添加了一个额外的 cmd /c
(并删除了 %2
),因为不需要它。
cmd /c
告诉系统 运行 一个新的 cmd 将执行字符串指定的命令,然后它会终止。
剧情简介:
命令应该是 运行 获取有关它们如何工作的更多信息:
call /?
start /?
goto /?
tasklist /?
findstr /?
cmd /?
我建议 运行 在一个全新的 cmd window 中执行以上操作 window。
一些有趣的参考文献:
真的很抱歉让你陷入这样的困境。不管怎样,谢谢你提供这么好的信息,让我明白我哪里错了。