Закрытие программы после выполнения os.system

Пишу программу для ввода шифра в хомяке, после того как добавил рестарт при нажатии кнопки "R", программа просто перестает завершаться (просто висит disabling mode...). Если не делал рестарт все работает как обычно, но если был хотя бы 1 рестарт программа зависает на "Task completed: disabling mode...". Также можете подсказать как правильно перезапускать скрипт (я уверен, делать os.system("python имя_скрипта.py") и после quit() не лучший вариант)
Вот код: (сокращенный)

from sys import argv
if '-restart' not in argv: print(f'Starting utility "hamsterkombat cipher V1.6.5"...')

from config import *
from keyboard import add_hotkey
import pyautogui as pag
from time import sleep
from os import system

class Data:
    word = ''
    stop = False
data = Data() #global vars
if '-restart' not in argv: UNNECESSARY_DELAYS = False


def _long():
    pag.mouseDown()
    sleep(DELAY_IN_LONG_TAP)
    pag.mouseUp()

def short():
    pag.click()

def a():
    print('write A')
    short()
    sleep(DELAY_PER_CLICK)
    _long()
    sleep(DELAY_PER_LETTER)

def b():
    print('write B')
    _long()
    for i in range(3):
        sleep(DELAY_PER_CLICK)
        short()
    sleep(DELAY_PER_LETTER)

def c():
    print('write C')
    for i in range(2):
        sleep(DELAY_PER_CLICK)
        _long()
        sleep(DELAY_PER_CLICK)
        short()
    sleep(DELAY_PER_LETTER)
#и так далее до "z"

if UNNECESSARY_DELAYS:
    sleep(0.2)
if '-restart' not in argv: print('Started successfully.')
try:
    if "-c" not in argv:
        if '-g' in argv:
            print('Ignoring "-g" beacuse it is not supported in real-time mode.')
        if '-restart' not in argv: print('Real-time mode enabled.')
        add_hotkey('a', a)
        add_hotkey('b', b)
        add_hotkey('c', c)
        #и так далее до "z"
        
        while True:
            pass
        
    else:
        if '-restart' not in argv: print('Auto mode enabled.')
        try:
            data.word = argv[argv.index('-c') + 1]
            if data.word == '-g':
                raise IndexError
            if '-g' in argv:
                print('Ignoring "-g" flag because code already written.')
        except IndexError:
            if '-g' in argv:
                try:
                    from getcode import get_code
                    print('Starting get code from website.')
                    data.word = get_code()
                    print('Code from website:', data.word)
                    ans = input('Continue? (y/n)>').lower()
                    if ans == 'y' or ans == 'д' or ans == '1' or ans == 'yes' or ans == 'true':
                        print('Continuation...')
                    else:
                        print('Disabling mode; Cancellation... ')
                        if UNNECESSARY_DELAYS:
                            sleep(0.16)
                        print('Auto mode disabled.')
                        quit()
                except KeyboardInterrupt:
                    print('Auto mode disabled.')
                    if UNNECESSARY_DELAYS:
                        sleep(0.08)
                    print('Utility stopped by user.')
                    quit()
            else:
                print('Text not found. Try add text after "-c" or add "-g" flag to get code from website.')
                if UNNECESSARY_DELAYS:
                    sleep(0.08)
                if '-restart' not in argv: print('Auto mode disabled.')
                quit()
        
        if '-restart' not in argv: sleep(3)
        if '-restart' not in argv: print('Start writing text. Do not move your mouse')
        if RESTART_ON_KEY:
            def restart():
                data.stop = True
                print('Restarting...')
                system(f'python {argv[0]} -c {data.word} -restart')
                quit()
            add_hotkey(RESTART_ON_KEY_HOTKEY, restart)
        for _i in data.word:
            if _i == 'a': a()
            elif _i == 'b': b()
            elif _i == 'c': c()
            #и т.д. до "z"
            else:
                print('Error in letter "' + _i + '". Please check text that you write.')
                if not CONTINUE_IF_ERROR:
                    print('Disabling mode because "continuation if error" is False...')
                    if UNNECESSARY_DELAYS:
                        sleep(0.16)
                    if '-restart' not in argv: print('Auto mode disiabled.')
                    quit()
            sleep(DELAY_PER_LETTER)
            if data.stop:
                while True:
                    sleep(0.01)
        print('Task completed: disabling mode...')
        if UNNECESSARY_DELAYS:
            sleep(0.08)
        if '-restart' not in argv:
            print('Auto mode disabled.')
        quit()
    
except KeyboardInterrupt:
    if "-c" in argv:
        if '-restart' not in argv: print('Auto mode disabled.')
    else:
        print('Real-time mode disabled.')
    if UNNECESSARY_DELAYS:
        sleep(0.08)
    if '-restart' not in argv: print('Utility stopped by user.')
    quit()

Ответы (1 шт):

Автор решения: Qwertiy

я уверен, делать os.system("python имя_скрипта.py") и после quit() не лучший вариант

Ага, его надо делать до.

Только если есть какие-то межпроцессные блокировки (single insttance application, файлы, семафоры), то их надо отпустить ещё раньше.

Другой вариант - запускать какую-то промежуточную прогу и передавать ей id своего процесса. Она должна будет дождаться завершения процесса, запустить снова и завершиться сама.

→ Ссылка