繁体   English   中英

如果关闭或崩溃,则自动重启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\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

  • 如果错误errorlevel1 ,则意味着未找到该进程,这意味着该文件已关闭。 因此,我们使用发送的参数重新打开它( 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指定的命令,然后终止。

概要:

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

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

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

  1. 一些有趣的参考

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM