簡體   English   中英

python命名空間包的當前狀態

[英]Current state of python namespace packages

我想在主模塊中有幾個python子模塊,但我想將它們作為單獨的python包分發。 所以包A應該提供'my_data.source_a',包B應該提供'my_data.source_b',......等等。

我發現我必須使用命名空間包,但是試圖找出細節,我找到了多個PEP來解決這個問題。 PEP 420似乎是最新的,它建立在PEP 402和PEP 382之上。

對我來說,不清楚實現的不同PEP的狀態是什么。 所以我的問題是: http//pythonhosted.org/distribute/setuptools.html#namespace-packages仍然是要走的路,或者我應該如何構建我的命名空間包?

Python文檔很好地描述了在Python中創建命名空間包的三種方法,包括何時使用這三種方法中的每一種的指南。 此外,本主題在不同的StackOverflow 線程中進行了深入討論,該線程具有良好的接受答案 最后,如果您是一個寧願閱讀代碼而非文檔的人,那么sample-namespace-packages repo包含使用三種可用方法中的每一種創建的命名空間包的示例。

簡而言之,如果您打算使用Python 3.3及更高版本的軟件包,則應使用本機命名空間軟件包方法。 如果您打算使用舊版本的Python,則應使用pkgutil方法 如果要將命名空間包添加到已使用pkg_resources方法的命名空間,則應繼續使用方法。


使用本機命名空間包 ,我們可以從兩個包中刪除__init__.py並修改我們的setup.py文件,如下所示:

# setup.py file for my_data.source_a
from setuptools import setup, find_namespace_packages

setup(
    name="my_data.source_a",
    version="0.1",
    packages=find_namespace_packages(include=['my_data.*'])
)
# setup.py file for my_data.source_b
from setuptools import setup, find_namespace_packages

setup(
    name="my_data.source_b",
    version="0.1",
    packages=find_namespace_packages(include=['my_data.*'])
)

我們需要添加include=['my_data.*']的說法,因為在默認情況下find_namespace_packages()是,它包括作為命名的包,如所描述的文件夾,而寬松這里

這是支持Python 3.3及更高版本的軟件包的推薦方法。


使用pkgutil style命名空間包 ,我們需要pkgutil添加到每個包中my_data.__init__.py文件中:

__path__ = __import__('pkgutil').extend_path(__path__, __name__)

這是backports命名空間使用的方法,以及google-cloud-python repo中的不同包,它是支持舊版Python的推薦方法。

Python 3.7的最新版本使用本機命名空間包方法來創建在PEP 420中定義的命名空間包。

目前有三種不同的方法來創建命名空間包:

  1. 使用本機命名空間包 這種類型的命名空間包在PEP 420中定義,可在Python 3.3及更高版本中使用。 如果命名空間中的包只需要支持Python 3並通過pip安裝,則建議使用此方法。
  2. 使用pkgutil樣式的命名空間包 對於需要支持Python 2和3以及通過pippython setup.py install新軟件包,建議使用此方法。
  3. 使用pkg_resources樣式的命名空間包 如果您需要與已使用此方法的軟件包兼容,或者您​​的軟件包需要是zip安全的,則建議使用此方法。

參考: 包裝命名空間包

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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