Как перезапустить программу в python
Перейти к содержимому

Как перезапустить программу в python

  • автор:

Как сделать перезапуск Python программы?

Я ещё только учу Python. Написал для себя маленькую программу, что-то вроде конвертера валют, только для игры. Через PyInstaller сделал exe программы, но после вывода результата окно сразу закрывается. как сделать, что бы окно не закрывалось и была возможность начать заново, что бы для каждого расчёта не запускать программу по новой?

currency = float(input("Введите количество валюты: ")) price = float(input("Введите цену валюты: ")) total = currency * price x = currency * price while int(x) < total: currency = currency - 1 total = currency * price print("Вы получите", int(total + price), "хаосов за", int(currency + 1)) 

Отслеживать
задан 12 апр 2020 в 7:50
Иван Сушкин Иван Сушкин
33 1 1 золотой знак 1 1 серебряный знак 3 3 бронзовых знака

2 ответа 2

Сортировка: Сброс на вариант по умолчанию

Самое простое - обернуть всю логику в бесконечный цикл while:

while True: currency = float(input("Введите количество валюты: ")) price = float(input("Введите цену валюты: ")) total = currency * price x = currency * price while int(x) < total: currency = currency - 1 total = currency * price print("Вы получите", int(total + price), "хаосов за", int(currency + 1)) 

Отслеживать
ответ дан 12 апр 2020 в 7:58
69.9k 5 5 золотых знаков 20 20 серебряных знаков 51 51 бронзовый знак

Есть альтернативное решение:

import os import sys os.execl(sys.executable, sys.executable, *sys.argv) 

В данном случае оно конечно не будет удобно, но иногда хорошо.

Отслеживать
ответ дан 22 окт 2020 в 17:23
Smokey on ru.SO Smokey on ru.SO
29 5 5 бронзовых знаков

    Важное на Мете
Похожие

Подписаться на ленту

Лента вопроса

Для подписки на ленту скопируйте и вставьте эту ссылку в вашу программу для чтения RSS.

Дизайн сайта / логотип © 2024 Stack Exchange Inc; пользовательские материалы лицензированы в соответствии с CC BY-SA . rev 2024.2.12.4680

Как перезапускать потоки в Python?

Как перезапускать потоки случае непредвиденных ошибок в Python?

Рассмотрим ситуацию, в которой потоки читают показаний нескольких датчиков одновременно. В случае возникновения ошибки ввода/вывода во время чтения показаний одного из датчиков или другого подобного сбоя встает необходимость перезапускать упавший поток.

Первое, что приходит в голову это просто проверить, жив ли поток, и перезапустить его, если он умер:

# как то так if not current_thread.isAlive(): current_thread.start() 

Попробуем смоделировать ситуацию:

import threading, time def sensor_a(): while True: time.sleep(1) print("Читаем показания датчика А") def sensor_b(): i = 0 while True: time.sleep(1) if i == 1: # имитируем ошибку при чтении датчика raise KeyboardInterrupt print("Читаем показания датчика Б") i += 1 # словарь с потоки для чтения счетчиков # словарь необходим для их перезапуска thread_dict =  'SENSOR_A': threading.Thread(target=sensor_a, name='SENSOR_A'), 'SENSOR_B': threading.Thread(target=sensor_b, name='SENSOR_B') > threads = [t for t in thread_dict.values()] # запускаем потоки for t in threads: t.start() # следим за потоками в реальном времени while True: # проходимся по объектам потоков for thread in threading.enumerate(): # если поток умер if not thread.isAlive(): print(f'Поток, читающий thread.name> умер') # получаем из словаря `thread_dict` # поток по имени для его перезапуска restart = thread_dict[thread.name] # пытаемся перезапустить restart.start() # Читаем показания датчика А # Читаем показания датчика Б # Читаем показания датчика А # Exception in thread sensor_b: # Traceback (most recent call last): # . # KeyboardInterrupt # Поток, читающий SENSOR_B умер # Перезапуск потока SENSOR_B # Traceback (most recent call last): # . # RuntimeError: threads can only be started once # Читаем показания датчика А # Читаем показания датчика А # . 

