【问题标题】:Can someone explain this odd Python/Django import behaviour?有人可以解释这种奇怪的 Python/Django 导入行为吗?
【发布时间】:2011-10-05 08:12:51
【问题描述】:

我有一个目录结构如下的项目:

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

然后我得到了预期的 True。

我想我在使用 manage.py shell 时缺少关于导入如何工作或 Django 如何更改路径的一些内容。

谁能解释一下?

【问题讨论】:

  • Daniel Roseman - 你说这与 Django 无关。但是,如果我启动一个正常的 python 会话(同时 CD 到 mywebsite 中)并导入 mywebsite,那么我会得到预期的导入错误。我的怀疑是当我使用 manage.py shell 时,Django 正在做一些我不理解的路径

标签: python django


【解决方案1】:

当您打开 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)

【讨论】:

  • 谢谢!非常有道理——我想我已经盯着(和大喊)这个太久了:D
猜你喜欢
  • 1970-01-01
  • 2023-03-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-04-30
  • 2016-03-08
  • 2019-12-06
相关资源
最近更新 更多