Закрытие программы после выполнения 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 шт):
я уверен, делать
os.system("python имя_скрипта.py")
и послеquit()
не лучший вариант
Ага, его надо делать до.
Только если есть какие-то межпроцессные блокировки (single insttance application, файлы, семафоры), то их надо отпустить ещё раньше.
Другой вариант - запускать какую-то промежуточную прогу и передавать ей id своего процесса. Она должна будет дождаться завершения процесса, запустить снова и завершиться сама.