Вот и ответ на поставленный вопрос "RuntimeError: threads can only be started once" - потоки могут быть запущены только один раз! Другими словами потоки перезапускать НЕЛЬЗЯ.

В такой ситуации правильней и проще вообще не позволять умирать потокам, ведь если потоки на самом деле рушатся, то следом может упасть и вся программа. Если в функции потока, какой-то блок кода может вызывает исключение, то лучше подстраховаться и просто ловить это исключение, а в качестве результата выдать например None .

Если код программы уже написан и работает, а править очень долго, то можно поступить вообще тривиально, обернув функцию потока в другую функцию, которая будет ловить все исключения подряд.

import threading, time def sensor_a(): while True: time.sleep(1) print("Читаем показания датчика А") def sensor_b(): i = 0 while True: time.sleep(1) if i == 1: # имитируем падение датчика raise KeyboardInterrupt print("Читаем показания датчика Б") i += 1 def threadwrap(threadfunc): def wrapper(): while True: try: threadfunc() except BaseException as e: th_name = threading.current_thread().name print(f'Падение потока датчика th_name>, перезапуск. ') return wrapper # словарь потоков thread_dict =  'SENSOR_A': threading.Thread(target=sensor_a, name='SENSOR_A'), 'SENSOR_B': threading.Thread(target=sensor_b, name='SENSOR_B') > # создаем потоки threads = [t for t in thread_dict.values()] # запускаем потоки for t in threads: t.start() # Читаем показания датчика Б # Читаем показания датчика А # Падение потока датчика SENSOR_B, перезапуск. # Читаем показания датчика А # Читаем показания датчика А # Читаем показания датчика Б # Читаем показания датчика А # . 
  • КРАТКИЙ ОБЗОР МАТЕРИАЛА.
  • Получение общих сведений о потоках, модуль threading
  • Класс Thread() модуля threading
  • Класс local() модуля threading
  • Класс Event() модуля threading
  • Класс Lock() модуля threading
  • Класс RLock() модуля threading
  • Класс Condition() модуля threading
  • Класс Semaphore() модуля threading
  • Класс Timer() модуля threading
  • Класс Barrier() модуля threading
  • Протокол управления контекстом в модуле threading
  • Трассировка и профилирование потоков модулем threading
  • Как перезапускать потоки?

Как перезапустить программу в Python не выходя из неё?

Интересно, кто всех учит запрашивать в input "Да или Нет". подозрительно часто встречается.

Егор КарьковЗнаток (431) 2 года назад
Спасибо! А про Да или Нет - я в книге по питону увидел.
Егор КарьковЗнаток (431) 2 года назад
А именно весь код или код до этого момента?

Elepsis Eclipse Гений (63762) Егор Карьков, Ну всё, кроме h = 'restart' Нужно всем строчкам добавить дополнительные отступы, т. к. они находятся внутри while.

Егор КарьковЗнаток (431) 2 года назад
Абсолютно всем в коде?
Оксана ГуцевичУченик (51) 2 года назад
помогите пожалуйста https://otvet.mail.ru/question/224096251
Похожие вопросы
Ваш браузер устарел

Мы постоянно добавляем новый функционал в основной интерфейс проекта. К сожалению, старые браузеры не в состоянии качественно работать с современными программными продуктами. Для корректной работы используйте последние версии браузеров Chrome, Mozilla Firefox, Opera, Microsoft Edge или установите браузер Atom.

Как создать «перезапуск кода» на Python?

Всем доброго, изучаю питон самостоятельно, написал программу которая переводит числа в квадрат, в конце если пользователь пишет "Да" что бы либо он перезагружал либо зациклил этот код.
Чтобы не искать, все в низу.

