Возможно ли перезаписывать запущенную программу python?
Возможно ли, чтобы python script открыл свой собственный исходный файл и перезаписал его?
Идея заключалась в том, чтобы простой и грязный способ для python script загрузить обновление самого себя, чтобы в следующий раз, когда он будет запущен, это будет обновленная версия.
Ответы
Ответ 1
Это конечно возможно. После того, как script загружен/импортирован, интерпретатор Python больше не будет обращаться к нему, за исключением случаев, когда печать строки источника в трассировке стека исключений. Любой файл pyc будет восстановлен в следующий раз, когда исходный файл будет более новым, чем pyc.
Ответ 2
Если вы вставляете большую часть кода в модуль, вы можете иметь основной файл (который запускается), проверить местоположение обновления и автоматически загружать самую последнюю версию и устанавливать ее до импорта модуля.
Таким образом, вам не нужно будет перезапускать приложение для запуска последней версии, просто reimport модуля.
# Check version of module
import module
# Check update address
if update_version > module.version:
download(update_module)
import module
reload(module)
module.main()
Вы можете использовать функцию reload(), чтобы заставить модуль перезагрузить данные. Обратите внимание, что есть некоторые предостережения: объекты, созданные с использованием классов в этом модуле, не будут обновлены магией до новой версии, а "из материала импорта модуля" до reimport может привести к тому, что "материал" относится к модулю старого объекта .stuff".
[Ясно, что я не читал предыдущую запись достаточно ясно - он делает именно то, что я предлагаю!]
Ответ 3
Собственно, предпочтительнее, чтобы ваше приложение начиналось с фиктивного контролера-загрузчика, который редко меняется (если вообще когда-либо); перед запуском он должен проверить, доступны ли какие-либо обновления; если да, то он будет загружать их (как правило, остальное приложение будет модулями), а затем импортирует их и запускает приложение.
Таким образом, как только будут доступны обновления, вы запустите приложение и запустите последнюю версию; в противном случае требуется перезапуск приложения.
Ответ 4
Вы также можете проверить этот модуль (который также находится в версии 2.5 и 3)
http://www.python.org/doc/2.1.3/lib/os-process.html
В частности, метод execv перезапишет текущий процесс тем, что вы вызываете из этого метода. Я провел некоторые тесты персонала, и он работает довольно надежно.