- Как сделать программу Python автоматически перезапустить себя
- 4 ответа
- Перезапустите python- script изнутри самого себя
- ОТВЕТЫ
- Ответ 1
- Ответ 2
- Ответ 3
- Ответ 4
- Ответ 5
- Ответ 6
- Ответ 7
- Ответ 8
- В Python, как мне перезапустить функцию, если она выдает ошибку
- 4 ответа
- Как выгрузить (перезагрузить) модуль Python?
- 19 ответов
- Как перезагрузить функцию модуля в Python?
- 7 ответов
Как сделать программу 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 перезагрузить модуль, так как вы не можете просто перезагрузить функции:
Источник