Увы, под виндой достучаться до менеджера служб куда сложнее.
Вариант А: оформить бота как службу через утилиту вроде NSSM .
Тогда для перезапуска можно попробовать выполнить cmd.exe /C "net stop имя_твоей_службы && net start имя_твоей_службы"
Ну или закинуть эту строку в cmd-файл и запускать уже его. Но поскольку подкоманды restart нет, то я не знаю, доживёт ли твой скрипт до выполнения net start.
Вариант А2: то же самое, но использовать ctypes для обращения к Service Control Manager через WinAPI. Сразу скажу, это сложнее.
Вариант Б: Очень примитивный, но корявый способ - завернуть запуск бота в батник(cmd-файл), где запускать бота в вечном цикле с ожиданием, и перезапускать его, если бот завершился с ненулевым кодом завершения.
Что-то типа
:restart
python bot.py
IF ERRORLEVEL 1 GOTO restart
ERRORLEVEL проверяет, что код завершения больше или равен указанному.
Тогда, если надо завершить работу бота, делаешь sys.exit(0)
, а для перезапуска sys.exit(1)
. Бонус: бот также перезапустится при непойманном исключении.
Вариант В: Запустить скрипт бота напрямую, скажем, через os.startfile(sys.argv[0])
, и сразу же выйти самому. Но приведённый вариант не дружит с виртуальным окружением, так что может потребоваться модификация вроде os.startfile('/path/to/venv/python3', 'open', sys.argv[0])
. Если нужно ещё и параметры командной строки передать, дело усложняется.