为什么 httpd 似乎使用具有相同可执行文件的不同版本的 python?

为什么 httpd 似乎使用具有相同可执行文件的不同版本的 python?

我在 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 指令,请说明您将其设置为何。

相关内容