导入Python模块时出现疯狂行为

4 投票
1 回答
787 浏览
提问于 2025-04-17 16:29

我在用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了。

撰写回答