有人可以解释这个奇怪的Python / Django导入行为吗?

时间:2011-10-05 08:12:51

标签: 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 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

然后我按预期得到了真实。

我认为在使用manage.py shell时,我遗漏了一些关于导入如何工作或Django如何改变路径的内容。

任何人都能解释一下吗?

1 个答案:

答案 0 :(得分:4)

当您打开Django shell时,它会将项目的路径添加到sys.path。你可以通过在Django shell和普通的python shell上运行import sys; print sys.path并比较输出来看到这一点。您将注意到Django shell的输出包含mywebsite目录的路径作为列表的第一项。

基本上,这意味着两个导入会创建两个不同的模块对象,因为它们来自different points in the search path。比较检查返回False,因为模块对象具有不同的id(内存地址)

# These two values will be different
id(mywebsite.myapp.models)
id(myapp.models)