如何在 Python 3 中建立 Python 名稱空間包?


使用名稱空間包,您可以將一個包的子包和模組分佈到許多獨立的釋出包(本文中稱為釋出以避免歧義)中。

在 Python 中,名稱空間包允許您將 Python 程式碼分散到多個專案中。當您希望將相關的庫作為單獨的下載釋出時,這很有用。

建立名稱空間包

目前,有三種開發名稱空間包的方法。這些方法如下所述。

  • 使用包用於原生名稱空間。此類名稱空間包的 PEP 420 規範指出,Python 3.3 及更高版本支援它。如果您的名稱空間中的包只需要支援 Python 3 和 pip 安裝,那麼建議這樣做。

  • 在 pkgutil 樣式中使用名稱空間包。對於需要支援 Python 2 和 3 以及透過 pip 和 python setup.py install 進行安裝的新包,建議使用此方法。

  • 以 pkg resources 的方式使用名稱空間包。如果您的包需要是 zip 安全的,或者您需要它與已經使用它的其他包一起工作,則建議使用這種方法。

示例 1

例如,在 PYTHONPATH 中包含 Package-1 和 Package-2 目錄的情況下,終端使用者可以匯入 namespace.module1 和匯入 namespace.module2。以下程式碼顯示了每個包中的名稱空間。

Package-1/namespace/__init__.py Package-1/namespace/module1/__init__.py Package-2/namespace/__init__.py Package-2/namespace/module2/__init__.py

示例 2

此示例可用於理解當子包是 Python 中包的一部分時,名稱空間是如何存在的。

mynamespace/ __init__.py subpackage_a/ __init__.py ... subpackage_b/ __init__.py ... module_b.py Setup.p

原生名稱空間的包

來自 PEP 420 的隱式名稱空間包已新增到 Python 3.3 中。您只需要從包含名稱空間包的目錄中刪除 __init__.py 即可建立原生名稱空間包。一個檔案結構模型

setup.py mynamespace/ # No __init__.py here. subpackage_a/ # Sub-packages have __init__.py. __init__.py module.py

pkgutil 樣式的名稱空間包

示例

pkgutil 模組和 pkgutil.extend_path() 函式最初在 Python 2.3 中可用。這可用於宣告必須與 Python 2.3 及更高版本以及 Python 3 一起使用的名稱空間包。對於最高級別的相容性,這是最佳做法。您必須為名稱空間包包含一個 __init__.py 檔案,以便以 pkgutil 樣式構建名稱空間包 -

setup.py mynamespace/ __init__.py # Namespace package __init__.py subpackage_a/ __init__.py # Sub-package __init__.py module.py

更新時間: 2022-09-16

2K+ 瀏覽量

開啟你的 職業生涯

透過完成課程獲得認證

開始學習
廣告

© . All rights reserved.