mod_wsgi Python无法从标准库导入
我创建了两个Python环境,使用的是virtualenv:/usr/local/pythonenv/BASELINE
和 /usr/local/pythonenv/django1
。这两个环境都是用--no-site-packages选项创建的。然后我在django1环境中用easy_install安装了Django。
我的wsgi.conf文件中有一行代码用来设置Python解释器:
WSGIPythonHome /usr/local/pythonenv/BASELINE
我的django.wsgi文件开头是这样的:
import site
site.addsitedir('/usr/local/pythonenv/django1/lib/python2.7/site-packages')
import os
import sys
但是当我尝试访问我的网站时,出现了500错误,而httpd/error_log中包含:
[error] Traceback (most recent call last):
[error] File "/service/usr/local/django_apps/apache/django.wsgi", line 1, in ?
[error] import site
[error] ImportError: No module named site
我搞不懂为什么Python解释器无法导入它自己的标准库。我甚至不知道怎么检查httpd是否在使用/usr/local/pythonenv/BASELINE中的解释器,所以这应该是个好的开始。
编辑:这虽然无关,但我在考虑应该把这个问题发到这里还是ServerFault。对此方面的建议非常感谢。
编辑:多亏了http://code.google.com/p/modwsgi/wiki/DebuggingTechniques,我获得了一些调试信息。我修改了我的django.wsgi脚本,使其包含:
import sys
def application(environ, start_response):
status = '200 OK'
output = 'Hello World!'
print >> environ['wsgi.errors'], sys.path
print >> environ['wsgi.errors'], sys.prefix
print >> environ['wsgi.errors'], sys.executable
response_headers = [('Content-type', 'text/plain'), ('Content-Length', str(len(output)))]
start_response(status, response_headers)
return [output]
这将Python解释器的信息写入了/var/log/httpd/error_log。错误输出如下:
[error] ['/usr/local/pythonenv/BASELINE/lib64/python24.zip', '/usr/local/pythonenv/BASELINE/lib64/python2.4/', '/usr/local/pythonenv/BASELINE/lib64/python2.4/plat-linux2', '/usr/local/pythonenv/BASELINE/lib64/python2.4/lib-tk', '/usr/local/pythonenv/BASELINE/lib64/python2.4/lib-dynload']
[error] /usr/local/pythonenv/BASELINE
[error] /usr/bin/python
所以sys.path和sys.executable指向了我的问题。出于某种原因,sys.path使用了一些不存在的lib文件(BASELINE甚至没有lib64目录,而且它是用Python2.7创建的),而sys.executable显示mod_wsgi仍在运行默认的/usr/bin/python解释器,而不是/usr/local/pythonenv/BASELINE/bin中的解释器。
我不确定为什么会这样,但至少我现在知道多了一些信息。
编辑:这个问题解决了,但Django仍然显示“Python Executable: /usr/bin/python”,尽管它应该是(根据我所能判断的,确实是,因为Python版本是2.7.2)使用/usr/local/bin/python。这正常吗?
1 个回答
你的 mod_wsgi 可能没有和 Python 2.7 一起编译。也就是说,如果你用一个 Python 版本创建了虚拟环境,但 mod_wsgi 是用另一个 Python 版本编译的,那就不能一起使用。
可以参考以下内容:
http://code.google.com/p/modwsgi/wiki/CheckingYourInstallation#Python_Shared_Library
并按照文档里的步骤进行检查。