Форум сайта python.su
Я новичок в питоне, в детстве интересовался только бейсиком, немного программировал на нем и на лингвистически похожих языках или в программах, поэтому питон мне исключительно неинтуитивен по всему, что возможно.
Я так сяк написал на нем простую программку для работы моих майнеров, которая регулирует их поведение в зависимости от условий рынка. Проблема та, что время от времени сайт, с которого я получаю данные либо виснет, либо дает какие-то неправильные данные, и программа останавливается и выходит. Я ее вручную перезапускаю, и опять несколько часов все нормально.
Я часа 3 провел гуугля как можно автоматически сделать перезапуск, но ума сделать что-то рабочее мне не получается. Углубляться в то, почему и какие там ошибки вылетают, опять же, я на данный момент не хочу, так как банальный перезапуск программы все решает.
Неужели так сложно перезапустить программу, то, что в некоторых других оболочках можно было сделать простой галочкой или парой строк?
Питон на Pycharm на винде 10.
Посоветуйте простое решение.
Отредактировано Renaldas (Фев. 2, 2021 21:09:24)
Офлайн
Тебе надо написать второй скрипт B, который запускает первый скрипт A и следит за ним. Если скрипт A выпал, то скрипт B его перезапускает. Скрипт B можно писать на питоне, а можно на другом языке.
Офлайн
RenaldasПричем тут питон??? Ваша оболочка windows 10. Вот для него и гуглите как запустить процесс как службу.
Неужели так сложно перезапустить программу, то, что в некоторых других оболочках можно
Офлайн
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)
[code python][/code]
Отредактировано PEHDOM (Фев. 3, 2021 12:03:37)
Офлайн
RenaldasЯ представлял это,как функция в которой рабочий скрипт обернутый в try ,except. Функция работает в возвращает код работоспособности, как у реквест, если ошибка,то далее алгоритм который через сколько то времени пробует запускать функцию.,и ещё смс уведомление или включение сирены гражданской обороны
Проблема та, что время от времени сайт, с которого я получаю данные либо виснет, либо дает какие-то неправильные данные, и программа останавливается и выходит
Офлайн
xam1816Случаи бывают разные. Скрипт может сожрать всю допустимую для процесса память, Наоткрывать файловых дескрипторов сверх лимита. Те прийти в состояние когда данный процесс однозначно не может дальше жить. try except не спасет отца русской демократии.
Я представлял это,как функция в которой рабочий скрипт обернутый в try ,except.
Отредактировано doza_and (Фев. 3, 2021 21:31:44)
Офлайн
PEHDOMЭто монитор. Шаблон такой архитектурный. В Erlang'е есть такие, благодаря чему он отказоустойчивый и широко используется в телекоме, где кучи всяких устройств с аппаратными ошибками, нестабильным электричеством и прочим. В Erlang'е изначально много легковесных параллельных процессов можно запускать и они независимы - действуют сами по себе, поэтому там есть средства для работы с ними и всё устроено удобно в этом плане. Вот такой процесс может грохнуться в результате чего-нибудь - свет отрубили, например. И чтобы ничего не менять в нём, так как он исправен и там просто с аппаратурой что-то, придумали вот эти процессы-мониторы, которые следят за обычными процессами и перезапускают их по новой, если те падают. Так там надёжность обеспечивается. И эта модель отлажена уже десятилетиями.
другой вариант, вам уже предложил py.user.next создать скрипт который будет запускать
Отредактировано py.user.next (Фев. 3, 2021 22:09:31)
Офлайн
py.user.next
Тебе надо написать второй скрипт B, который запускает первый скрипт A и следит за ним. Если скрипт A выпал, то скрипт B его перезапускает. Скрипт B можно писать на питоне, а можно на другом языке.
Офлайн
RenaldasОбычно первый процесс(котороый нужно мониторить), в заранее определенном месте, создает файл, в который при запуске помещает свой pid. При штатном завершении он этот файл удаляет/очищает. Второй процесс смотрит если файла нет или он пустой, значит процесс не запускали или штатно остановили, если там есть pid то смотрит в процессах, и если не находит процесса с таким pid то значит процесс завершился аварийно, и нужно его перезапустить.
но “завалил” дело на банальном - не смог понять, как другому скрипту передать величину переменной (PID) из первого.
[code python][/code]
Офлайн
вот так баловался с блокнотом,выключал его,он через 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)
Офлайн