как перезапустить код в python

Как сделать программу Python автоматически перезапустить себя

Как сделать так, чтобы программа на python автоматически перезапускала себя? Итак, скажем, есть действительно простая программа, такая как:

Теперь в оболочке Python вам нужно будет нажать либо кнопку «Выполнить», а затем «Запуск модуля (F5)», либо просто кнопку «f5» на клавиатуре. Это первый раз, когда вы запускаете его. Когда программа закончилась, вы вернетесь к своему файлу «Cheese.py» и затем нажмите «f5», чтобы снова запустить программу. Все со мной здесь? Итак, мой вопрос: как заставить программу автоматически перезагружаться без необходимости делать это вручную?

4 ответа

Если вы хотите фактически перезапустить сценарий, вы можете выполнить сценарий снова, заменив текущий процесс новым, выполнив следующие действия:

Это будет постоянно перезапускать скрипт, предоставляя аргументы командной строки от текущей версии к новой версии. Более подробное обсуждение этого метода можно найти в посте «Перезапуск скрипта Python внутри себя »от Петр Земек.

эта статья отмечает один элемент является:

Или вы можете попробовать

Затем вы можете запустить скрипт через

В такой ситуации, чтобы перезапустить скрипт, используйте следующий код:

В противном случае, когда вы запускаете скрипт через

Используйте этот код:

В любом случае, не забудьте импортировать sys module

Я использую терминал на своем Mac, чтобы перезапустить некоторые из моих скриптов на Python с помощью функции ниже.

Примечание: не забывайте пробел после «профиля»; или функция может молча сбоить!

Затем в нижней части моего сценария нужно перезапустить:

Исходный вопрос о сценарии с сыром:

Источник

Перезапустите python- script изнутри самого себя

У меня есть приложение GTK на основе python, которое загружает несколько модулей. Он запускается с терминала (linux) следующим образом:

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

Предпочтительно, решение должно работать и для Windows и Mac, но это не существенно.

ОТВЕТЫ

Ответ 1

Ответ 2

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

Ответ 3

но это не перезапустило само приложение, выполнив команду runme.sh, поэтому, когда я использовал этот способ:

Затем я смог перезапустить себя

Ответ 4

Я знаю, что это решение технически не является то, о чем вы просите, но если вы хотите быть на 100% уверенным, что вы освободили все или не хотите полагаться на зависимости, вы можете просто запустить script из цикла в другой:

Затем вы можете перезапустить main.py так же, как:

Ответ 5

Я немного улучшил код # s3niOr.

В моем случае в пути к файлу Python есть пробелы. Таким образом, добавив правильное форматирование, проблема может быть решена.

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

Это решает проблему перезапуска скрипта Python с пробелами в пути:

Ответ 6

Работает на Windows (без аргументов)

Ответ 7

Вдохновлен @YumYumYum и исправил проблему с помощью restart.sh и os.execl

Добавьте это в ваш main.py

Ответ 8

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

Таким образом, пользователь может ввести опцию «Y/N», чтобы перезапустить программу или нет.

Источник

В Python, как мне перезапустить функцию, если она выдает ошибку

Ниже приведены фрагменты моих кодов, которые я хотел бы знать гипотетически, если функция main2 () по какой-то причине выдает ошибку, как я могу получить свое исключение для повторного запуска той же функции, скажем, 3 раза, прежде чем она сломается?

Просто добавьте, что любая из функций может выдавать ошибку (не только main2 ()), также у меня может быть не только 3, но и много других функций.

4 ответа

Это будет работать так же, как если бы вы написали:

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

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

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

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

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

Этот код будет запускать функцию main2() до тех пор, пока не получит 3 ошибки, а в первые 2 он снова запустит цикл.

Вот идиома, которую вы можете попробовать:

Источник

Как выгрузить (перезагрузить) модуль Python?

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

19 ответов

вы можете перезагрузить модуль, когда он уже был импортирован с помощью reload встроенная функция в Python 2:

В Python 3, reload был перенесен на imp модуль. В 3.4, imp был deprecated в пользу importlib и reload был добавлен последним. При таргетинге 3 или более поздней версии либо ссылаться на соответствующий модуль при вызове reload или импортировать его.

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

цитата из документов:

код модулей Python перекомпилируется и модуль уровня код перевыполняются, определение нового набора объектов, привязаны к именам в модуле словарь. Функция init модули расширения не называются второй раз. Как и все другие объекты в Python старые объекты только reclaimed after their reference counts падать до нуля. Имена в модуле пространство имен обновляются, чтобы указать на любой новые или измененные объекты. Другой ссылки на старые объекты (например, имена внешних модулю) не отскок для ссылки на новые объекты и должен обновляться в каждом пространстве имен где они происходят, если это необходимо.

как вы отметили в своем вопросе, вам придется восстановить Foo объекты, если Foo класс находится в foo модуль.

в Python 3.0–3.3 можно использовать: imp.reload(module)

на BDFL и ответил этот вопрос.

особенно трудно удалить модуль, если он не является чистым Python.

Вы можете использовать sys.getrefcount (), чтобы узнать фактическое количество ссылки на литературу.

номера более 3 указывают на то, что будет трудно избавиться от модуль. Доморощенный » пустой» (не содержащий ничего) модуль должен быть мусор, собранный после

поскольку третья ссылка является артефактом функции getrefcount ().

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

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

Источник

Как перезагрузить функцию модуля в Python?

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

7 ответов

, почему. Когда foo сначала загружается, a foo создается объект, содержащий

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

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

на сегодняшний день, правильный способ сделать это:

протестировано на python 2.7, 3.5, 3.6.

другой модуль / python сессии:

теперь, если у вас нет ссылки на старую функцию (т. е. a lambda передано в другую функцию), вы можете попытаться получить его с помощью gc модуль, путем поиска списка всех объектов:

вы не можете перезагрузить метод из модуля, но вы можете загрузить модуль снова с новым именем, скажем foo2 и сказал bar = foo2.bar для перезаписи текущей ссылки.

обратите внимание, что если bar имеет какие-либо зависимости от других вещей в foo или любые другие побочные эффекты, вы получите в неприятности. Поэтому, пока он работает, он работает только для самых простых случаев.

вам придется использовать reload перезагрузить модуль, так как вы не можете просто перезагрузить функции:

Источник

Общеобразовательный справочник
Adblock
detector