#Переводчик квадратов чисел
#Приветствие
print("Добро пожаловать в \"Переводчик квадратов чисел\"")
start=input("Начинаем работать?(Да,Нет): " )

#консоль начала работы
if start=="Да":
number=int(input("Введите число,которое нужно перевести: " ))#ввод числа
elif start=="Нет":
print("Досвидания =(")
exit()
else:
restart=bool(print("Напишите Да/Нет(С заглавной буквы)"))
if restart==False:
exit()

#список квадратов
if number==0:
print("Результат:0")
elif number==1:
print("Результат:1")
elif number==2:
print("Результат:4")
elif number==3:
print("Результат:9")
elif number==4:
print("Результат:16")
elif number==5:
print("Результат:25")
elif number==6:
print("Результат:36")
elif number==7:
print("Результат:49")
elif number==8:
print("Результат:64")
elif number==9:
print("Результат:81")
elif number==10:
print("Результат:100")
elif number==11:
print("Результат:121")
elif number==12:
print("Результат:144")
elif number==13:
print("Результат:169")
elif number==14:
print("Результат:196")
elif number==15:
print("Результат:225")
elif number==16:
print("Результат:256")
elif number==17:
print("Результат:289")
elif number==18:
print("Результат:324")
elif number==19:
print("Результат:361")
elif number==20:
print("Результат:400")
elif number==21:
print("Результат:441")
elif number==22:
print("Результат:484")
elif number==23:
print("Результат:529")
elif number==24:
print("Результат:576")
elif number==25:
print("Результат:625")
elif number==26:
print("Результат:676")
elif number==27:
print("Результат:729")
elif number==28:
print("Результат:784")
elif number==29:
print("Результат:841")
elif number==30:
print("Результат:900")
elif number==31:
print("Результат:961")
elif number==32:
print("Результат:1024")
elif number==33:
print("Результат:1089")
elif number==34:
print("Результат:1156")
elif number==35:
print("Результат:1225")
elif number==36:
print("Результат:1296")
elif number==37:
print("Результат:1369")
elif number==38:
print("Результат:1444")
elif number==39:
print("Результат:1521")
elif number==40:
print("Результат:1600")
elif number==41:
print("Результат:1681")
elif number==42:
print("Результат:1764")
elif number==43:
print("Результат:1849")
elif number==44:
print("Результат:1936")
elif number==45:
print("Результат:2025")
elif number==46:
print("Результат:2116")
elif number==47:
print("Результат:2209")
elif number==48:
print("Результат:2304")
elif number==49:
print("Результат:2401")
elif number==50:
print("Результат:2500")
elif number==51:
print("Результат:2601")
elif number==52:
print("Результат:2704")
elif number==53:
print("Результат:2809")
elif number==54:
print("Результат:2916")
elif number==55:
print("Результат:3025")
elif number==56:
print("Результат:3136")
elif number==57:
print("Результат:3249")
elif number==58:
print("Результат:3364")
elif number==59:
print("Результат:3481")
elif number==60:
print("Результат:36")
elif number==61:
print("Результат:36")
elif number==62:
print("Результат:36")
elif number==63:
print("Результат:36")
elif number==64:
print("Результат:36")
elif number==65:
print("Результат:36")
elif number==66:
print("Результат:36")
elif number==67:
print("Результат:36")
elif number==68:
print("Результат:36")
elif number==69:
print("Результат:36")
#финальная консоль

close=input("Хотите продолжить?(Да/Нет)")
if close=="Нет":
print("До свидания =(")
exit()
elif close=="Да":
вот здесь нужно добавить перезапуск

Я знаю что можно было побыстрее весь код обернуть, но как то вот так, с английским худо поэтому на русском (

  • Вопрос задан более двух лет назад
  • 4195 просмотров

1 комментарий

Простой 1 комментарий

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *