2014-05-07 7 views
1

У меня возникла проблема в моем проекте Django, где я дважды импортирую тот же модуль. Это приводит к сбою модульного теста в моем случае: этот модульный тест проверяет, что представление, найденное при разрешении URL-адреса, представляет собой тот же вид, импортированный из тестируемого приложения. Таким образом, мой файл тестов выглядит примерно так:Путь Python несовместим с импортом Django-double

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 находятся в корне проект вместе с 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, импорт 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 в своих приложениях или настройках.

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

+3

Убедитесь, что/дома/Жозеф/myWorkspace/Projectname не содержит __init__.py так Python не будет рассматривать его в качестве папки модуля и импортировать что-нибудь оттуда. Также попробуйте выяснить, почему myWorkspace попадает в PYTHONPATH. Вы можете, например, monkey-patch 'sys.path' в' manage.py', чтобы поймать все попытки модификации. –

+0

Так просто, это было именно оно. Я не удалял __init__.py в корневом каталоге при обновлении до структуры каталога 1.4. Пожалуйста, опубликуйте это как ответ, и я отметю это правильно. Задача решена! – Joseph

ответ

1

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