Django, Python: перезагрузить функцию в оболочке - PullRequest
5 голосов
/ 07 октября 2010

Я работаю в django IPython-shell, который можно запустить с manage.py shell.Когда я загружаю функцию extern в оболочку для тестирования, все в порядке.Но когда я делаю изменения в функции, оболочка все еще имеет старую версию функции.Даже если я сделаю новый импорт.

Кто-нибудь знает, как перезагрузить актуальную версию функции?

Спасибо в отношении!

Редактировать: я использую Windows - еслиэто имеет значение.

Ответы [ 5 ]

6 голосов
/ 18 июня 2012

Я перезагружаю модуль, удаляя его из sys.modules и делаю новый импорт.

import sys
sys.modules.pop('your.module')
import your.module
# or
from your.module import your_function
2 голосов
/ 07 октября 2010

попробуйте использовать встроенную функцию «перезагрузки» на нужном модуле.

http://docs.python.org/library/functions.html?highlight=reload#reload

1 голос
/ 07 октября 2016

Включить расширение автозагрузки IPython перед импортом любого кода:

%load_ext autoreload
%autoreload 2

Я использую его с обычной оболочкой django, и она отлично работает, хотя и имеет некоторые ограничения:

Предостережения:

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

  • Функции и классы, импортированные с помощью «из xxx import foo», обновляются до новых версий при перезагрузке «xxx».
  • Методы и свойства классов обновляются при перезагрузке, поэтому вызов ccoo () для объекта «c», созданного до перезагрузки, приводит к выполнению нового кода для «foo».

Некоторые из известных оставшихся предостережений:

  • Замена объектов кода не всегда успешна: изменение @property в классе на обычный метод или метод на переменную-член может вызвать проблемы (но только для старых объектов).
  • Функции, которые были удалены (например, с помощью мартышки) из модуля до его перезагрузки, не обновляются.
  • Модули расширения C не могут быть перезагружены, и поэтому не могут быть автоматически перезагружены. *

источник: https://ipython.org/ipython-doc/3/config/extensions/autoreload.html#caveats

Еще один отличный вариант - написать свой код в отдельном скрипте и отправить его в оболочку django, например:

manage.py shell < my_script.py
0 голосов
/ 16 декабря 2015

Самое простое решение, которое я нашел, это комбинация shell_plus и iPython, которая автоматически перезагружает функции.

  1. pip install ipython
  2. pip install django-extensions
  3. добавить 'django_extensions' к вашему INSTALLED_APPS
  4. python manage.py shell_plus
0 голосов
/ 15 июля 2012

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

Он основан на методике из неправильного ответа выше , где вы удаляете модульиз sys.modules затем импортировать его.

...