导入Python模块时出现疯狂行为
我在用Apache的mod-wsgi部署一个Django网页应用时遇到了一些问题,经过排查发现问题出在这一行(缺少django-tagging模块):
[Wed Feb 20 13:08:42 2013] [error] [client 172.19.130.50] ImportError: No module named tagging
现在,当我尝试以root用户和apache用户运行pip-python时,输出是这样的(我用的是CENTOS 6):
[root@app1 site-packages]# pip-python freeze | grep tag django-tagging==0.3.1 django-taggit==0.9.3
Tagging模块已经安装...
[root@app1 site-packages]# sudo -u apache pip-python freeze | grep tag django-tagging==0.3.1 django-taggit==0.9.3
Apache用户的输出也是一样的!
[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 >>>
好的,root用户可以导入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 >>>
但是apache用户却不行!!!!我该怎么解决这个问题???
我已经仔细检查过/usr/lib/python2.6/site-packages/下django-tagging的权限,和其他模块是一样的。
更新 1: 我不太记得我是怎么安装django-tagging模块的——但可能是以root身份安装的,因为apache不能全局安装模块!
更新 2: 这是martijn-pieters建议的输出结果:
[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')() )
结果完全一样 :(
更新 3: 是的,apache用户可以加载其他模块:
[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
更新 4:我真是讨厌自己。问题出在/usr/lib/python2.6/site-packages/tagging/目录的访问权限上!它的权限是drw-r--r-- (644),而正确的应该是drwxr-xr-x(755),所以apache用户无法进入这个目录 :(
现在一切都正常了,谢谢大家的帮助!
1 个回答
2
我遇到过类似的情况,最后我在Django的wsgi.py文件里添加了要导入模块的确切路径:
import sys
PACKAGES ='/usr/local/lib/python2.6/dist-packages/'
sys.path.append(PACKAGES + 'django_compressor-1.1.1-py2.6.egg')
希望这能帮到你。
谁该负责呢?我也不太确定,可能是apache,也可能是mod_wsgi。我是在Ubuntu 10.04的apache2上遇到这个问题的。而在最近的Debian稳定版和测试版的apache2设置中,就不需要再使用sys.path.append了。