我将Python 2.5升级到2.6,但现在出现“ImportError: No module named tagging.views”

0 投票
1 回答
1264 浏览
提问于 2025-04-16 14:18

问题

问题是:我在 /srv/python-environments/saltycrane/lib/python2.5/site-packages/tagging 里的 tagging 模块似乎没有被包含进来,因为我把系统升级到了 2.6,尽管我原本以为在虚拟环境中可以继续使用 2.5。

这是在 /var/log/apache2/error.log 中的错误信息:

[Thu Mar 24 00:08:35 2011] [error] [client 127.0.0.1] mod_wsgi (pid=10470): Exception occurred processing WSGI script '/srv/workarounds/apache/django.wsgi'.
[Thu Mar 24 00:08:35 2011] [error] [client 127.0.0.1] Traceback (most recent call last):
[Thu Mar 24 00:08:35 2011] [error] [client 127.0.0.1]   File "/usr/lib/pymodules/python2.6/django/core/handlers/wsgi.py", line 241, in __call__
[Thu Mar 24 00:08:35 2011] [error] [client 127.0.0.1]     response = self.get_response(request)
[Thu Mar 24 00:08:35 2011] [error] [client 127.0.0.1]   File "/usr/lib/pymodules/python2.6/django/core/handlers/base.py", line 141, in get_response
[Thu Mar 24 00:08:35 2011] [error] [client 127.0.0.1]     return self.handle_uncaught_exception(request, resolver, sys.exc_info())
[Thu Mar 24 00:08:35 2011] [error] [client 127.0.0.1]   File "/usr/lib/pymodules/python2.6/django/core/handlers/base.py", line 176, in handle_uncaught_exception
[Thu Mar 24 00:08:35 2011] [error] [client 127.0.0.1]     if resolver.urlconf_module is None:
[Thu Mar 24 00:08:35 2011] [error] [client 127.0.0.1]   File "/usr/lib/pymodules/python2.6/django/core/urlresolvers.py", line 239, in _get_urlconf_module
[Thu Mar 24 00:08:35 2011] [error] [client 127.0.0.1]     self._urlconf_module = import_module(self.urlconf_name)
[Thu Mar 24 00:08:35 2011] [error] [client 127.0.0.1]   File "/usr/lib/pymodules/python2.6/django/utils/importlib.py", line 35, in import_module
[Thu Mar 24 00:08:35 2011] [error] [client 127.0.0.1]     __import__(name)
[Thu Mar 24 00:08:35 2011] [error] [client 127.0.0.1]   File "/srv/workarounds/urls.py", line 3, in <module>
[Thu Mar 24 00:08:35 2011] [error] [client 127.0.0.1]     from tagging.views import tagged_object_list
[Thu Mar 24 00:08:35 2011] [error] [client 127.0.0.1] ImportError: No module named tagging.views

我的设置

首先,这是我的设置:

$ python --version
Python 2.6.6
$ python
>>> import django
django.VERSION
(1, 2, 3, 'final', 0)

我的 Django 项目放在 /srv 目录下。我的虚拟环境放在 /srv/python-environments 目录下。

如果我进入 /srv/ 目录并执行:

source python-environments/saltycrane/bin/activate

那么 Python 的版本就变成了:

$ python --version
Python 2.5.2

我的项目 /srv/workarounds 使用的是 /srv/workarounds/apache/django.wsgi,它的内容是:

import os, sys, site

virtualenv = '/srv/python-environments/saltycrane/'

ALLDIRS = [os.path.join(virtualenv, 'lib', 'python%s' % sys.version[:3], 'site-packages')]

# Remember original sys.path.
prev_sys_path = list(sys.path)

# Add project directory
sys.path.append( '/srv/' )
sys.path.append( '/srv/workarounds/' )

for directory in ALLDIRS:
    site.addsitedir( directory )

new_sys_path = []
for item in list(sys.path):
    if item not in prev_sys_path:
        new_sys_path.append(item)
        sys.path.remove(item)

sys.path[:0] = new_sys_path

os.environ['DJANGO_SETTINGS_MODULE'] = 'workarounds.settings'

import django.core.handlers.wsgi
application = django.core.handlers.wsgi.WSGIHandler()

