mod_wsgi python 无法从标准库导入

6
我已经使用virtualenv创建了两个Python环境: /usr/local/pythonenv/BASELINE/usr/local/pythonenv/django1。两者都是使用--no-site-packages选项创建的。 我使用easy_install在django1环境中安装了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”,尽管它应该(据我所知)使用/usr/local/bin/python,因为Python Version: 2.7.2。这正常吗?
1个回答

4

1
是的,这就是问题所在。我以为我已经使用./configure --with-python=/usr/local/bin/python编译了mod_wsgi并且执行了make和make install,但是这并没有起作用,因为旧的对象仍然存在。我必须先执行make clean,然后再进行构建序列。 - sans

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接