Самостоятельный перезапуск скрипта Python
Я создал сторожевой таймер для моего скрипта (Python 3), который позволяет мне остановить выполнение, если что-то пойдет не так (не показано в коде ниже). Однако я хотел бы иметь возможность автоматически перезапускать скрипт, используя только Python (без внешних скриптов). Код должен быть кросс-платформенным.
Я пробовал подпроцесс и execv (os.execv(sys.executable, ['python'] + sys.argv)
), однако я вижу очень странную функциональность в Windows. Я открываю командную строку и запускаю скрипт ("python myscript.py"). Сценарий останавливается, но не завершается (проверяется с помощью диспетчера задач), и он не будет перезапущен, пока я не нажму дважды клавишу ввода. Я хотел бы, чтобы это работало автоматически.
Какие-либо предложения? Спасибо за вашу помощь!
import threading
import time
import subprocess
import os
import sys
if __name__ == '__main__':
print("Starting thread list: " + str(threading.enumerate()))
for _ in range(3):
time.sleep(1)
print("Sleeping")
''' Attempt 1 with subprocess.Popen '''
# child = subprocess.Popen(['python',__file__], shell=True)
''' Attempt 2 with os.execv '''
args = sys.argv[:]
args.insert(0, sys.executable)
if sys.platform == 'win32':
args = ['"%s"' % arg for arg in args]
os.execv(sys.executable, args)
sys.exit()
1 ответ
Похоже, вы используете многопоточность в исходном сценарии, что объясняет, почему вы не можете разорвать исходный сценарий, просто нажав Ctrl+C. В этом случае вы можете добавить исключение KeyboardInterrupt к вашему сценарию, например так:
from time import sleep
def interrupt_this()
try:
while True:
sleep(0.02)
except KeyboardInterrupt as ex:
# handle all exit procedures and data cleaning
print("[*] Handling all exit procedures...")
После этого вы сможете автоматически перезапустить соответствующую процедуру (даже из самого скрипта, без каких-либо внешних скриптов). В любом случае, это трудно понять, не видя соответствующего сценария, так что, может быть, я могу помочь вам, если вы поделитесь некоторыми из них.