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

Я пытаюсь создать пакет, который перезапускает мои файлы Python, когда любой из них закрывается или падает, с помощью следующей команды:

@echo off
:a
cd C:\Users\PC\Desktop\testfolder
test1.py
test2.py
test2.py
goto a

, но она не работает, что мне делать?

1 Ответ

0 голосов
/ 17 декабря 2018

Комбинация "бесконечного цикла", которая необходима в вашем случае, и файлы 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.

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

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

...