如何找到我的服务器正在使用的 Python 可执行文件?

如何找到我的服务器正在使用的 Python 可执行文件?

我是 Linux 新手。

我正在管理一个 (Linux - Apache - mod_wsgi - Django) 服务器,其中有多个 Python 安装。该站点目前正在运行,但我想找出使用​​哪个 Python 可执行文件来运行它。我知道它不是默认的。

另外,mod_wsgi 如何知道要使用哪个 Python 安装?该.wsgi脚本没有 shebang 行。

答案1

#! 行未被使用,并且通常不会放入 mod_wsgi 所使用的 WSGI 脚本文件中。

要确定使用了哪个版本/安装的 Python,需要进行两个部分的操作。

正如其他人指出的那样,第一步是找出 mod_wsgi.so 链接到哪个 Python 库。在大多数 UNIX 系统上,这是使用“ldd”命令完成的。

ldd mod_wsgi.so

在实际安装到正在使用的 Apache 模块目录中的 mod_wsgi.so 上运行此命令。这将告诉您 mod_wsgi 是针对哪个版本进行编译的。

如果您没有看到对 libpythonX.Y.so 文件的引用,则您的 mod_wsgi.so 已静态链接到 Python 库。虽然这可以工作,但只要 mod_python 未加载到同一个 Apache 中,依赖它就是一个非常糟糕的主意,因为使用 Python 库的静态链接会导致您的 Apache 进程不必要的膨胀,这是因为在使用静态链接的 Python 库加载 mod_wsgi.so 时必须进行运行时代码重定位。

请注意,在 mod_wsgi 下运行时,“sys.executable”的值没有任何意义,不能用作确定使用了哪个 Python 版本的手段。这是因为未使用命令行 Python。相反,正在运行的可执行文件实际上是 Apache,而 sys.executable 很可能会反映这一点。只有在运行 Apache 并加载 mod_wsgi.so 后,才会使用嵌入式 Python API 初始化 Python。同样,运行“which python”不会帮助确定正在使用哪个 Python 安装。

第二部分是确定运行时实际使用的 Python 安装。为此,您应该使用 WSGI hello world 程序并对其进行修改以转储“sys.prefix”的值。这会告诉您 Python 安装所在的根目录。根据所使用的 Python 共享库的版本,您将知道正在使用根目录下的哪个实际“lib/pythonX.Y”目录。版本很重要,因为该根目录下可能安装了多个版本。

请注意,您获得的 'sys.prefix' 可能实际上与根目录不同,因为您认为它可能基于 mod_wsgi.so 文件的 libpythonX.Y.so 依赖项。这是因为 Python 在初始化时尝试查找其 'lib' 目录的方式。

例如,如果您在“/usr/local”下安装了 Python 2.6,在“/usr”下安装了另一个 Python 2.6,但您在“/usr/local”下针对该 Python 2.6 编译了 mod_wsgi,您仍可能会发现“sys.prefix”解析为“/usr”。这是因为在嵌入式系统中,Python 默认查看“PATH”环境变量的值以获取搜索路径,以查找“python”可执行文件作为计算根目录的基点,即使未使用该“python”可执行文件启动该过程。

在 Apache 下,因为它通常以“root”身份启动,所以它不一定在您的“PATH”中有“/usr/local/bin”,所以很可能会找到“/usr/bin/python”,从而将“/usr”用于“sys.prefix”。

在后一种情况下,它会找到与您想要使用的根目录不同的根目录,您可以使用 Apache 配置中的 WSGIPythonHome 指令来覆盖自动计算的“sys.prefix”。

请注意,您不能使用 WSGIPythonHome 来引用不同版本的 Python,它必须引用包含相同主要/次要版本的 Python 安装的根目录。如果您需要使用不同版本的 Python,则必须重新编译并重新安装 mod_wsgi,以便针对不同版本进行编译。编译时要使用的 Python 的实际版本/安装可以在构建 mod_wsgi 配置脚本时使用“--with-python”选项指定。

除了使用 WSGIPythonHome 指令来覆盖所使用的 Python 安装之外,还有其他方法,但建议您坚持使用 WSGIPythonHome。

答案2

mod_wsgi 与特定的 python 版本相链接。

www:~# ls -l /usr/lib/apache2/modules/mod_wsgi*
lrwxrwxrwx 1 root root     15 2009-07-27 12:35 /usr/lib/apache2/modules/mod_wsgi.so -> mod_wsgi.so-2.5
-rw-r--r-- 1 root root 129552 2008-08-23 14:06 /usr/lib/apache2/modules/mod_wsgi.so-2.4
-rw-r--r-- 1 root root 129552 2008-08-23 14:06 /usr/lib/apache2/modules/mod_wsgi.so-2.5

或者你也可以这样做

www:~# ldd /usr/lib/apache2/modules/mod_wsgi.so
    ...
    libpython2.5.so.1.0 => /usr/lib/libpython2.5.so.1.0 (0xb7de0000)
    ...

答案3

$ python
Python 2.6.4 (r264:75706, Dec  7 2009, 18:45:15) 
[GCC 4.4.1] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> 
>>> 
>>> import sys
>>> 
>>> print sys.executable
/usr/bin/python

答案4

您可以sys.executable从 Python 代码内部访问以了解使用了哪个解释器二进制文件。编写一个 WSGI 页面来执行此操作。

相关内容