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

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

  • автор:

Python-сообщество

[RSS Feed]

  • Начало
  • » Python для новичков
  • » Это правда так сложно перезагрузить программу в Python?

#1 Фев. 2, 2021 21:08:39

Renaldas Зарегистрирован: 2021-02-02 Сообщения: 23 Репутация: 0 Профиль Отправить e-mail

Это правда так сложно перезагрузить программу в Python?

Я новичок в питоне, в детстве интересовался только бейсиком, немного программировал на нем и на лингвистически похожих языках или в программах, поэтому питон мне исключительно неинтуитивен по всему, что возможно.
Я так сяк написал на нем простую программку для работы моих майнеров, которая регулирует их поведение в зависимости от условий рынка. Проблема та, что время от времени сайт, с которого я получаю данные либо виснет, либо дает какие-то неправильные данные, и программа останавливается и выходит. Я ее вручную перезапускаю, и опять несколько часов все нормально.
Я часа 3 провел гуугля как можно автоматически сделать перезапуск, но ума сделать что-то рабочее мне не получается. Углубляться в то, почему и какие там ошибки вылетают, опять же, я на данный момент не хочу, так как банальный перезапуск программы все решает.

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

Питон на Pycharm на винде 10.

Посоветуйте простое решение.

Отредактировано Renaldas (Фев. 2, 2021 21:09:24)

#2 Фев. 2, 2021 23:38:16

py.user.next От: Зарегистрирован: 2010-04-29 Сообщения: 9675 Репутация: 841 Профиль Отправить e-mail

Это правда так сложно перезагрузить программу в Python?

Тебе надо написать второй скрипт B, который запускает первый скрипт A и следит за ним. Если скрипт A выпал, то скрипт B его перезапускает. Скрипт B можно писать на питоне, а можно на другом языке.

#3 Фев. 2, 2021 23:44:11

doza_and От: Зарегистрирован: 2010-08-15 Сообщения: 4138 Репутация: 252 Профиль Отправить e-mail

Это правда так сложно перезагрузить программу в Python?

Renaldas
Неужели так сложно перезапустить программу, то, что в некоторых других оболочках можно

Причем тут питон. Ваша оболочка windows 10. Вот для него и гуглите как запустить процесс как службу.

#4 Фев. 3, 2021 12:00:16

PEHDOM Зарегистрирован: 2016-11-28 Сообщения: 2196 Репутация: 294 Профиль Отправить e-mail

Это правда так сложно перезагрузить программу в Python?

Renaldas
Я часа 3 провел гуугля как можно автоматически сделать перезапуск, но ума сделать что-то рабочее мне не получается.

Тут нужно понимать откуда вы хотите “автоматически сделать перезапуск”и как вы его запускаете?
вот такой примитивный скрипт запускает сам себя после завершения .

import sys import os import time python = sys.executable print('hello World!!') time.sleep(5) print('work finished') os.execl(python, python, * sys.argv) 

другой вариант, вам уже предложил py.user.next создать скрипт который будет запускать, например, через subprocess(или както по другому, сейчакс это не имеет принципиальной роли) ваши скрипты, и контролировать, если процесс завершен запускать его еще раз.

[code python][/code]

Бериегите свое и чужое время.

Отредактировано PEHDOM (Фев. 3, 2021 12:03:37)

#5 Фев. 3, 2021 14:46:22

xam1816 Зарегистрирован: 2020-05-11 Сообщения: 1262 Репутация: 108 Профиль Отправить e-mail

Это правда так сложно перезагрузить программу в Python?

Renaldas
Проблема та, что время от времени сайт, с которого я получаю данные либо виснет, либо дает какие-то неправильные данные, и программа останавливается и выходит

Я представлял это,как функция в которой рабочий скрипт обернутый в try ,except. Функция работает в возвращает код работоспособности, как у реквест, если ошибка,то далее алгоритм который через сколько то времени пробует запускать функцию.,и ещё смс уведомление или включение сирены гражданской обороны

#6 Фев. 3, 2021 21:30:32

doza_and От: Зарегистрирован: 2010-08-15 Сообщения: 4138 Репутация: 252 Профиль Отправить e-mail

Это правда так сложно перезагрузить программу в Python?

xam1816
Я представлял это,как функция в которой рабочий скрипт обернутый в try ,except.

Случаи бывают разные. Скрипт может сожрать всю допустимую для процесса память, Наоткрывать файловых дескрипторов сверх лимита. Те прийти в состояние когда данный процесс однозначно не может дальше жить. try except не спасет отца русской демократии.

Вот для этих случаев и есть службы. операционка позаботится чтобы процесс воскрес.

Бывают и более жесткие случаи, когда процессы циклятся или операционная система становится нестабильна, на это есть вотчдог таймеры…

Отредактировано doza_and (Фев. 3, 2021 21:31:44)

#7 Фев. 3, 2021 22:06:05

py.user.next От: Зарегистрирован: 2010-04-29 Сообщения: 9675 Репутация: 841 Профиль Отправить e-mail

Это правда так сложно перезагрузить программу в Python?

PEHDOM
другой вариант, вам уже предложил py.user.next создать скрипт который будет запускать

Это монитор. Шаблон такой архитектурный. В Erlang’е есть такие, благодаря чему он отказоустойчивый и широко используется в телекоме, где кучи всяких устройств с аппаратными ошибками, нестабильным электричеством и прочим. В Erlang’е изначально много легковесных параллельных процессов можно запускать и они независимы — действуют сами по себе, поэтому там есть средства для работы с ними и всё устроено удобно в этом плане. Вот такой процесс может грохнуться в результате чего-нибудь — свет отрубили, например. И чтобы ничего не менять в нём, так как он исправен и там просто с аппаратурой что-то, придумали вот эти процессы-мониторы, которые следят за обычными процессами и перезапускают их по новой, если те падают. Так там надёжность обеспечивается. И эта модель отлажена уже десятилетиями.

