【发布时间】:2011-10-13 22:03:13
【问题描述】:
我用 virtualenv 创建了两个 python 环境:
/usr/local/pythonenv/BASELINE 和 /usr/local/pythonenv/django1。两者都是使用 --no-site-packages 创建的。
我用easy_install将django安装到django1环境中。
我的 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 可执行文件:/usr/bin/python”,即使它应该是(据我所知,它是,因为 Python 版本:2.7.2)使用/usr/local/bin/python。这正常吗?
【问题讨论】:
标签: python mod-wsgi virtualenv