Найти - Пользователи
Полная версия: Это правда так сложно перезагрузить программу в Python?
Начало » Python для новичков » Это правда так сложно перезагрузить программу в Python?
1 2
Renaldas
Я новичок в питоне, в детстве интересовался только бейсиком, немного программировал на нем и на лингвистически похожих языках или в программах, поэтому питон мне исключительно неинтуитивен по всему, что возможно.
Я так сяк написал на нем простую программку для работы моих майнеров, которая регулирует их поведение в зависимости от условий рынка. Проблема та, что время от времени сайт, с которого я получаю данные либо виснет, либо дает какие-то неправильные данные, и программа останавливается и выходит. Я ее вручную перезапускаю, и опять несколько часов все нормально.
Я часа 3 провел гуугля как можно автоматически сделать перезапуск, но ума сделать что-то рабочее мне не получается. Углубляться в то, почему и какие там ошибки вылетают, опять же, я на данный момент не хочу, так как банальный перезапуск программы все решает.

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

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

Посоветуйте простое решение.
py.user.next
Тебе надо написать второй скрипт B, который запускает первый скрипт A и следит за ним. Если скрипт A выпал, то скрипт B его перезапускает. Скрипт B можно писать на питоне, а можно на другом языке.
doza_and
Renaldas
Неужели так сложно перезапустить программу, то, что в некоторых других оболочках можно
Причем тут питон??? Ваша оболочка windows 10. Вот для него и гуглите как запустить процесс как службу.
PEHDOM
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(или както по другому, сейчакс это не имеет принципиальной роли) ваши скрипты, и контролировать, если процесс завершен запускать его еще раз.
xam1816
Renaldas
Проблема та, что время от времени сайт, с которого я получаю данные либо виснет, либо дает какие-то неправильные данные, и программа останавливается и выходит
Я представлял это,как функция в которой рабочий скрипт обернутый в try ,except. Функция работает в возвращает код работоспособности, как у реквест, если ошибка,то далее алгоритм который через сколько то времени пробует запускать функцию.,и ещё смс уведомление или включение сирены гражданской обороны
doza_and
xam1816
Я представлял это,как функция в которой рабочий скрипт обернутый в try ,except.
Случаи бывают разные. Скрипт может сожрать всю допустимую для процесса память, Наоткрывать файловых дескрипторов сверх лимита. Те прийти в состояние когда данный процесс однозначно не может дальше жить. try except не спасет отца русской демократии.

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

Бывают и более жесткие случаи, когда процессы циклятся или операционная система становится нестабильна, на это есть вотчдог таймеры…
py.user.next
PEHDOM
другой вариант, вам уже предложил py.user.next создать скрипт который будет запускать
Это монитор. Шаблон такой архитектурный. В Erlang'е есть такие, благодаря чему он отказоустойчивый и широко используется в телекоме, где кучи всяких устройств с аппаратными ошибками, нестабильным электричеством и прочим. В Erlang'е изначально много легковесных параллельных процессов можно запускать и они независимы - действуют сами по себе, поэтому там есть средства для работы с ними и всё устроено удобно в этом плане. Вот такой процесс может грохнуться в результате чего-нибудь - свет отрубили, например. И чтобы ничего не менять в нём, так как он исправен и там просто с аппаратурой что-то, придумали вот эти процессы-мониторы, которые следят за обычными процессами и перезапускают их по новой, если те падают. Так там надёжность обеспечивается. И эта модель отлажена уже десятилетиями.
Renaldas
py.user.next
Тебе надо написать второй скрипт B, который запускает первый скрипт A и следит за ним. Если скрипт A выпал, то скрипт B его перезапускает. Скрипт B можно писать на питоне, а можно на другом языке.

Да, я этот вариант понял и провел какой час спрашивая у гуугла, как это сделать, но пока что моих знаний не хватило. Я пробовал определить PID первого процесса и во втором скрипте задать проверку, есть ли такой процесс, но “завалил” дело на банальном - не смог понять, как другому скрипту передать величину переменной (PID) из первого.
PEHDOM
Renaldas
но “завалил” дело на банальном - не смог понять, как другому скрипту передать величину переменной (PID) из первого.
Обычно первый процесс(котороый нужно мониторить), в заранее определенном месте, создает файл, в который при запуске помещает свой pid. При штатном завершении он этот файл удаляет/очищает. Второй процесс смотрит если файла нет или он пустой, значит процесс не запускали или штатно остановили, если там есть pid то смотрит в процессах, и если не находит процесса с таким pid то значит процесс завершился аварийно, и нужно его перезапустить.
xam1816
вот так баловался с блокнотом,выключал его,он через 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')
не знаю на сколько он эффективен,не вникал
А так наверное на винде процесс можно запустить через службу,которая при падении будет его перезапускать
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB