Linux

Linux 上的 Python 2.7.5 和 2.7.13;庫路徑與多個 libpython2.7.so 衝突

  • May 10, 2019

有沒有辦法為執行檔指定自定義動態庫搜尋路徑?

我希望 /usr/bin/python 引用 /usr/lib64/libpython2.7.so 和 /usr/local/bin/python2.7 以使用 /usr/local/lib/libpython2.7.so。

目前,我有 Python 2.7.5 作為 /usr/bin/python (舊的,由 CentOS 使用)和 Python 2.7.13 作為 /usr/local/bin/python2.7 (新的,用於開發)。但是,這兩個執行檔都給了我 Python 2.7.13。

$ /usr/bin/python2.7 --version # Python 2.7.5
Python 2.7.13 ***← 錯誤!!!***

$ /usr/local/bin/python2.7 --version # Python 2.7.13
Python 2.7.13

它們絕對是獨立的執行檔。

-rwxr-xr-x. 1 root root  7136 Nov  5  2016 /usr/bin/python2.7
-rwxr-xr-x. 1 root root 11368 May 13 18:21 /usr/local/bin/python2.7

這很令人困惑,直到我意識到它們都動態連結到 libpython2.7.so,並且都在 /usr/local/lib 中搜尋它。使用 ldd 確認了這一點。我可以通過修改 /etc/ld.so.conf 或 $LD_LIBRARY_PATH 來獲取舊的 Python。

$ LD_LIBRARY_PATH=/usr/lib64 /usr/bin/python --version # Python 2.7.5
Python 2.7.5

$ LD_LIBRARY_PATH=/usr/lib64 /usr/local/bin/python --version # Python 2.7.13
Python 2.7.5 ***← 錯誤!!!***

這是一個問題,因為 yum 依賴於系統 Python。如果我修復它(例如,通過修改 /etc/ld.so.conf),它會破壞 Python 2.7.13 和依賴於這個較新的 libpython2.7.so 的東西(例如,帶有嵌入式 Python 的 Vim)。我的 /etc/ld.so.conf 包含 /usr/local/lib。

將此添加到您的 .bashrc :

alias yum='LD_LIBRARY_PATH=/usr/lib64 yum'

這將確保在執行 yum(和僅 yum)時,系統將首先在 /usr/lib64 中搜尋共享對象(動態庫),而不是 /usr/local/lib。這是一個黑客,但據我所知,這是不可避免的。

**重要提示:**此解決方案僅適用於您的問題是由於 /usr/bin 中的 2.7.x 和 /usr/local/bin 中的 2.7.y(例如,2.7.5 和 2.7.13)。如果您的問題是由於 2.x 和 2.y 衝突(例如,2.4 和 2.7)造成的,那麼這可能無濟於事,甚至可能使您的情況變得更糟。祝你好運!

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