LINUX.ORG.RU

Python. автоматический подхват изменений в импортированных модулях


0

0

Собсно сабж. Как пример такой возможности... django. я могу править исходники своего проекта, при этом, не рестартуя весь джанго, изменения автоматически подхватываются.

пытался задать вопрос на linuxforum.ru, но там что-то бредовое с фоновым обходом по всем файлам предложили. в последней надежде пришел сюда.

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

Deleted

Ключевое слово reload.

ЗЫ и про импорт надеюсь ты в курсе, что он не перезагружает модулей, а только ассоциирует имена с модулями?

cathode
()

django/utils/autoreload.py

def reloader_thread():
    mtimes = {}
    win = (sys.platform == "win32")
    while RUN_RELOADER:
        for filename in filter(lambda v: v, map(lambda m: getattr(m, "__file__", None), sys.modules.values())):
            if filename.endswith(".pyc") or filename.endswith("*.pyo"):
                filename = filename[:-1]
            if not os.path.exists(filename):
                continue # File might be in an egg, so it can't be reloaded.
            stat = os.stat(filename)
            mtime = stat.st_mtime
            if win:
                mtime -= stat.st_ctime
            if filename not in mtimes:
                mtimes[filename] = mtime
                continue
            if mtime != mtimes[filename]:
                sys.exit(3) # force reload
        time.sleep(1)

Так что inotify - это супер красивое решение, по сравнению с Django :)

Davidov ★★★★
()
Ответ на: комментарий от Davidov

Да, я уже как раз-таки фтыкаю в этот код и мягко говоря офигеваю :))) це ж жопа. Не думал, что так реализовано.

Deleted
()

А вот у меня как раз проблема с django. При изменении view и последующей перегрузке странички изменения не отображаются. Точнее, могут отобразиться, а могут нет, могут через раз... Подскажите, почему?

SOmni ★★
()
Ответ на: комментарий от Deleted

Как сообщают комментарии это код не django, а cherrypy. Если посмотрите в код django, то увидите, что используется он в 1 единственном месте: в собственном http сервере на питоне для разработчиков без апача.

Довольно неплохой способ autoreload'а сделан в mod_python (смотреть модуль cache, класс ModuleCache).

anonymous
()
Ответ на: комментарий от SOmni

http://www.djangoproject.com/documentation/modpython/

When deploying Django sites on mod_python, you’ll need to restart Apache each time you make changes to your Python code.

If you use mod_python for your development server, you can avoid the hassle of having to restart the server each time you make code changes. Just set MaxRequestsPerChild 1 in your httpd.conf file to force Apache to reload everything for each request. But don’t do that on a production server, or we’ll revoke your Django privileges.

anonymous
()
Ответ на: комментарий от anonymous

>Just set MaxRequestsPerChild 1 in your httpd.conf file to force Apache to reload everything for each request.

весело :))))))))))))))

и тут же приписка...

>But don’t do that on a production server

что собсно и подтврждает всю абсурдность этого подхода ибо оно сдохнет в продакшене.

Deleted
()
Ответ на: комментарий от Deleted

Этот подход только для разработчиков, которые вынуждены локально тестировать на apache и mod_python, а не на mod_wsgi, mod_fastcgi, собственном джанговском сервере, etc.

anonymous
()
Ответ на: комментарий от anonymous

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

Deleted
()
Ответ на: комментарий от Deleted

> Да я бы так не сказал. Вот к примеру, у тебя есть приличная система, под приличной нагрузкой. Пришло время сделать апдейт, а останавливать этот сервис тебе крайне критично, посему такая вещь крайне удобна. Достаточно обновить модифицированные модули и питон сам подхватит все изменения.

Вряд ли на питоне кто-то будет писать сервис для работы большим количеством долговременных сессий - это не эрланг, всё-таки. А раз в неделю остановить сайт на минутку, чтобы сделать svn up (или что вы там используете) - не проблема даже для слэшдота. Или вы свои сайты по 5 раз в день обновляете?

anonymous
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.