Проект Django (apache, mod_wsgi) не может импортировать пакеты пространства имен

При установке django-piston из репозитория bitbucket с помощью pip я заметил нечто странное (первая строка с отступом выход):

$ pip install hg+http://bitbucket.org/jespern/django-piston
Downloading/unpacking hg+http://bitbucket.org/jespern/django-piston
Cloning Mercurial repository http://bitbucket.org/jespern/django-piston to /tmp/pip-v1h8Sh-build
Running setup.py egg_info for package from hg+http://bitbucket.org/jespern/django-piston
Installing collected packages: django-piston
Running setup.py install for django-piston
    Skipping installation of [venv]/lib/python2.6/site-packages/piston/__init__.py (namespace package)
    Installing [venv]/lib/python2.6/site-packages/django_piston-0.2.3rc1-py2.6-nspkg.pth
Successfully installed django-piston
Cleaning up

Pip не будет устанавливать __init__.py поршня, указывая на то, что это связано с тем, что «поршень» указан как один из namespace_packages в setup.py.

Далее, когда я заглянул внутрь файла "django_piston-0.2.3rc1-nspkg.pth", я нахожу это, что кажется попыткой "виртуальных пакетов":

# File: [virtualenv]/lib/python2.6/site-packages/django_piston-0.2.3rc1-py2.6-nspkg.pth
# Originally all on one line; broken apart here for readability.

import sys,new,os;
p = os.path.join(sys._getframe(1).f_locals['sitedir'], *('piston',));
ie = os.path.exists(os.path.join(p,'__init__.py'));
m = not ie and sys.modules.setdefault('piston',new.module('piston'));
mp = (m or []) and m.__dict__.setdefault('__path__',[]);
(p not in mp) and mp.append(p)

Я вижу, что он здесь делает; это в основном создание «фальшивого модуля», где поршень должен быть, который по существу объединяет все подмодули поршня.

Кажется, это отлично работает для работы из командной строки (я могу импортировать поршень из оболочки django [хотя его репр <module 'piston' (built-in)>], и все работает нормально с runserver.), но мой проект, работающий на apache mod_wsgi, выдает 500 ошибка на каждой странице, потому что "Нет модуля с именем поршень. обработчик".

Я исключил проблемы с путями Python; каталог site-packages находится в пути для всех попыток. Я не знаю других причин, по которым это могло бы вести себя так, есть идеи?


person eternicode    schedule 13.11.2010    source источник


Ответы (1)


Посмотрев еще немного, я обнаружил ответ в документации для mod_wsgi. :

Однако в качестве дополнительного шага файл сценария WSGI, описанный в инструкциях, будет изменен для наложения виртуальной среды для приложения поверх базовой среды. Это можно сделать, добавив в самом начале файла сценария WSGI следующее:

import site
site.addsitedir('/usr/local/pythonenv/PYLONS-1/lib/python2.5/site-packages')

Обратите внимание, что в этом случае необходимо указать полный путь к каталогу site-packages для виртуальной среды, а не только корень виртуальной среды.

Использование 'site.addsitedir()' немного отличается от простого добавления каталога в 'sys.path', так как функция открывает любые файлы '.pth', расположенные в каталоге, и обрабатывает их. Это необходимо для того, чтобы любые специальные каталоги, связанные с яйцами Python, автоматически добавлялись в 'sys.path'.

Добавление вызова site.addsitedir в мой скрипт wsgi (вместо добавления к sys.path, как я делал ранее) устранило все проблемы.

person eternicode    schedule 13.11.2010