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

我是Linux新手。

我正在pipe理一个(Linux – Apache – mod_wsgi – Django)服务器,其中有多个Python安装。 该网站目前正在工作,但我想找出哪些可执行的Python是用来运行它。 我知道这不是默认的。

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

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

为了确定使用哪个Python版本/安装,有两个部分。

其他人指出的第一个问题是确定哪个Python库mod_wsgi.so链接到哪个库。 在大多数UNIX系统上,这是使用“ldd”命令完成的。

 ldd mod_wsgi.so 

在安装到正在使用的Apache模块目录中的实际的mod_wsgi.so上运行。 这将告诉你确定哪个版本的mod_wsgi是编译的。

如果你没有看到一个libpythonX.Y.so文件的引用,那么你的mod_wsgi.so被静态链接到Python库。 虽然这将起作用,但是只要mod_python不会被加载到同一个Apache中,依靠它也是一个非常糟糕的主意,因为使用静态链接的Python库导致不必要的运行时代码重定位导致Apache进程的膨胀加载mod_wsgi.so与静态链接的Python库时完成。

请注意,在mod_wsgi下运行时,“sys.executable”的值没有意义,不能用作确定使用哪个Python版本的方法。 这是因为不使用命令行Python。 相反,正在运行的可执行文件实际上是Apache和sys.executable,很可能会反映出来。 只有在Apache运行并加载了mod_wsgi.so后,Python才会使用embedded式Python API进行初始化。 同样,运行“哪个python”将无助于确定正在使用哪种Python安装。

第二部分是确定在运行时实际使用的Python安装。 要做到这一点,你应该使用一个WSGI你好世界程序,并修改它倾倒出'sys.prefix'的值。 这会告诉你Python安装所在的根目录。 根据所使用的Python共享库的版本,您将知道正在使用该根目录下的哪个实际的“lib / pythonX.Y”目录。 该版本很重要,因为根目录下可能安装了多个版本。

请注意,你得到的“sys.prefix”实际上可能与根目录不同,因为你可能认为它可能是基于libpythonX.Y.so依赖于mod_wsgi.so文件。 这是因为初始化时Python试图find它的'lib'目录。

例如,如果你在'/ usr / local'下安装了Python 2.6,而在'/ usr'下安装了另外一个,但是你在'/ usr / local'下编译了mod_wsgi,你仍然可以find'sys.prefix'parsing为“/ usr”。 这是因为默认情况下,在embedded式系统中,Python会查看'PATH'环境variables的值,以获取searchpath来查找'python'可执行文件作为计算根目录的基点,即使'python'可执行文件没有用于开始这个过程。

在Apache下,因为它通常以“root”身份启动,所以在你的“PATH”中不一定有'/ usr / local / bin',所以可能会find'/ usr / bin / python' usr'为'sys.prefix'。

在后面的这种情况下,它find了你想要使用的不同的根目录,可以在Apacheconfiguration中使用WSGIPythonHome指令来覆盖“sys.prefix”自动计算的内容。

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

除了使用WSGIPythonHome指令来覆盖使用哪种Python安装外,还有其他一些方法,但是build议您使用WSGIPythonHome。

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) ... 
 $ 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 

哪个python

这应该显示shell正在拾取的python。

您将希望以apache用户身份运行它,以设置$ PATH,而不是您的用户。

您可以从Python代码中访问sys.executable来知道使用了哪个解释器二进制文件。 编写一个WSGI页面来完成它。