有人能解释一下这种奇怪的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时正在做一些我不理解的事情,谢谢!这很有道理——我想我已经盯着这个看了太久了