Может ли запущенная программа на Python перезаписать себя?

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

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

Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
17
0
5 651
4
Перейти к ответу Данный вопрос помечен как решенный

Ответы 4

Ответ принят как подходящий

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

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

carrier 15.11.2008 00:22

Примечательно: если вы удалите файл .py, но оставите файл .pyc, этот файл все равно будет импортирован. Кусает меня хотя бы раз в месяц.

Matthew Schinckel 15.01.2011 11:00

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

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

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

Таким образом, вам не нужно будет перезапускать приложение для запуска самой последней версии, просто повторно импортируйте модуль.

# Check version of module
import module

# Check update address
if update_version > module.version:
    download(update_module)
    import module
    reload(module)

module.main()

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

[Очевидно, я недостаточно ясно прочитал предыдущий пост - он делает именно то, что я предлагаю!]

Да, но ваш ответ более обстоятельный, так что стоит проголосовать :)

tzot 17.11.2008 13:37

Идея мне нравится, но она не работает в системах, в которых нельзя устанавливать модули.

sorin 13.01.2011 14:44

Вы всегда можете изменить PYTHONPATH, включив в него каталог: любые файлы / папки, в которых есть модули Python.

Matthew Schinckel 15.01.2011 10:58

Вы также можете проверить этот модуль (который также есть в 2.5 и 3)

http://www.python.org/doc/2.1.3/lib/os-process.html

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

Другие вопросы по теме