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






Конечно, это возможно. После того, как скрипт загружен / импортирован, интерпретатор Python больше не будет обращаться к нему, за исключением случаев печати исходной строки в трассировке стека исключений. Любой файл pyc будет регенерирован в следующий раз, поскольку исходный файл новее, чем файл pyc.
Примечательно: если вы удалите файл .py, но оставите файл .pyc, этот файл все равно будет импортирован. Кусает меня хотя бы раз в месяц.
На самом деле, желательно, чтобы ваше приложение запускалось с фиктивного загрузчика программы проверки, который изменяется редко (если вообще когда-либо); перед запуском он должен проверить наличие обновлений; если да, то он загрузит их (обычно остальная часть приложения будет модулями), а затем импортирует их и запустит приложение.
Таким образом, как только обновления будут доступны, вы запустите приложение и запустите последнюю версию; в противном случае потребуется перезапуск приложения.
Если вы поместите большую часть кода в модуль, вы можете сделать так, чтобы основной файл (который и был запущен) проверял местоположение обновления и автоматически загружал самую последнюю версию и устанавливал ее перед импортом модуля.
Таким образом, вам не нужно будет перезапускать приложение для запуска самой последней версии, просто повторно импортируйте модуль.
# 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 ".
[Очевидно, я недостаточно ясно прочитал предыдущий пост - он делает именно то, что я предлагаю!]
Да, но ваш ответ более обстоятельный, так что стоит проголосовать :)
Идея мне нравится, но она не работает в системах, в которых нельзя устанавливать модули.
Вы всегда можете изменить PYTHONPATH, включив в него каталог: любые файлы / папки, в которых есть модули Python.
Вы также можете проверить этот модуль (который также есть в 2.5 и 3)
http://www.python.org/doc/2.1.3/lib/os-process.html
В частности, метод execv перезапишет текущий процесс тем, что вы вызываете из этого метода. Я сделал несколько кадровых тестов, и он работает довольно надежно.
круто ... я думал, что это не из-за ошибки, которую я получал, но теперь я вижу, что это была глупая ошибка, которую я делал.