Автоматический перезапуск питона, если он закрывается или падает - PullRequest
0 голосов
/ 15 декабря 2018

У меня есть 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 голосов
/ 17 декабря 2018

Я просто копирую и вставляю свой ответ из вашего другого дублирующего вопроса ( Пакет, который отслеживает и перезапускает питона ):

Комбинация "бесконечного цикла", которая необходима вя думаю, что ваши файлы case и python будут сильно перегружать ваш процессор.Есть исправленный кусок кода (работает только с расширениями одного файла (*.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 секунды в зависимости от перегрузки вашего процессора).

Пожалуйста, сообщите мне, если это не работает для вас.У меня не установлен python, и я не знаю, как они называются, когда они открываются:).

Итак, теперь, когда вы (любезно ???) запросили полные ответы, позвольте мне объяснить мой код:

  • Я включаю расширения (setlocal EnableExtensions) для изменения команды call следующим образом:

Команда CALL теперь принимает метки в качестве цели CALL.Синтаксис:

CALL: метка аргументов

Из команды call /?.Вы должны ввести его в новом cmd для получения дополнительной информации

  • Я указываю заголовок окна с помощью команды start, поэтому мой код будет работать.Введите start /? в новом окне cmd.

  • I call подпрограмма infinite, отправляющая ей аргументы (заголовок окна и имя файла).Доступ к ним можно получить с помощью %1 (первый аргумент) и %2 (второй аргумент).

  • В подпрограмме infinite я ищу заголовок окна (WINDOWTITLE)РАВНО (eq) для форматирования window title - filename.Даже если он не существует, tasklist вернет errorlevel значение 0 с сообщением:

ИНФОРМАЦИЯ: Нет запущенных задач, соответствующих заданным критериям.

Поскольку здесь PID строка не существует (если она будет найдена, она будет существовать), мы ставим findstr, чтобы найти ее.Если найдено, errorlevel будет 0.Иначе, это будет 1.

  • Если errorlevel равно 1, это означает, что процесс не найден, что означает, что файл закрыт.Итак, мы снова открываем его с отправленными аргументами (start "window title (%1)" "filename (%2)").

  • Поскольку мы call отредактировали подпрограмму infinite, после ее завершения мы вернемся к 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, который будет выполнять команду, указанную в строке, а затем завершится.

Сводка:

  1. Команды должны быть запущены дляполучить больше информации о том, как они работают :

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

Я предлагаю запустить вышеуказанное в новом новом окне cmd.

Несколько интересных ссылок :

Мне очень жаль, что я попал в этот беспорядок.В любом случае, спасибо, что предоставили мне такую ​​полезную информацию, чтобы понять, где я был не прав.

...