Python / Django импортирует неправильный модуль (относительный, когда он должен быть абсолютным) - PullRequest
2 голосов
/ 23 декабря 2010

Я использую Django 1.2 pre-alpha и Python 2.4.Да, я знаю, но я застрял с этим.В настоящее время мы не можем выполнить обновление, и я все равно сомневаюсь, что это ответ.

У меня есть две библиотеки тегов шаблонов, foo и bar.Тем не менее, foo также является именем пакета верхнего уровня, и это, случается, пакет bar:

foo-1.2.3/
  foo/
    conf/
      settings.py
    templatetags/
      bar.py

bar-4.5/
  somepackage/
    templatetags/
      foo.py

Библиотека тегов bar.py содержит следующую строку:

from foo.conf import settings

... и вы ожидаете, что он загрузит foo-1.2.3/foo/conf/settings.py.

Но нет:

TemplateSyntaxError: 'bar' не является допустимым тегомбиблиотека: не удалось загрузить библиотеку шаблонов из django.templatetags.bar, нет модуля с именем conf

К сожалению, Django выполняет небольшую магию и связывает все библиотеки тегов шаблонов с django.templatetags.*,Таким образом, bar импортируется как django.templatetags.bar, а когда он вызывает from foo.conf import settings, он в итоге импортирует bar-4.5/somepackage/templatetags/foo.py.Тьфу!

У вас есть идеи, как это исправить?

Я установил точку останова прямо перед импортом, и я подтвердил, что foo-1.2.3находится в начале sys.path, но ключевое слово import все равно находит неправильное foo.

Если это поможет, обратите внимание, что я могу изменить пакет foo-1.2.3 (поскольку он был проверен локальнои постепенно сокращается), но я отказываюсь изменять пакет bar-4.5 (поскольку это пакет с открытым исходным кодом, установленный в масштабе всей системы).

1 Ответ

1 голос
/ 24 декабря 2010

После нескольких часов взлома, это сработало.

Оригинальный код:

from foo.conf import settings

Новый код:

foo = __import__('foo')
conf = __import__('foo.conf').conf
settings = __import__('foo.conf.settings').conf.settings

(вероятно, яне нужна вторая строка.)

Ewww.

...