У меня возникла проблема в моем проекте 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 в своих приложениях или настройках.
Я не знаю, куда идти, может ли кто-нибудь дать какое-нибудь представление?
Убедитесь, что/дома/Жозеф/myWorkspace/Projectname не содержит __init__.py так Python не будет рассматривать его в качестве папки модуля и импортировать что-нибудь оттуда. Также попробуйте выяснить, почему myWorkspace попадает в PYTHONPATH. Вы можете, например, monkey-patch 'sys.path' в' manage.py', чтобы поймать все попытки модификации. –
Так просто, это было именно оно. Я не удалял __init__.py в корневом каталоге при обновлении до структуры каталога 1.4. Пожалуйста, опубликуйте это как ответ, и я отметю это правильно. Задача решена! – Joseph