Проект Django (apache, mod_wsgi) не может импортировать пакеты пространства имен - PullRequest
2 голосов
/ 13 ноября 2010

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

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

1 Ответ

2 голосов
/ 13 ноября 2010

Посмотрев еще, я нашел ответ в документах для 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 (вместо добавления к * 1015)* как я делал) прояснил все вопросы.

...