14

メイン モジュール内に複数の python サブ モジュールを配置したいのですが、それらを個別の python パッケージとして配布したいと考えています。したがって、パッケージ A は「my_data.source_a」を提供し、パッケージ B は「my_data.source_b」を提供する必要があります。

これには名前空間パッケージを使用する必要があることがわかりましたが、詳細を把握しようとすると、その問題をカバーする複数の PEP が見つかりました。PEP 420 は、PEP 402 と PEP 382 に基づいて構築された最新のもののようです。

私には、実装のさまざまな PEP のステータスがどのようなものかは明確ではありません。私の質問は次のとおりです

4

2 に答える 2

10

Pythonのドキュメントには、Python で名前空間パッケージを作成する 3 つの方法が詳しく説明されており、3 つの方法のそれぞれをいつ使用するかについてのガイドラインも含まれています。さらに、このトピックは別の StackOverflowスレッドで非常に詳細に議論されています。最後に、ドキュメントよりもコードを読みたい方のために、sample-namespace-packagesレポには、利用可能な 3 つの方法のそれぞれを使用して作成された名前空間パッケージの例が含まれています。

簡単に言うと、パッケージを 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 名前空間 packagesでは、各パッケージmy_data.__init__.pyのファイルに次の行を追加する必要があります。

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

これは、backports名前空間とリポジトリ内のさまざまなパッケージで使用されるアプローチgoogle-cloud-pythonであり、古いバージョンの Python をサポートするために推奨されるアプローチです。

于 2016-08-31T03:30:32.910 に答える
4

Python 3.7 である Python の最新バージョンは、ネイティブの名前空間パッケージアプローチを使用して、PEP 420で定義されている名前空間パッケージを作成します。

名前空間パッケージを作成するには、現在 3 つの異なる方法があります。

  1. ネイティブ名前空間パッケージを使用します。このタイプの名前空間パッケージはPEP 420で定義されており、Python 3.3 以降で利用できます。これは、名前空間内のパッケージが Python 3 と を介したインストールのみをサポートする必要がある場合に推奨されますpip
  2. pkgutil スタイルの名前空間パッケージを使用します。これは、Python 2 および 3 をサポートする必要がある新しいパッケージと、 および の両方pipを介したインストールに推奨されますpython setup.py install
  3. pkg_resources スタイルの名前空間パッケージを使用します。この方法は、既にこの方法を使用しているパッケージとの互換性が必要な場合、またはパッケージを zip セーフにする必要がある場合に推奨されます。

参考:名前空間パッケージのパッケージ化

于 2019-08-10T20:03:22.123 に答える