Как перезапустить скрипт python при ошибке

I have a program that queries an API every few seconds. Each response triggers a few functions which themselves make some calls to websites and such — calls that I don’t want to blindly trust to succeed. If I catch an exception in foo(), for example, or even in a function that foo() calls, is it possible to restart the program entirely in the except block? Essentially, I want to call queryRepeatedly() upon an exception in one of its sub-functions, without keeping the previous call on the stack.

Of course, I could return marker values and solve this another way, but the program is structured in a way such that the above approach seems much simpler and cleaner.

# Sample "main" function that I want to call
def queryRepeatedly():
    while True:
        foo()
        bar()
        baz()
        time.sleep(15)

def foo():
    # do something
    try:
        foo2() # makes a urllib2 call that I don't trust
    except:
        #restart queryRepeatedly

queryRepeatedly()

pppery's user avatar

pppery

3,72723 gold badges33 silver badges46 bronze badges

asked Jul 8, 2013 at 18:02

vroomfondel's user avatar

3

To restart anything, just use a while loop outside the try. For example:

def foo():
    while True:
        try:
            foo2()
        except:
            pass
        else:
            break

And if you want to pass the exception up the chain, just do this in the outer function instead of the inner function:

def queryRepeatedly():
    while True:
        while True:
            try:
                foo()
                bar()
                baz()
            except:
                pass
            else:
                break
        time.sleep(15)

def foo():
    foo2()

All that indentation is a little hard to read, but it’s easy to refactor this:

def queryAttempt()
    foo()
    bar()
    baz()

def queryOnce():
    while True:
        try:
            queryAttempt()
        except:
            pass
        else:
            break

def queryRepeatedly():
    while True:
        queryOnce()
        time.sleep(15)

But if you think about it, you can also merge the two while loops into one. The use of continue may be a bit confusing, but see if you like it better:

def queryRepeatedly():
    while True:
        try:
            foo()
            bar()
            baz()
        except:
            continue
        time.sleep(15)

Daniel Walker's user avatar

answered Jul 8, 2013 at 18:05

abarnert's user avatar

abarnertabarnert

355k52 gold badges601 silver badges673 bronze badges

2

Refactor this — you’ll get a stackoverflow error sooner or later if you have enough failures.

queryRepeatedly should just be query. It should return void and throw exceptions on failures.

Wrap in something that looks like this, your true queryRepeatedly function?

while True:
    try:
        query()
    except:
        #handle
    time.sleep(15)

All looping, no recursion needed.

Note that you must think carefully about how much of your program you need to restart. From your question it sounded like your actual problem was ensuring the query could try again if it sporadically fails, which is what my solution ensures. But if you want to clean up program resources — say, bounce SQL connections, which may have broken — then you need to think more carefully about how much of your program you need to «restart.» In general you need to understand why your query failed to know what to fix, and in the extreme case, the right thing to do is an email or SMS to someone on call who can inspect the situation and write an appropriate patch or fix.

answered Jul 8, 2013 at 18:06

djechlin's user avatar

djechlindjechlin

59.3k35 gold badges162 silver badges291 bronze badges

12

First make two files.

One file called run.py and one called forever.py and put them in the same folder.

Go to your terminal within that folder and type chmod +x forever.py

run.py

whatever code you want to run

forever.py

#!/usr/local/lib/python3.7
from subprocess import Popen
import sys

filename = sys.argv[1]
while True:
    print("\nStarting " + filename)
    p = Popen("python3 " + filename, shell=True)
    p.wait()

Open a terminal window from the folder and type this:

python3 ./forever.py run.py

to start run.py and if it fails or has an exception, it’ll just start over again.

You now have a template to make sure if a file crashes or has an exception, you can restart it without being around. If this helps you, please give me a vote!

Olivier's user avatar

answered Mar 1, 2020 at 4:50

Cody Krecicki's user avatar

0

In your exception make a recursive call

except:
      queryRepeatedly()

answered Jul 8, 2013 at 18:06

sedavidw's user avatar

sedavidwsedavidw

11.1k13 gold badges61 silver badges95 bronze badges

4

For something like this (connecting to a web page), it’s often better to make the upper limit based on time instead of the number of times you attempt to connect. So use a while loop instead:

import numpy as np
import time

def main():
    np.load('file.csv')

start = time.time()
stop = start + 5
attempts = 0
result = 'failed'

while True:
    if time.time()<stop:
        try:
            main()
        except Exception as e:
            attempts += 1
            print e
            time.sleep(0.1) # optional
            print 'Restarting!'
            continue
        else:
            result = 'succeeded'
    print 'Connection %s after %i attempts.' % (result, attempts)
    break

Optional: I included a 100 ms pause after each failed attempt. This can help with establishing a connection sometimes.

Then wrap the whole thing up in a function you can use in the future for other projects:

# retry.py

import time

def retry(f, seconds, pause = 0):
    start = time.time()
    stop = start + seconds
    attempts = 0
    result = 'failed'

    while True:
        if time.time()<stop:
            try:
                f()
            except Exception as e:
                attempts += 1
                print e
                time.sleep(pause)
                print 'Restarting!'
                continue
            else:
                result = 'succeeded'
        print '%s after %i attempts.' % (result, attempts)
        break

now just do this:

import numpy as np
from retry import retry

def main():
    np.load('file.csv')

retry(main, 5, 0.1)

Testing procedure:

class RetryTest():
    def __init__(self, succeed_on = 0, excp = Exception()):
        self.succeed_on = succeed_on
        self.attempts = 0
        self.excp = excp
    def __call__(self):
        self.attempts += 1
        if self.succeed_on == self.attempts:
            self.attempts = 0
        else:
            raise self.excp

retry_test1 = RetryTest(3)
retry(retry_test1, 5, 0.1)
# succeeded after 3 attempts.
retry_test2 = RetryTest()
retry(retry_test2, 5, 0.1)
# failed after 50 attempts.

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

Вот у меня есть телеграм бот, и иногда он стопается, мол ошибка (там другая история).
И как сделать так, чтобы скрипт автоматически после остановки запускался заново (python bot.py)?


  • Вопрос задан

  • 2429 просмотров

while true; do python bot.py; done

Можно с помощью инструкций try/except.

def function():	
	try:
		a = input("Enter a number")
		b = int(a) / 0
	except:
		function()
function()

Поместите туда свой код, при ошибке, функция будет вызвана заново.

Пригласить эксперта


  • Показать ещё
    Загружается…

22 сент. 2023, в 01:22

10000 руб./за проект

22 сент. 2023, в 00:39

30000 руб./за проект

21 сент. 2023, в 22:23

5000 руб./за проект

Минуточку внимания

Here is a simple trick that I used to restart my python script after unhandled exception.

Let’s say I have this simple script called test.py that I want to run forever. It will just wait 2 seconds and throw an error.

import time

time.sleep(2)
raise Exception("Oh oh, this script just died")
Code language: JavaScript (javascript)

I use the following script called forever in the same directory:

#!/usr/bin/python
from subprocess import Popen
import sys

filename = sys.argv[1]
while True:
    print("\nStarting " + filename)
    p = Popen("python " + filename, shell=True)
    p.wait()
Code language: JavaScript (javascript)

It uses python to open test.py as a new subprocess. It does so in an infinite while loop, and whenever test.py fails, the while loop restarts test.py as a new subprocess.

I’ll have to make the forever script executable by running chmod +x forever. Optionally forever script can be moved to some location in the PATH variable, to make it available from anywhere.

Next, I can start my program with:

./forever test.py

Which will result in the following output:

Starting test.py
Traceback (most recent call last):
  File "test.py", line 4, in <module>
    raise Exception("Oh oh, this script just died")
Exception: Oh oh, this script just died

Starting test.py
Traceback (most recent call last):
  File "test.py", line 4, in <module>
    raise Exception("Oh oh, this script just died")
Exception: Oh oh, this script just died

Starting test.pyCode language: JavaScript (javascript)

As you can tell, this script will run repeatedly, until it is killed with ctr+c.

Ошибки являются неотъемлемой частью программирования, особенно при работе с языком Python. Когда программа обнаруживает ошибку, она может прекратить свою работу, что может привести к нежелательным последствиям. Однако, существует способ перезапустить скрипт на Python при возникновении ошибки, позволяющий обработать и исправить возникшую проблему.

