2008-11-14 5 views
16

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

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

ответ

21

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

+0

cool ... Я думал, что это не из-за ошибки, которую я получал, но теперь я вижу, что это была глупая ошибка, которую я делал. – carrier 2008-11-14 21:22:15

+0

В частности: если вы удалите файл .py, но оставьте файл .pyc, этот файл по-прежнему будет импортирован. Укусы меня не реже одного раза в месяц. – 2011-01-15 08:00:12

8

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

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

+0

Я, вероятно, реализую его таким образом. Благодарю. – carrier 2008-11-16 19:37:39

11

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

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

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

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

1

Вы также можете проверить этот модуль (который находится в 2,5 & 3 а)

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

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

Смежные вопросы