Отредактировано py.user.next (Фев. 3, 2021 22:09:31)

#8 Фев. 4, 2021 22:57:39

Renaldas Зарегистрирован: 2021-02-02 Сообщения: 23 Репутация: 0 Профиль Отправить e-mail

Это правда так сложно перезагрузить программу в Python?

py.user.next
Тебе надо написать второй скрипт B, который запускает первый скрипт A и следит за ним. Если скрипт A выпал, то скрипт B его перезапускает. Скрипт B можно писать на питоне, а можно на другом языке.

Да, я этот вариант понял и провел какой час спрашивая у гуугла, как это сделать, но пока что моих знаний не хватило. Я пробовал определить PID первого процесса и во втором скрипте задать проверку, есть ли такой процесс, но “завалил” дело на банальном — не смог понять, как другому скрипту передать величину переменной (PID) из первого.

#9 Фев. 5, 2021 09:15:30

PEHDOM Зарегистрирован: 2016-11-28 Сообщения: 2196 Репутация: 294 Профиль Отправить e-mail

Это правда так сложно перезагрузить программу в Python?

Renaldas
но “завалил” дело на банальном — не смог понять, как другому скрипту передать величину переменной (PID) из первого.

Обычно первый процесс(котороый нужно мониторить), в заранее определенном месте, создает файл, в который при запуске помещает свой pid. При штатном завершении он этот файл удаляет/очищает. Второй процесс смотрит если файла нет или он пустой, значит процесс не запускали или штатно остановили, если там есть pid то смотрит в процессах, и если не находит процесса с таким pid то значит процесс завершился аварийно, и нужно его перезапустить.

[code python][/code]

Бериегите свое и чужое время.

#10 Фев. 5, 2021 11:24:58

xam1816 Зарегистрирован: 2020-05-11 Сообщения: 1262 Репутация: 108 Профиль Отправить e-mail

Это правда так сложно перезагрузить программу в Python?

вот так баловался с блокнотом,выключал его,он через 5 сек запускался

import subprocess import time notepad = subprocess.Popen('C:\\Windows\\System32\\notepad.exe') while True: if notepad.poll() != None: time.sleep(5) print('перезапуск') notepad = subprocess.Popen('C:\\Windows\\System32\\notepad.exe') 

не знаю на сколько он эффективен,не вникал
А так наверное на винде процесс можно запустить через службу,которая при падении будет его перезапускать

Отредактировано xam1816 (Фев. 5, 2021 11:40:10)

Как создать «перезапуск кода» на 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==»Да»:
вот здесь нужно добавить перезапуск

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

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

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

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

Как перезапускать потоки в 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
  • Как перезапускать потоки?

Перезапуск программы

Author24 — интернет-сервис помощи студентам

Как сделать так чтоб прога в конце спрашивала хочешь ли ты перезапустить её или нет и чтоб если ответ да она перезапускалась .

Добавлено через 2 часа 37 минут
.

Здесь вы можете заказать любую студенческую или школьную работу.

94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
Ответы с готовыми решениями:

Перезапуск программы с сохранением переменных
подскажите пожалуйста, как рестартануть консольную программу, собранную с помощью pyinstaller .

Авто перезапуск приложения
Всем привет, пишу 2ю тему. Снова проблема, Имееться: .exe файл и он(если вставить ссылку и нажать.

Перезапуск окна программы
Всем здравствуйте, как можно реализовать в PYQT5 перезапуск окна программы при нажатии на кнопку.

Перезапуск скрипта
Пишу бота на python, использую telebot, добавил туда клавиатуру и вопрос таков: как реализовать.

290 / 130 / 58
Регистрация: 24.11.2019
Сообщений: 532

1 2 3
while True: #твой код if input(f'Продолжить? \n') != 'Да': break

Регистрация: 04.01.2013
Сообщений: 205

ЦитатаСообщение от qwerty123098 Посмотреть сообщение

Как сделать так чтоб прога в конце спрашивала хочешь ли ты перезапустить её или нет и чтоб если ответ да она перезапускалась .

Добавлено через 2 часа 37 минут
.

В while засунуть, например. Первый заход под True будет. Далее если ответ отрицательный, то меняем переменную (после while) на false.

1 2 3 4 5
s = True while s: # код # проверяем ответ. Если "нет", тогда s = False

87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
Помогаю со студенческими работами здесь

Автоматический перезапуск подключения
Такую ошибку иногда вижу в консоли VSC при парсинге. При перезапуске от одного до несколько раз.

Перезапуск индекса при работе с циклом
Всем здравствуйте. Появилась задача написать матрицу, но посмотрев варианты ответа в интернете.

Перезапуск скрипта, после выполнения команды
Здравствуйте, я начинающий кодер, столкнулся с проблемой. Есть один прекрасный модуль uuid, он.

Перезапуск программы
Здравствуйте, ребят подскажите как правильно сделать, сделал в программе самообновление, после того.

Перезапуск программы
Нужно перезапустить программу таким образом чтобы она полностью выключилась а потом заново.

Перезапуск программы
Доброе утро! ПОдскажите пожалуйста как осуществить перезапуск программы при нажатии на битбатон .

Перезапуск программы
Как сделать так, чтобы при закрытии программы , она перезапускалась. P.S. Заранее Спасибо. 🙂

Или воспользуйтесь поиском по форуму:

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

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