Один из способов перезапустить скрипт на Python при возникновении ошибки — использовать конструкцию try-except. Внутри блока try пишется код, который может вызывать ошибку. Если во время выполнения блока try происходит ошибка, исполнение программы переходит в блок except, где можно указать какую-либо обработку ошибки или повторное выполнение кода.

Пример использования конструкции try-except:

try:

# блок кода, который может вызвать ошибку

except:

# блок кода, который выполняется при возникновении ошибки

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

Использование конструкции try-except позволяет обнаружить и обработать ошибки в программе, а также перезапустить скрипт при их возникновении. Это удобный инструмент, который поможет повысить надежность и отказоустойчивость вашей программы на Python.

Содержание

  1. Запуск скрипта Python при ошибке: 8 шагов для перезапуска
  2. Разбор причин возникновения ошибки
  3. Описание возможных ошибок при выполнении скрипта
  4. 1. Синтаксические ошибки
  5. 2. Ошибки времени выполнения
  6. 3. Ошибки связанные с вводом-выводом
  7. 4. Ошибки импорта
  8. 5. Обработка исключений
  9. 6. Необрабатываемые ошибки
  10. Определение точки входа для обработки ошибок
  11. Создание цикла для повторного выполнения скрипта
  12. Разработка алгоритма восстановления скрипта
  13. Реализация условий выхода из цикла перезапуска
  14. Проверка работоспособности скрипта после перезапуска

Запуск скрипта Python при ошибке: 8 шагов для перезапуска

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

  1. Подключите библиотеку «traceback». Для того чтобы ловить ошибки и получать информацию о них, вам потребуется импортировать модуль «traceback» в вашем скрипте.
  2. Разместите код в блоке «try-except». Оберните код, который может вызывать ошибки, в блок кода «try-except». Это позволит перехватывать и обрабатывать возникающие исключения.
  3. Выберите исключение для перехвата. В блоке «except» выберите исключение, которое вы хотите отслеживать. Например, если вы хотите перезапускать скрипт только при возникновении ошибки деления на ноль, выберите исключение «ZeroDivisionError».
  4. Добавьте цикл для повторного запуска. Внутри блока «except» добавьте цикл, который будет повторно запускать скрипт. Например, вы можете использовать бесконечный цикл while True.
  5. Вставьте код, который будет выполняться перед перезапуском. Перед запуском скрипта внутри цикла while True, вы можете вставить код, который будет выполняться перед каждым перезапуском. Например, вы можете выводить сообщение об ошибке.
  6. Обновите исходные данные. Если вам необходимо обновить исходные данные перед каждым перезапуском, вставьте код, который будет обновлять эти данные.
  7. Добавьте задержку между перезапусками. Чтобы избежать бесконечного цикла, добавьте задержку между перезапусками. Например, вы можете использовать функцию time.sleep() для добавления паузы.
  8. Дополнительные возможности. Для более сложных сценариев вы можете добавить дополнительные функции, которые будут выполняться в зависимости от конкретной ситуации.

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

Разбор причин возникновения ошибки

Ошибки во время выполнения программы могут возникать по разным причинам. Чтобы успешно перезапустить скрипт на Python при возникновении ошибки, необходимо понять и проанализировать причину возникновения ошибки. В этом разделе рассмотрим несколько возможных причин ошибок:

  1. Синтаксические ошибки: Это наиболее распространенный тип ошибок, возникающий в процессе написания кода. Они возникают, когда программа содержит синтаксические ошибки, такие как неправильное использование ключевых слов, операторов или пропущенные символы. Перед запуском скрипта рекомендуется внимательно проверить код на наличие таких ошибок.

  2. Исключения: Исключения возникают в случае ошибок, которые происходят во время выполнения программы. Например, деление на ноль, неверный доступ к элементу списка или отсутствие файла. Перехватывание и обработка исключений позволяет избежать аварийного завершения программы.

  3. Ошибка связи с внешними ресурсами: При работе с внешними ресурсами, такими как базы данных, серверы или файловые системы, могут возникать ошибки связи или недоступности этих ресурсов. В таких случаях необходимо проверить наличие соединения с ресурсом, правильность пути к файлу или настройки подключения.

  4. Неправильные данные: В некоторых случаях, ошибки могут быть связаны с неправильными входными данными, которые были переданы в программу. Например, передача строки вместо числа или передача данных в неподходящем формате. Перед использованием входных данных рекомендуется произвести их проверку и преобразование, если это необходимо.

  5. Нехватка ресурсов: Некоторые ошибки могут возникать в случае нехватки ресурсов, таких как память или процессорное время. Например, если программа пытается обработать большой объем данных и не хватает оперативной памяти, это может привести к возникновению ошибки. В таких случаях необходимо оптимизировать программу или увеличить объем доступных ресурсов.

