Django中的Python路径不一致-双模块导入

Posted

技术标签:

【中文标题】Django中的Python路径不一致-双模块导入【英文标题】:Python Path not consistent in Django- double module imports 【发布时间】:2014-06-24 23:58:46 【问题描述】:

我在我的 Django 项目中遇到问题,我两次导入同一个模块。这导致我的单元测试失败:该单元测试检查通过解析 URL 找到的视图是否与从正在测试的应用程序中导入的视图相同。所以,我的测试文件看起来像:

from django.core.urlresolvers import resolve
from django.tests import TestCase
from .views import index

class IndexText(TestCase):
    def test_root_url_resolves_to_index_view(self):
        found = resolve('/someapp/')
        import pdb; pdb.set_trace()           # Using this to debug because the below assertion is failing
        self.assertEqual(found.func, index)

上述断言失败,因为两个函数不相等。在pdb中调试时,我发现found.func.__module__someapp.views,而index.__module__projectName.someapp.views

我在 Freenode 上的 #django 中被告知这可能是因为虽然我最近更新到 Django 1.6,但我使用的是旧的 1.3 项目结构,其中项目 settings.py 和 urls.py 位于项目的根目录中在manage.py旁边。

我已通过在我的项目根目录中创建一个与包含项目根目录的目录同名的新目录来解决此问题,并将我的 urls.py 和 settings.py 放在该目录中。所以,我的目录结构看起来像这样:

/home
  /joseph
    /myWorkspace
      /projectName
        manage.py
        /projectName
          __init__.py
          urls.py
          settings.py
        /someapp
          __init__.py
          views.py
          tests.py
        /someotherapp
        / ... and so on ...

当我通过manage.py shell 打开shell,导入sys 并打印sys.path 时,该列表中的第一个目录是/home/joseph/myWorkspace/projectName,这对我来说似乎是正确的。 python 路径的其余部分看起来很正常,指向不同的站点包等。

但是,当我通过manage.py test someapp 从上面运行测试时,如果我在 pdb 中打印 sys.path,我会看到我的 python 路径首先包含/home/joseph/myWorkspace,并且 @987654331 @。这对我来说似乎不正确,我认为这可能就是我遇到双重导入问题的原因。

我没有在我的环境变量中设置 PYTHONPATH。据我所知,我也没有在我的应用程序或设置中对 sys.path 进行任何调整。

我不知道从哪里开始,谁能提供一些见解?

【问题讨论】:

确保 /home/joseph/myWorkspace/projectName 不包含 init.py 以便 Python 不会将其视为模块文件夹并从那里导入任何内容。还要尝试弄清楚为什么 myWorkspace 最终会进入 PYTHONPATH。你可以例如Monkey-patch sys.path in manage.py 以捕获所有修改尝试。 如此简单,就是这样。 “更新”到 1.4 目录结构时,我没有删除根目录中的 init.py。请将其发布为答案,我会将其标记为正确。问题解决了! 【参考方案1】:

正如@Mikko Ohtamaa 提到的,问题是项目根目录包含__init__.py

【讨论】:

以上是关于Django中的Python路径不一致-双模块导入的主要内容,如果未能解决你的问题,请参考以下文章

python的Django views 文件中引入模块问题

Django + uwsgi + nginx。导入错误:没有名为py的模块

django中的python模块未正确导入

Python中的模块

Python 20 模块

python已安装了一个包,但是导入包中的模块时报错没有这个包