Путь Python несовместим с импортом двойного модуля Django

У меня возникла проблема в моем проекте 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.

В #django на Freenode мне сказали, что это может быть связано с тем, что, хотя я недавно обновился до Django 1.6, я использовал старую структуру проекта 1.3, где файлы settings.py и urls.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, импортирую sys и печатаю sys.path, первым каталогом в этом списке будет /home/joseph/myWorkspace/projectName, и мне это кажется правильным. Остальная часть пути python выглядит вполне нормально, указывая на разные пакеты сайта и т. д.

Однако, когда я запускаю свой тест сверху через manage.py test someapp, если я печатаю sys.path в pdb, я вижу, что мой путь python сначала содержит /home/joseph/myWorkspace, а также /home/joseph/myWorkspace/projectName. Мне это не кажется правильным, и я думаю, что это может быть причиной того, что у меня проблемы с двойным импортом.

Я не устанавливаю PYTHONPATH в переменных среды. Насколько я знаю, я также не вношу никаких изменений в sys.path в своих приложениях или настройках.

Я не знаю, куда идти отсюда, может ли кто-нибудь дать некоторое представление?


person Joseph    schedule 07.05.2014    source источник
comment
Убедитесь, что /home/joseph/myWorkspace/projectName не содержит init.py, чтобы Python не рассматривал его как папку модуля и ничего не импортировал оттуда. Также попытайтесь выяснить, почему myWorkspace оказывается в PYTHONPATH. Вы можете, например. monkey-patch sys.path в manage.py, чтобы отловить все попытки его модификации.   -  person Mikko Ohtamaa    schedule 08.05.2014
comment
Так просто, это было именно так. Я не удалял init.py в корневом каталоге при обновлении до структуры каталогов 1.4. Пожалуйста, опубликуйте это как ответ, и я отмечу это правильно. Задача решена!   -  person Joseph    schedule 08.05.2014


Ответы (1)


Как уже упоминалось @Mikko Ohtamaa, проблема заключалась в том, что корневой каталог проекта содержал __init__.py

person Joseph    schedule 21.05.2014