Возможно ли для работающей программы на Python перезаписать себя? - PullRequest
16 голосов
/ 15 ноября 2008

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

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

Ответы [ 4 ]

22 голосов
/ 15 ноября 2008

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

12 голосов
/ 15 ноября 2008

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

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

# 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. ».

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

8 голосов
/ 15 ноября 2008

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

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

1 голос
/ 05 февраля 2009

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

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

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

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