[英]Check if one package is installed in my system with Python?
如何檢查我的系統中是否安裝了某些軟件包。 我的系統是 Linux,但如果它可以在其他操作系統上運行就更好了。 我的意思是操作系統特定的包(比如可能是 *.rpm 或 *.deb)。
有沒有可以做到這一點的python模塊或腳本?
“包”一詞有六個相似但不兼容的含義,但是您說“包或模塊”這一事實意味着您特別想了解 Python 包和模塊,例如可以import
。
在這種情況下,測試它的方法是import
它們。
手動執行以下操作:
$ python
>>> import foo
ImportError: No module named foo
嗯, foo
沒有安裝。
以編程方式:
try:
import foo
except ImportError:
# do whatever you wanted if foo is missing
請注意,這實際上並沒有告訴您foo
丟失了,只是無法導入它。 在一個簡單的“測試您是否有這個”腳本中,這通常是您要實際檢查的內容。 但是如果您真的想檢查“是否已安裝(即使損壞)”怎么辦?
在最近的Python(我認為3.4+)時, ImportError
將在它的更多信息,你可以訪問- name
為您試圖導入的名稱, path
,如果它被發現,等等。然而,這是那些情況下,一個EAFP 可能不會比 LBYL 好。 您可以使用importlib
搜索模塊而無需嘗試導入它,如下所示:
spec = importlib.util.find_spec('foo')
如果您使用的是較舊的 Python 呢? 有類似的功能可以追溯到 3.2,但沒有那么好,如果你使用 2.7,真的沒有什么值得使用的,因為導入機制沒有很好地暴露出來。
對於這種情況(以及許多其他與軟件包安裝相關的很酷的東西),請使用setuptools
它不在 stdlib 中,但大量第三方軟件包依賴於它(直到最近它還是 Python 軟件包的基石)安裝,即使是非官方的):
pkg_resources.get_distribution('foo')
但是,它尋找的是distutils
/ setuptools
/PyPI 包,而不是 Python 模塊或包。 那里有很多重疊,但它們並不完全相同。 舉一個簡單的例子,當你pip install more-itertools
,你會得到more-itertools
PyPI 包,它將more_itertools
Python 包安裝到你的站點包中。
要確定您是否安裝了 .deb、.rpm 等包,您需要使用適合您的打包系統的工具。
APT 在 Debian 中有一個名為python-apt
的 Python 包裝器,或者在 PyPI 中有一個apt
。
RPM 擁有大量 Python 工具——事實上,Redhat 的大部分安裝程序生態系統都是基於 Python 構建的,您應該已經安裝了rpm
模塊。 在尋找高級包裝器之前閱讀使用 Python 編程 RPM (或者,更好的是,搜索更新的版本……),以便您了解您實際在做什么; 即使使用低級接口,它也只有幾行代碼。
據我所知,沒有人將這些包裝在一個通用工具中,適用於任何 linux 發行版曾經使用過的每種打包格式和數據庫(而且,即使他們有,這對不使用的 linux 系統也沒什么好處) t 使用包裝系統)。 但是如果你只是想處理一些流行的系統, python-apt
和 Redhat 自己的工具或搜索 PyPI 以獲得 RPM,這將涵蓋你關心的幾乎所有內容。
或者, pkg-config
是最接近“安裝在此系統上的軟件包”的通用概念的東西。 每個 linux 系統都會有它(以及大多數其他非 Windows 系統),但不是每個包都注冊 pkg-config。 盡管如此,如果這是您要找的東西, pkgconfig
是 Python 的答案。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.