Подтвердить что ты не робот

Возможно ли перезаписывать запущенную программу python?

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

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

4b9b3361

Ответ 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 перезапишет текущий процесс тем, что вы вызываете из этого метода. Я провел некоторые тесты персонала, и он работает довольно надежно.