152

Pythonでは、名前空間パッケージを使用すると、Pythonコードを複数のプロジェクトに分散させることができます。これは、関連するライブラリを個別のダウンロードとしてリリースする場合に役立ちます。たとえば、ディレクトリPackage-1Package-2PYTHONPATH

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

エンドユーザーはできimport namespace.module1ますimport namespace.module2

複数のPython製品がその名前空間にモジュールを定義できるように、名前空間パッケージを定義する最良の方法は何ですか?

4

5 に答える 5

81

pkgutilと呼ばれる標準モジュールがあり、これを使用して、特定の名前空間にモジュールを「追加」できます。

あなたが提供したディレクトリ構造で:

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

これらの 2 行をPackage-1/namespace/__init__.pyPackage-2/namespace/__init__.py(*)の両方に入れる必要があります。

from pkgutil import extend_path
__path__ = extend_path(__path__, __name__)

(* なぜなら - それらの間の依存関係を述べない限り - どちらが最初に認識されるか分からないからです - 詳細はPEP 420を参照してください)

ドキュメントが言うように:

__path__これにより、パッケージにちなんで名付けられたディレクトリのパッケージのすべてのサブディレクトリに追加されsys.pathます。

これからは、これら 2 つのパッケージを個別に配布できるはずです。

于 2009-11-04T19:32:17.373 に答える
5

このセクションは、一目瞭然です。

つまり、名前空間コードを に入れ、名前空間を宣言するため__init__.pyに更新すれば、自由に使用できます。setup.py

于 2009-11-04T19:33:51.873 に答える
2

これは古い質問ですが、最近誰かが私のブログに、名前空間パッケージに関する私の投稿がまだ関連しているとコメントしたので、それを実現する方法の実用的な例を提供するので、ここにリンクすると思いました:

https://web.archive.org/web/20150425043954/http://cdent.tumblr.com/post/216241761/python-namespace-packages-for-tiddlyweb

何が起こっているのかの主な内臓については、この記事にリンクしています。

http://www.siafoo.net/article/77#multiple-distributions-one-virtual-package

秘訣は、TiddlyWeb__import__("pkg_resources").declare_namespace(__name__)でのプラグインの管理をかなり促進することであり、これまでのところうまくいっているようです。

于 2013-02-05T15:30:52.460 に答える
-10

Python の名前空間の概念が前後にあるため、Python ではパッケージをモジュールに入れることはできません。パッケージにはモジュールが含まれていますが、その逆ではありません。

__init__.pyPython パッケージは、ファイルを含む単なるフォルダーです。PYTHONPATHモジュールは、拡張子を持つパッケージ内 (または に直接)のその他のファイルです.py。あなたの例では、2 つのパッケージがありますが、モジュールは定義されていません。パッケージがファイル システム フォルダーであり、モジュールがファイルであると考えると、パッケージにモジュールが含まれる理由がわかり、その逆ではないことがわかります。

したがって、Package-1 と Package-2 が Python パスに配置したファイル システム上のフォルダーであると仮定した例では、次のようにすることができます。

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

namespaceこれで、2 つのモジュールmodule1とを含む1 つのパッケージができましmodule2た。正当な理由がない限り、モジュールをフォルダーに配置し、それのみを以下のように python パスに配置する必要があります。

Package-1/
  namespace/
  __init__.py
  module1.py
  module2.py
于 2009-11-04T18:35:20.617 に答える