当前位置: 首页 > 知识库问答 >
问题:

尝试导入python模块时的疯狂行为

萧宣
2023-03-14

我想用Apache mod-wsgi部署的django webapp有一些问题,我已经将它们追溯到这一行(django标记模块丢失):

[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

已安装标记。。。

[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@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用户不能!!!!!我如何才能使这项工作????

我已经对django tagging/usr/lib/python2.6/site-packages/的所有权限进行了双重和三重检查,它们与我的其他软件包相同。

更新1:我真的不记得我是如何安装django标记模块的,但可能是作为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个答案

凌钊
2023-03-14

我经历过类似的行为,并最终将要导入的模块的确切路径添加到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 stable和testing最近在apache2中的设置不再需要sys.path.append。

 类似资料:
  • 本书是一部真实再现程序员成长历程的原创小说,以作者的学习、工作、生活为原型,分为大学、工作、创业三部分,环环相扣,精彩迭出,其中作为主线的实际项目案例都基于作者深厚的技术积淀。本书生动描写了软件行业中的形形色色的人和事,形象而深刻、生动而亲切,充满了智慧的职场警句,能让不同职业的读者都受益匪浅。

  • 根据这个答案,您可以使用来使用类似这样的相对导入: 为什么相对导入不适用于sklearn。特征提取。文本 我验证了是一个具有以下功能的模块: 编辑 “不工作”,我的意思是它不导入模块。 我正在使用Python 3.4 绝对方式工作: 相对方式不:

  • 我正在尝试将spree store安装到我的应用程序中,当我在终端中输入时,我收到以下错误: 来源https://rubygems.org 宝石“轨道”、“4.2.5.1” 宝石'pg','~ gem'sass rails','~ 宝石“丑陋的” 宝石咖啡轨道 gem'jquery rails' gem“涡轮链接” 宝石jBuilder 创业板“sdoc”~ 小组:开发,:测试 调试器控制台gem

  • 我试图上传一个图像到内存使用multer,然后处理它与夏普和保存到磁盘。当我尝试在我的中间件中做多个module.exports时。 错误是: TypeError FileUpload.Single不是函数 到目前为止的路线是: 当我刚刚有下面的路由之前,尝试添加图像处理,我没有得到一个错误;

  • 问题内容: 导入glib失败,原因: 我怎样才能解决这个问题? Python版本是Python 2.7.3rc2。操作系统是Debian。 问题答案: 该模块是针对使用UCS-4作为其内部表示形式构建的Python构建的。您的Python是使用UCS-2作为内部表示构建的。重建模块,或重建Python。 官方FAQ中提到了此问题。这在python问题8654中进行了深入讨论。

  • 主要内容:import 模块名 as 别名,from  模块名 import 成员名 as 别名使Python 进行编程时,有些功能没必须自己实现,可以借助 Python 现有的标准库或者其他人提供的第三方库。比如说,在前面章节中,我们使用了一些数学函数,例如余弦函数 cos()、绝对值函数 fabs() 等,它们位于 Python 标准库中的 math(或 cmath)模块中,只需要将此模块导入到当前程序,就可以直接拿来用。 前面章节中,已经看到使用 import 导入模块的语法,但实际上