#python #django
#python #django
Вопрос:
У меня есть проект, в котором структура каталогов выглядит следующим образом:
mywebsite/
manage.py
__init__.py
myapp/
models/
__init__.py
base.py
myapp/models/base.py содержит:
class X(object):
pass
myapp/models/__init__.py содержит:
from base import X
Теперь, если я manage.py оболочка Я могу провести следующий сеанс:
> import mywebsite.myapp.models
> import myapp.models
> mywebsite.myapp.models.X == myapp.models.X
False
Однако, если я изменю myapp/models/__init__.py быть:
from myapp.models.base import X
Тогда я получаю True, как и ожидалось.
Я думаю, что мне чего-то не хватает в том, как работает импорт или как Django изменяет пути при использовании manage.py оболочка.
Кто-нибудь может это объяснить?
Комментарии:
1. Дэниел Розман — вы сказали, что это не имеет ничего общего с Django. Однако, если я запускаю обычный сеанс python (пока записан в mywebsite) и импортирую mywebsite, я получаю ошибку импорта, как и ожидалось. Я подозреваю, что Django делает что-то, чего я не понимаю, с путем, когда я использую manage.py оболочка
Ответ №1:
Когда вы открываете оболочку Django, она добавляет путь к вашему проекту sys.path
. Вы можете увидеть это, запустив import sys; print sys.path
оболочку Django и обычную оболочку python и сравнив результат. Вы заметите, что вывод из оболочки Django включает путь к mywebsite
каталогу в качестве первого элемента списка.
По сути, это означает, что два импорта создают два разных объекта модуля, поскольку они получены из разных точек пути поиска. Проверка сравнения возвращает False, поскольку объекты модуля имеют разные идентификаторы (адрес памяти)
# These two values will be different
id(mywebsite.myapp.models)
id(myapp.models)
Комментарии:
1. Спасибо! Имеет смысл — я думаю, что я слишком долго смотрел (и кричал) на это: D