我在 RedHat 5 机器上运行 Apache httpd 2.4.4。我使用 Django 并通过 mod_wsgi 运行。我在 /usr/bin 中安装了 Python 2.4.3,在 /usr/local/bin 中安装了 Python 2.7.6,我想使用 2.7.6。我从源代码构建了 2.7.6,还构建了 mod_wsgi-3.4。
我使用 2.7.6 创建了一个虚拟环境,在命令 shell 中,python -V 告诉我它正在使用 2.7.6(执行 之后. virtpy/bin/activate
)。运行import sys; sys.version
也显示 2.7.6,并sys.executable
显示/www/sqla/virtpy/bin/python
。
当我从 httpd 运行它时,我在加载库时遇到问题,当我查看时sys.version
,我看到2.7.3。奇怪的是它sys.executable
仍然向我展示/www/sqla/virtpy/bin/python
,与我在命令 shell 中看到的完全相同。
具体来说,当 python 尝试加载 _socket 时,我从 httpd 看到此错误:
ImportError: /www/sqla/virtpy/lib/python2.7/lib-dynload/_socket.so: undefined symbol: _PyInt_AsInt
如果我尝试从命令 shell 导入 _socket,则没有问题。我已将. /www/sqla/virtpy/bin/activate
其添加到 /etc/sysconfig/httpd 中,并已使用该更改重新启动了 Apache。
同一个可执行文件怎么会给出不同版本的 Python?我怎样才能说服它使用正确的版本?
答案1
使用 mod_wsgi 文档中记录的检查来验证 mod_wsgi 的编译方式是否正确:
确保在执行此操作时检查未设置 LD_LIBRARY_PATH。提供 ldd 的输出。
还要指出除了 /usr/local 下的 Python 2.7 安装之外,是否还在 /usr 下安装了任何 Python 2.7,以及 /usr/lib 下是否有 Python 2.7 共享库。
如果您在 Apache 配置中使用了 WSGIPythonHome 指令,请说明您将其设置为何。