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

时间:2014-05-07 20:11:03

标签: python django python-module pythonpath

我在我的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.viewsindex.__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,而也是 /home/joseph/myWorkspace/projectName。这对我来说似乎不正确,我认为这可能是我遇到双重导入问题的原因。

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

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

1 个答案:

答案 0 :(得分:1)

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