3

私は「巻き戻し」と呼ばれるPyPiパッケージ(またはディストリビューションなど)の作成者です。と呼ばれる(ルート)パッケージを出荷しますrewind

現在、rewindパッケージにはサーバーコードとクライアントコードの両方が含まれています。ただし、コードを2つの別々のPyPiパッケージに分割することを検討しています。1つはrewind.serverパッケージ、もう1つはパッケージを配信しrewind.clientます。

私の質問は、2つの別々のPyPiパッケージが同じ(ルート)パッケージを配信できるrewindかということです。

私がこれまでに行ったテストは、それが不可能であることを私に教えてくれているようです。私のテストでは、PYTHONPATHの前に追加される2つのフォルダーが作成されました。両方のフォルダーには、Pythonパッケージ「mytestpackage」が含まれています。最初の「mytestpackage」にはモジュール「a」が含まれ、2番目の「mytestpackage」にはモジュール「b」が含まれます。モジュール「a」または「b」のいずれかしかインポートできません。両方ではありません。

可能であれば、Pythonistasの仲間からの連絡をお待ちしています。または、これは現在のPythonパッケージ実装の制限ですか?

4

1 に答える 1

2

rewind/__init__.pyはい、できますが、名前空間を宣言するために、各パッケージのファイルに特別なコードを入れる必要があります。

__import__('pkg_resources').declare_namespace(__name__)

setup.pyまた、各パッケージのメタデータで名前空間を宣言する必要があります。

setup(
    # ...
    namespace_packages  = ["rewind"]
)

これはすべて を使用する必要がありsetuptools、単なる distutils ディストリビューションでは機能しません。

の名前空間パッケージのドキュメントを参照してくださいsetuptools

注: 古いパッケージでは、より詳細なバージョンの名前空間宣言コードが使用されていました。

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

このdeclare_namespace()関数は、同じジョブをより簡潔に処理するようになりました。

于 2012-09-20T07:39:38.613 に答える