Le projet Django (apache, mod_wsgi) ne peut pas importer de paquets d’espace de noms

Lors de l’installation de django-piston du repo bitbucket avec pip, j’ai remarqué quelque chose de bizarre (première ligne en retrait de la sortie):

$ 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 n’installe pas le __init__.py du piston, indiquant que c’est parce que ‘piston’ est spécifié comme l’un des setup.py namespace_packages dans le setup.py .

De plus, lorsque j’ai regardé dans le fichier “django_piston-0.2.3rc1-nspkg.pth”, je trouve que c’est ce qui semble être une tentative de “paquets virtuels”:

 # 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) 

Je peux voir ce que ça fait ici; il s’agit essentiellement de créer un “faux module”, où devrait se trouver le piston, qui regroupe essentiellement tous les sous-modules du piston.

Cela semble bien fonctionner pour le travail en ligne de commande (je peux importer des pistons depuis le shell django [bien que ce soit ], et les choses semblent bien fonctionner avec runserver.) project, s’exécutant sur apache mod_wsgi, génère une erreur 500 sur chaque page, car il n’y a “aucun module nommé piston.handler”.

J’ai exclu les problèmes de cheminement de python; le répertoire site-packages est dans le chemin pour toutes les tentatives. Je ne connais pas d’autres raisons pour lesquelles cela se comporterait comme ça, des idées?

Après avoir cherché plus, j’ai découvert la réponse dans les docs pour mod_wsgi :

En tant qu’étape supplémentaire, le fichier de script WSGI décrit dans les instructions sera modifié pour recouvrir l’environnement virtuel de l’application au-dessus de l’environnement de base. Cela se ferait en ajoutant au tout début du script WSGI ce qui suit:

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

Notez que dans ce cas, le chemin d’access complet au répertoire ‘site-packages’ pour l’environnement virtuel doit être spécifié et pas uniquement la racine de l’environnement virtuel.

Utiliser ‘site.addsitedir ()’ est un peu différent de simplement append le répertoire à ‘sys.path’ car la fonction ouvrira tous les fichiers ‘.pth’ situés dans le répertoire et les traitera. Ceci est nécessaire pour s’assurer que tous les répertoires spéciaux liés aux œufs Python sont automatiquement ajoutés à «sys.path».

L’ajout de l’appel site.addsitedir à mon script wsgi (au lieu d’append à sys.path , comme je l’avais fait) a permis d’éliminer tous les problèmes.