3

モジュールを名前空間パッケージと特定のサブプロジェクトのクラスのコンテナーの両方として使用する方法は? つまり、サブパッケージではなく名前空間パッケージから何かを直接インポートするにはどうすればよいでしょうか?

例は、質問をより明確にすることができます。

の 3 つのサブパッケージcalc

という名前の名前空間パッケージを作成したいとします。そのパッケージcalcには 3 つのプロジェクト ( sscce : calcs.tar.gz ) があります。ディレクトリにある最初のものcalc-addは、次の構造を持っています。

calc-add/calc/
calc-add/calc/add.py
calc-add/calc/__init__.py

の内容calc-add/calc/__init__.pyはただ

__import__('pkg_resources').declare_namespace(__name__)

名前空間パッケージで必要とされadd.py、次の機能のみを備えています。

def op(n1, n2):
    return n1 + n2

calc-subディレクトリには、次の構造を持つ別のプロジェクトがあります。

calc-sub/calc/
calc-sub/calc/sub.py
calc-sub/calc/__init__.py

この__init__.pyファイルは前のものと同じでsub.py、単純な機能しかありません。

def op(n1, n2):
    return n1 - n2

最後にcalc-main、次の内容のディレクトリがあります。

calc-main/calc/
calc-main/calc/main.py
calc-main/calc/__init__.py

繰り返しますが、 に__init__.pyは上記の行しかありませんmain.pyが、次のコードがあります。

import calc.add, calc.sub

def apply(n1, n2, op):
    if op == "add":
        return calc.add.op(n1, n2)
    else:
        return calc.sub.op(n1, n2)

関数を呼び出す方法apply()関数を呼び出す方法

$PYTHONPATH以下のように設定してPythonインタープリターを呼び出すと:

$ PYTHONPATH=$PYTHONPATH:../calc-add/:../calc-sub/ python

次に、apply()この方法で呼び出すことができます:

>>> import calc.main
>>> calc.main.apply(2, 3, 'add')
5

apply()ただし、次のように から直接呼び出したいと思いcalcます。

>>> import calc
>>> calc.apply(2, 3, 'add')
5

に次の行を追加すると、明らかに機能しますcalc-main/calc/__init__.py

from main import apply

ただし、setuptools のドキュメントは非常に明確です。

名前空間パッケージの __init__.py に他のコードやデータを含めてはなりません。開発中、またはプロジェクトが .egg ファイルとしてインストールされている場合は動作しているように見えても、プロジェクトが「システム」パッケージ ツールを使用してインストールされている場合は動作しません。そのような場合、__init__.py ファイルはインストールされません。処刑どころか。

__init__.pyでは、ファイルの制限を破ることなく、どうすれば欲しいものを手に入れることができるでしょうか? それは可能ですか?

4

0 に答える 0