モジュールを名前空間パッケージと特定のサブプロジェクトのクラスのコンテナーの両方として使用する方法は? つまり、サブパッケージではなく名前空間パッケージから何かを直接インポートするにはどうすればよいでしょうか?
例は、質問をより明確にすることができます。
の 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
では、ファイルの制限を破ることなく、どうすれば欲しいものを手に入れることができるでしょうか? それは可能ですか?