Анализируя причину возникновения ошибки, можно принять соответствующие меры для ее устранения и перезапуска скрипта на Python.

Описание возможных ошибок при выполнении скрипта

При выполнении скриптов на языке Python могут возникать различные ошибки. Некоторые из них являются синтаксическими ошибками, которые возникают при неправильном написании кода. Другие ошибки могут быть связаны с некорректными входными данными или неправильными настройками среды выполнения.

1. Синтаксические ошибки

Синтаксические ошибки возникают при нарушении правил языка Python. Например, если пропущена закрывающая скобка, забыт двоеточие или использован неверный оператор.

2. Ошибки времени выполнения

Ошибки времени выполнения возникают во время выполнения скрипта. Например, деление на ноль, обращение к несуществующему индексу списка, или вызов несуществующей функции.

3. Ошибки связанные с вводом-выводом

Ошибки связанные с вводом-выводом возникают при работе с файлами или сетью. Например, если файл не существует или нет прав на его открытие, или если соединение с сервером было разорвано.

4. Ошибки импорта

Ошибки импорта возникают при попытке импортировать модуль, который не найден или не может быть загружен. Это может быть связано с неправильным путем к модулю или отсутствием требуемых зависимостей.

5. Обработка исключений

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

6. Необрабатываемые ошибки

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

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

Определение точки входа для обработки ошибок

При разработке скриптов на Python важно предусмотреть обработку возможных ошибок. Ошибки могут возникать из-за неправильного ввода данных, проблем с соединением, ошибок в коде и других причин.

Одним из популярных способов обработки ошибок является использование блока try-except. Блок try-except позволяет хорошо контролировать ошибки и обрабатывать их, чтобы скрипт не останавливался при их возникновении. Однако, нужно правильно определить точку входа для обработки ошибок.

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

Когда происходит ошибка внутри блока try, выполнение кода переходит к блоку except. В блоке except можно указать код, который будет выполняться при возникновении ошибки. Это может быть вывод сообщения об ошибке, запись в лог, завершение работы скрипта и т.д.

Также, можно использовать несколько блоков except для обработки нескольких типов ошибок. Например, блок except FileNotFoundError для обработки ошибки отсутствия файла, и блок except IOError для обработки других ошибок, связанных с вводом-выводом.

Правильное определение точки входа для обработки ошибок и правильное использование блока try-except помогут сделать скрипт более надежным и устойчивым к возможным ошибкам.

Создание цикла для повторного выполнения скрипта

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

Создание цикла для повторного выполнения скрипта довольно просто. Для этого можно использовать конструкцию while True:, которая будет выполняться бесконечно:

while True:
try:
# Ваш код скрипта здесь
# Если код успешно выполнился, выходим из цикла
break
except Exception as e:
# Обработка ошибки здесь
# Выводим сообщение об ошибке
print(f"Произошла ошибка: {e}")
# Продолжаем выполнение цикла
continue

В данном примере внутри цикла располагается блок try-except. Код скрипта, который нужно выполнить, размещается внутри блока try. Если код выполняется без ошибок, цикл прерывается с помощью оператора break.

В случае возникновения ошибки, блок except перехватывает исключение и выполняет необходимые действия, например, выводит сообщение об ошибке. Затем цикл продолжает свою работу с помощью оператора continue, повторно выполняя код скрипта.

Использование цикла для повторного выполнения скрипта при возникновении ошибки может быть очень полезным в случаях, когда требуется обеспечить стабильность работы скрипта во всех ситуациях.

Разработка алгоритма восстановления скрипта