这段代码的主要作用是在 Apache 运行 wsgi 时,把 /srv//srv/workarounds 加入到 Python 的路径中。

那么……

我该如何调整我的 wsgi,让它继续使用 Python 2.5.2 而不是 2.6?如果不行,我该如何用 pip 更新我的虚拟环境,以使用 Python 2.6 的包?

我不太确定的事情

  1. 也许它实际上是在 2.6 上运行,并且确实找到了 tagging 模块,但这个模块或其中的一部分不兼容,所以才会报 No module named tagging.views 的错误?

  2. 也许这和 2.5 到 2.6 没有关系,一直就存在这个问题?但我对此很怀疑,因为我在那段代码存在时进行了多次重启,都是正常工作的。

  3. 可能是 Django 的某个小版本更新,我可能把 1.1 或 1.2beta 更新到了 1.2.3 的正式版。

编辑:如果我有正确的 mod_wsgi.so,它是为 2.6 编译的。

/usr/lib/apache2/modules$ ldd mod_wsgi.so
    linux-gate.so.1 =>  (0xf57fe000)
    libpython2.6.so.1.0 => /usr/lib/libpython2.6.so.1.0 (0xb760f000)
    libpthread.so.0 => /lib/libpthread.so.0 (0xb75f6000)
    libdl.so.2 => /lib/libdl.so.2 (0xb75f2000)
    libutil.so.1 => /lib/libutil.so.1 (0xb75ed000)
    libm.so.6 => /lib/libm.so.6 (0xb75c7000)
    libc.so.6 => /lib/libc.so.6 (0xb7482000)
    libssl.so.0.9.8 => /usr/lib/i686/cmov/libssl.so.0.9.8 (0xb7438000)
    libcrypto.so.0.9.8 => /usr/lib/i686/cmov/libcrypto.so.0.9.8 (0xb72e0000)
    libz.so.1 => /usr/lib/libz.so.1 (0xb72cc000)
    /lib/ld-linux.so.2 (0xb788e000)

1 个回答

1

我觉得如果你把这个改一下可能就能工作了:

ALLDIRS = [os.path.join(virtualenv, 'lib', 'python%s' % sys.version[:3], 'site-packages')]

改成:

ALLDIRS = [os.path.join(virtualenv, 'lib', 'python2.5', 'site-packages')]

设置你的 WSGIPythonHome 是在使用 virtualenv 和 mod_wsgi 时的建议做法:

virtualenv --no-site-packages --python=python2.5 BASELINE

并且设置 mod_wsgi 使用这个作为 wsgipythonhome

基础环境

使用 virtual environments 和 mod_wsgi 的第一步是让 mod_wsgi 指向一个基础的 Python 环境。这个步骤其实是可选的,如果不做,系统的主 Python 安装(通常是 mod_wsgi 编译时使用的那个)会被用作基础环境。

虽然可以使用主 Python 安装,特别是在共享环境中,使用 mod_wsgi 的守护进程模式来为不同用户托管 WSGI 应用,但最好是让基础环境是一个干净的环境,'site-packages' 目录基本上是空的。这样就不会出现用户的 Python 虚拟环境和基础环境之间模块和包的冲突。

要创建一个干净的环境,可以使用 'virtualenv' 程序,在创建环境时需要加上 '--no-site-packages' 这个选项。

$ cd /usr/local/pythonenv

$ virtualenv --no-site-packages BASELINE
New python executable in BASELINE/bin/python
Installing setuptools............done.

注意,从哪个 Python 版本创建这个基础环境,必须和 mod_wsgi 编译时使用的 Python 版本相同。不能混用不同主版本或次版本的环境。

一旦基础 Python 环境创建完成,就应该在 Apache 主配置文件的全局部分定义 WSGIPythonHome 指令。这个指令应该指向由 'virtualenv' 脚本创建的基础环境的顶层目录。

WSGIPythonHome /usr/local/pythonenv/BASELINE

这个 Python 环境现在将作为所有在 mod_wsgi 下运行的 WSGI 应用的基础环境,无论它们是以嵌入模式还是守护进程模式运行。

如果你想使用主 Python 安装作为基础环境,就不需要设置 WSGIPythonHome 指令。

撰写回答