有人能解释一下这种奇怪的Python/Django导入行为吗?
我有一个项目,其中目录结构如下所示:有人能解释一下这种奇怪的Python/Django导入行为吗?,python,django,Python,Django,我有一个项目,其中目录结构如下所示: mywebsite/ manage.py __init__.py myapp/ models/ __init__.py base.py myapp/models/base.py包含: class X(object): pass from base import X myapp/models/_init__.py包含: class X(object):
mywebsite/
manage.py
__init__.py
myapp/
models/
__init__.py
base.py
myapp/models/base.py包含:
class X(object):
pass
from base import X
myapp/models/_init__.py包含:
class X(object):
pass
from base import X
现在,如果我管理.py shell,我可以进行以下会话:
> 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
然后我就如期实现了
我想我遗漏了一些关于导入如何工作或Django在使用manage.py shell时如何更改路径的信息
有人能解释一下吗?当您打开Django shell时,它会将项目的路径添加到。您可以通过运行
import sys;在Django shell和普通python shell上打印sys.path
,并比较输出。您将注意到,Django shell的输出将mywebsite
目录的路径作为列表的第一项
基本上,这意味着两个导入创建两个不同的模块对象,因为它们是从中获取的。比较检查返回False,因为模块对象具有不同的id(内存地址)
丹尼尔·罗斯曼——你说这与德扬戈无关。然而,如果我启动了一个正常的python会话(同时CDed到mywebsite中)并导入mywebsite,那么我会得到一个预期的导入错误。我怀疑Django在使用manage.py Shell时正在做一些我不理解的事情,谢谢!这很有道理——我想我已经盯着这个看了太久了