При разработке скрипта на языке Python, особенно при работе с большим объемом данных или взаимодействии с внешними сервисами, могут возникать ошибки, которые приводят к остановке исполнения скрипта. Для автоматического восстановления работы скрипта после возникновения ошибки можно разработать специальный алгоритм.

Прежде всего, рекомендуется оборачивать основной код скрипта в блок try-except. В блоке try размещается основной код, который может вызвать ошибку. В блоке except указываются действия, которые нужно выполнить при возникновении ошибки.

Пример:

try:
# Основной код скрипта
except Exception as e:
# Действия при возникновении ошибки
print(f"Ошибка: {e}")
# Восстановление работы скрипта

При возникновении ошибки выполнение кода переходит в блок except. В этом блоке можно выполнять различные действия в зависимости от типа ошибки. Например, можно вывести сообщение об ошибке или выполнить определенные операции по восстановлению работы скрипта.

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

Для более сложных сценариев, когда необходимо выполнить несколько последовательных попыток восстановления работы скрипта, можно использовать циклы. Например, цикл while с условием наличия ошибки:

while True:
try:
# Основной код скрипта
break
except Exception as e:
# Действия при возникновении ошибки
print(f"Ошибка: {e}")
# Восстановление работы скрипта

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

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

Важно помнить, что алгоритм разработки восстановления скрипта должен быть гибким и учитывать все возможные ошибки и их последствия. Также рекомендуется вести логирование происходящих ошибок для их анализа и улучшения работы скрипта в будущем.

Реализация условий выхода из цикла перезапуска

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

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

Для этого можно использовать конструкцию try-except, которая позволяет «поймать» и обработать исключение. Внутри блока except можно указать какое-либо действие, которое должно произойти при возникновении определенного исключения.

Ниже приведен пример, иллюстрирующий реализацию условий выхода из цикла перезапуска для обработки ошибки:

  1. Задаем переменную should_restart со значением True, чтобы начать цикл перезапуска.
  2. Запускаем бесконечный цикл while, который будет выполняться до тех пор, пока should_restart равно True.
  3. Внутри цикла try-блок выполняется основной код скрипта.
  4. Если в процессе выполнения кода происходит ошибка, блок except перехватывает исключение и выполняет определенные действия.
  5. В блоке except можем выполнить логику выхода из цикла перезапуска или просто изменить значение should_restart на False, чтобы остановить цикл.

while True:

try:

# Основной код скрипта

except Exception as e:

# Логика обработки ошибки

Здесь Exception является базовым классом для всех исключений, поэтому этот блок будет перехватывать все исключения. Если вы хотите перехватить только определенные исключения, вы можете задать соответствующие классы после ключевого слова except.

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

Проверка работоспособности скрипта после перезапуска

Перезапуск скрипта на Python часто необходим, когда происходит ошибка или сбой в работе программы. Однако, после перезапуска важно проверить, что скрипт продолжает работать корректно и не возникает новых ошибок.

Есть несколько способов для проверки работоспособности скрипта:

  • Ручная проверка: Вручную проверьте различные части скрипта и убедитесь, что они работают без ошибок. Просмотрите логи или вывод скрипта, чтобы выявить какие-либо проблемы.
  • Тестовые данные: Можно использовать тестовые данные для проверки работы скрипта после перезапуска. Заранее определите ожидаемый результат и сравните его с фактическим результатом после перезапуска.
  • Автоматические тесты: Для автоматизации проверки работоспособности скрипта после перезапуска можно написать автоматические тесты. Автоматические тесты позволяют запускать скрипт на большом количестве тестовых данных и автоматически проверять результаты.

При выполнении проверки работоспособности после перезапуска скрипта рекомендуется использовать комбинацию вышеуказанных подходов. Это позволит уловить какие-либо проблемы и ошибки, которые могли возникнуть в ходе работы скрипта.

Пример использования автоматических тестов:

Входные данные Ожидаемый результат Фактический результат Результат теста
1 + 1 2 2 Пройден
2 + 2 4 3 Не пройден
5 — 3 2 2 Пройден

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

Понравилась статья? Поделить с друзьями:
  • Как перезапустить котел навьен ошибка 03
  • Как перестать бояться совершать ошибки
  • Как перезапустить котел бакси после ошибки
  • Как перестать делать орфографические ошибки
  • Как перестать делать одни и те же ошибки