I have some problems with a django webapp I want to deploy with Apache mod-wsgi and I've traced them down to this line (the django-tagging module is missing):
[Wed Feb 20 13:08:42 2013] [error] [client 172.19.130.50] ImportError: No module named tagging
Now, here's my output when I try to run pip-python (I'm using CENTOS 6) as root and as the apache user:
[root@app1 site-packages]# pip-python freeze | grep tag django-tagging==0.3.1 django-taggit==0.9.3
Tagging is installed...
[root@app1 site-packages]# sudo -u apache pip-python freeze | grep tag django-tagging==0.3.1 django-taggit==0.9.3
Apache user says the same !
[root@app1 /]# python Python 2.6.6 (r266:84292, Sep 11 2012, 08:34:23) [GCC 4.4.6 20120305 (Red Hat 4.4.6-4)] on linux2 Type "help", "copyright", "credits" or "license" for more information. >>> import tagging >>>
Ok root can import tagging !
[root@app1 /]# sudo -u apache python Python 2.6.6 (r266:84292, Sep 11 2012, 08:34:23) [GCC 4.4.6 20120305 (Red Hat 4.4.6-4)] on linux2 Type "help", "copyright", "credits" or "license" for more information. >>> import tagging Traceback (most recent call last): File "", line 1, in ImportError: No module named tagging >>>
But the apache user cannot !!!!! How can I make this work ????
I've double and triple checked all rights to /usr/lib/python2.6/site-packages/ for django-tagging and they are the same as my other packages.
Update 1: I don't really remember how I did install the django-tagging module - but probably as root since apache cannot install modules globally !
Update 2: Here's the output of martijn-pieters's suggestions:
[root@app1 /]# sudo -u apache python -c 'import sys; print sys.path' ['', '/usr/lib64/python2.6/site-packages/Twisted-12.1.0-py2.6-linux-x86_64.egg', '/usr/lib/python2.6/site-packages/django_cas-2.1.1-py2.6.egg', '/usr/lib64/python26.zip', '/usr/lib64/python2.6', '/usr/lib64/python2.6/plat-linux2', '/usr/lib64/python2.6/lib-tk', '/usr/lib64/python2.6/lib-old', '/usr/lib64/python2.6/lib-dynload', '/usr/lib64/python2.6/site-packages', '/usr/lib/python2.6/site-packages', '/usr/lib/python2.6/site-packages/setuptools-0.6c11-py2.6.egg-info'] [root@app1 /]# python -c 'import sys; print sys.path' ['', '/usr/lib64/python2.6/site-packages/Twisted-12.1.0-py2.6-linux-x86_64.egg', '/usr/lib/python2.6/site-packages/django_cas-2.1.1-py2.6.egg', '/usr/lib64/python26.zip', '/usr/lib64/python2.6', '/usr/lib64/python2.6/plat-linux2', '/usr/lib64/python2.6/lib-tk', '/usr/lib64/python2.6/lib-old', '/usr/lib64/python2.6/lib-dynload', '/usr/lib64/python2.6/site-packages', '/usr/lib/python2.6/site-packages', '/usr/lib/python2.6/site-packages/setuptools-0.6c11-py2.6.egg-info'] [root@app1 /]# sudo -u apache head `which pip-python` #!/usr/bin/python # EASY-INSTALL-ENTRY-SCRIPT: 'pip==0.8','console_scripts','pip' __requires__ = 'pip==0.8' import sys from pkg_resources import load_entry_point if __name__ == '__main__': sys.exit( load_entry_point('pip==0.8', 'console_scripts', 'pip')() ) [root@app1 /]# head `which pip-python` #!/usr/bin/python # EASY-INSTALL-ENTRY-SCRIPT: 'pip==0.8','console_scripts','pip' __requires__ = 'pip==0.8' import sys from pkg_resources import load_entry_point if __name__ == '__main__': sys.exit( load_entry_point('pip==0.8', 'console_scripts', 'pip')() )
The are exactly the same :(
Update 3: Yes, the apache user can load other modules:
[root@app1 /]# sudo -u apache python Python 2.6.6 (r266:84292, Sep 11 2012, 08:34:23) [GCC 4.4.6 20120305 (Red Hat 4.4.6-4)] on linux2 Type "help", "copyright", "credits" or "license" for more information. >>> import django >>> import twisted >>> import cairo
Update 4: I hate myself. The problem was the access rights of the /usr/lib/python2.6/site-packages/tagging/ directory! They were drw-r--r-- (644) instead of the correct drwxr-xr-x(755) so the apache user could not go inside the directory :(
Everything works fine now, thanks for all the help!
pip install
it? Did you install as user root or as user apache? Installing as different users gives you different access to modules in pip. – Henrik Anderssonsudo -u apache python -c 'import sys; print sys.path'
withpython -c 'import sys; print sys.path'
, andsudo -u apache head `which pip-python`
withhead `which pip-python`
perhaps? – Martijn Pieters♦