我将Python 2.5升级到2.6,但现在出现“ImportError: No module named tagging.views”
问题
问题是:我在 /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 的包?
我不太确定的事情
也许它实际上是在 2.6 上运行,并且确实找到了
tagging
模块,但这个模块或其中的一部分不兼容,所以才会报No module named tagging.views
的错误?也许这和 2.5 到 2.6 没有关系,一直就存在这个问题?但我对此很怀疑,因为我在那段代码存在时进行了多次重启,都是正常工作的。
可能是 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 个回答
我觉得如果你把这个改一下可能就能工作了:
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 指令。