【问题标题】:mod_wsgi python can't import from standard librarymod_wsgi python 无法从标准库导入
【发布时间】: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


    【解决方案1】:

    您的 mod_wsgi 可能不是针对 Python 2.7 编译的。您不能将 virtualenv 用于一个 Python 版本,而 mod_wsgi 针对不同的 Python 版本编译。

    读自:

    http://code.google.com/p/modwsgi/wiki/CheckingYourInstallation#Python_Shared_Library

    并检查该文档。

    【讨论】:

    • 是的,这就是问题所在。我以为我已经针对 Python 2.7 编译了 mod_wsgi,因为我运行了 ./configure --with-python=/usr/local/bin/python 然后进行了 make 和 make install,但这不起作用,因为我还有旧对象坐在那里。我必须清理干净,然后完成构建顺序。
    猜你喜欢
    • 1970-01-01
    • 2020-11-13
    • 2018-12-03
    • 1970-01-01
    • 2016-09-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多