uwsgi + Django + virtualenv incapable de ramasser _functools (erreur d'importation)
Question
OK, donc je l'ai essayé avec et sans virtualenv:
uwsgi --home /home/auston/new_proj/ --socket /tmp/uwsgi2.sock --chmod-socket --module app_wsgi --pp /home/auston/new_proj/nikeshere --logto /tmp/uwsgi.log --master --processes 4 -P
Quasiment peu importe quoi, je reçois ceci:
*** Starting uWSGI 0.9.6.5 (32bit) on [Thu Oct 21 08:05:44 2010] ***
compiled with version: 4.4.3
Python version: 2.6.6 (r266:84292, Oct 21 2010, 04:07:38)
[GCC 4.4.3]
your memory page size is 4096 bytes
allocated 412 bytes (0 KB) for 1 request's buffer.
Setting PythonHome to /home/auston/new_proj/...
binding on UNIX socket: /tmp/uwsgi2.sock
chmod() socket to 666 for lazy and brave users
your server socket listen backlog is limited to 64 connections
added /home/auston/new_proj/nikeshere to pythonpath.
initializing hooks...done.
['/home/auston/new_proj/nikeshere', '.', '', '/home/auston/new_proj/lib/python2.6/site-packages/setuptools-0.6c11-py2.6.egg', '/home/auston/new_proj/lib/python2.6/site-packages/pip-0.8.1-py2.6.egg', '/home/auston/new_proj/lib/python26.zip', '/home/auston/new_proj/lib/python2.6', '/home/auston/new_proj/lib/python2.6/plat-linux2', '/home/auston/new_proj/lib/python2.6/lib-tk', '/home/auston/new_proj/lib/python2.6/lib-old', '/home/auston/new_proj/lib/python2.6/lib-dynload', '/usr/lib/python2.6', '/usr/lib/python2.6/plat-linux2', '/usr/lib/python2.6/lib-tk', '/home/auston/new_proj/lib/python2.6/site-packages', '/usr/local/lib/python2.6/dist-packages/pip-0.8.1-py2.6.egg', '/usr/local/lib/python2.6/site-packages', '/usr/local/lib/python2.6/dist-packages', '/usr/lib/python2.6/dist-packages', '/home/auston/new_proj/nikeshere', '/usr/local/lib/python2.6']
Traceback (most recent call last):
File "/home/auston/new_proj/nikeshere/app_wsgi.py", line 11, in <module>
import django.core.handlers.wsgi
File "/usr/local/lib/python2.6/site-packages/django/core/handlers/wsgi.py", line 1, in <module>
from threading import Lock
File "/usr/lib/python2.6/threading.py", line 13, in <module>
from functools import wraps
File "/usr/lib/python2.6/functools.py", line 10, in <module>
from _functools import partial, reduce
ImportError: No module named _functools
Si je change --home à /usr/local/lib/python/2.6 je reçois échouer sur mon importation app_wsgi.py d'os. Ici, il est, au-dessous, juste au cas où:
import sys
import os
sys.path.append(os.path.abspath(os.path.dirname(__file__)))
import django.core.handlers.wsgi
application = django.core.handlers.wsgi.WSGIHandler()
Essentiellement, je vous demande, comment puis-je uwsgi reconnaître functools ou se concentrer sur le droit chemin (chemin est en sortie ci-dessus). Je vous serais reconnaissant toute aide que vous pouvez donner les gars !!
P.S. Ubuntu 10.04 - uwsgi 0.9.6.5 - Nginx 0.8.53 - env ??virtuel Python 2.6.5 - "régulière (ou système)" Python 2.6.6 - Django 1.2.3
Mise à jour:
j'ai pu uwsgi arriver à commencer à accepter des demandes si j'omettent le « --module » comme ceci:
uwsgi --home /home/auston/new_proj --socket /tmp/uwsgi2.sock --chmod-socket --pp /home/auston/new_proj/nikeshere --logto /tmp/uwsgi.log --master --processes 4 -P
mais maintenant je reçois une application non trouvée erreur:
"Erreur uwsgi application wsgi not found "
Je suis plus proche, mais je voudrais encore apprécier des suggestions que l'application ne se trouve pas parce que je ne peux pas inclure le module nécessaire pour le charger!
La solution
Donc, comme indiqué plus haut, le problème a été avec le PYTHONPATH et ce de l'incapacité de trouver un module _functools nommé.
Apparemment, _functools est un module c & I nécessaire pour ajouter le Chemin d'accès de la PYTHONPATH afin qu'il soit trouvé, de sorte que la différence par rapport à l'wsgi.py d'origine, est maintenant:
import sys
sys.path.append('/usr/local/lib/python2.6/lib-dynload') # to load _functools
sys.path.append('/usr/local/lib/python2.6/site-packages') # to load django
sys.path.append('/usr/local/lib/python2.6/dist-packages') # cautionary to load django
sys.path.append('/usr/lib/python2.6') # to load os
import os
os.environ['DJANGO_SETTINGS_MODULE'] = 'iwin.settings'
import django.core.handlers.wsgi
application = django.core.handlers.wsgi.WSGIHandler()
Très hacky, mais cela fonctionne pour l'instant ...
Autres conseils
Je sais que ce vieux sujet et les versions de blocs de construction pile changé, mais j'ai eu le même problème avec ne pas reconnaître sous uwsgi installé libs dans virtualenv. La solution est de paramètre de point d'origine pour virtualenv, comme indiqué ci-dessous (extrait de https: / /uwsgi.readthedocs.org/en/latest/tutorials/Django_and_nginx.html ).
Donc pour moi commande:
uwsgi --http :8000 --module ii.wsgi --home /home/dev/.virtualenvs/ii_env/
travaillé, tout en étant dans la demande de django (ii) le répertoire.
# mysite_uwsgi.ini file
[uwsgi]
# Django-related settings
# the base directory (full path)
chdir = /path/to/your/project
# Django's wsgi file
module = project.wsgi
# the virtualenv (full path)
home = /path/to/virtualenv
# process-related settings
# master
master = true
# maximum number of worker processes
processes = 10
# the socket (use the full path to be safe
socket = /path/to/your/project/mysite.sock
# ... with appropriate permissions - may be needed
# chmod-socket = 664
# clear environment on exit
vacuum = true
Consultez http://blog.zacharyvoase.com/2010 / 03/05 / django-uwsgi-nginx / . Il utilise jeu très similaire vers le haut.
J'ai eu problème très similaire et je l'ai trouvé ceci:
Lorsque vous installez virtuelenv, il installe 'la bibliothèque standard de Python en créant des liens symboliques à l'original (en) comme /usr/lib/python2.7. Mais lorsque vous vérifiez votre virtualenv répertoire Python lib, il y a des liens symboliques créés pour seulement quelques bibliothèques de base. Votre functools est probablement pas parmi eux.
Donc, la solution est de créer le lien symbolique manuellement. Il est un PITA, parce que vous pourriez avoir à créer beaucoup de liens symboliques, mais il semble comme une solution propre pour moi. Vous ne devez pas pirater des fichiers source et il est transparent.
Le lien symbolique doit être créé pas à la racine du venv_directory
, mais par exemple.
venv_directory/lib/python2.7/site-packages/
Je espère que ça fonctionne pour vous!