簡體   English   中英

用 Python 檢查我的系統中是否安裝了一個軟件包?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM