在什麼情況下可以 pip ‘discover’ yum 所做的包更新
遠端站點上的某些節點出現問題,在以前使用 pip 的 SLES 系統上安裝了多個 Python RPM。雖然我們已經指導遠端團隊不要將兩者混在一起,他們現在也遵循這個指導,但仍然有一些機器被“混合”了。
在站點上的一些(但不是全部)機器上,執行“pip list”表明 pip 已經意識到了較新的軟體包。在此過程中(通過 RPM)更新了 Pip,但它的安裝順序與所有節點上的其他 Python 包相同,但沒有相同的行為。因此,我們的一些腳本現在由於新軟體包導致的不兼容而無法正常執行。
這個站點上的節點之間肯定會有一些差異,但總的來說,它們會盡可能地接近相同。有沒有人知道 yum 安裝 Python 包如何更新 pip 數據庫?
有沒有人知道 yum 安裝 Python 包如何更新 pip 數據庫?
為此,pip 並沒有真正獨立於 Python 本身的數據庫。
<package>.egg-info
安裝包後,將在包本身旁邊放置一個關聯的。這是 core-python 而不是pip
oryum
。因此,當您詢問 pip 那裡有什麼時,它只會查找這些egg-info
元文件並使用它們來通知它已經安裝了什麼。例如:/usr/lib/python3/dist-packages
在 ubuntu 上。當您要求 yum 安裝 python 包時,RPM 應該附帶這些相同的
egg-info
文件。Pip 的部分工作是在安裝時檢查 python 環境中的依賴項。如果 yum 破壞了依賴關係,那麼這將被發現(正如你所發現的那樣)。它通過檢查
egg-info
文件中的元數據來做到這一點。Yum 還嘗試檢查依賴項。但是有一個很大的問題。Yum 實際上根本不知道實際安裝了哪些 python 庫。它只知道安裝了哪些 RPM。因此,任何不使用 yum 或其他 RPM 安裝的 python 包都不會被 yum 發現。
這確實是創建虛擬環境的目的。將應用程序環境綁定到系統環境通常不是一個好主意。很少有一種好方法可以使您的應用程序需求與您的作業系統保持一致。
在什麼情況下可以 pip ‘discover’ yum 所做的包更新
如果 yum 已將軟體包安裝到同一環境中,則 pip 應該能夠發現它們。兩個主要的例外可能是:
- 如果您將軟體包安裝到虛擬環境中。除非特別要求,否則虛擬環境不會繼承系統包。即使環境確實繼承了它們,它也總是首先使用它自己的本地安裝。
- 如果 pip 將軟體包安裝給使用者而不是系統。同樣,這些不會被 yum 覆蓋,python 通常會使用為使用者安裝的
/home/...
軟體包(在為系統安裝的軟體包之下。其中第二個很可能是機器之間差異的來源。
pip install
可能會安裝到sudo pip install
可能為系統安裝的使用者。