Linux

如何找到我的伺服器正在使用的 Python 執行檔?

  • January 31, 2010

我是 Linux 新手。

我正在管理一個(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 程序不必要的膨脹,因為執行時程式碼重定位必須在使用靜態連結的 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”下編譯了 mod_wsgi,您可能仍然會發現“sys.prefix”解析為“/usr”。這是因為預設情況下,在嵌入式系統中,Python 會查看“PATH”環境變數的值以獲取搜尋路徑以找到“python”執行檔作為計算根目錄的基點,即使該“python”執行檔不用於開始這個過程。

在 Apache 下,因為它通常以 ‘root’ 啟動,它不一定會在你的 ‘PATH’ 中有 ‘/usr/local/bin’ ,因此很可能會找到 ‘/usr/bin/python’ 並因此使用 ‘/ ‘sys.prefix’ 的 usr’。

在後一種情況下,它會找到與您想要使用的不同的根目錄,可以使用 Apache 配置中的 WSGIPythonHome 指令來覆蓋自動計算的“sys.prefix”。

請注意,您不能使用 WSGIPythonHome 來引用不同版本的 Python,它必須引用包含相同主要/次要版本的 Python 安裝的根目錄。如果您需要使用不同版本的 Python,則必須重新編譯並重新安裝 mod_wsgi,以便針對不同版本進行編譯。編譯時要使用的 Python 的實際版本/安裝可以在建構時使用 mod_wsgi 配置腳本的“–with-python”選項指定。

除了使用 WSGIPythonHome 指令來覆蓋使用哪個 Python 安裝之外,還有其他方法,但建議您堅持使用 WSGIPythonHome。

引用自:https://serverfault.com/questions/108067