10

次の難問があります。親パッケージ レベルでパッケージのサブパッケージからいくつかのモジュールを公開しようとしています。

フォルダ構造は基本的に次のようになります。

script.py
package/
    __init__.py
    module1.py
    subpackage/
        __init__.py
        submodule1.py
        submodule2.py

script.py私が現在書かなければならないファイルに

from package.subpackage.submodule1 import foo

ファイルから何かをインポートしたいが、すべてのインポートが次のように見えるようにsubmodule1.py、ファイルをパッケージレベルで公開できるようにしたいsubmodule1.py場合submodule2.py

from package.module1 import bar
from package.submodule1 import foo
from package.submodule2 import goo

を公​​開したくないことに注意barてください。foogoopackage

from package import bar
from package import foo

私の場合、モジュール間の分離は依然として重要だからです。

これは可能ですか?__init__.pyファイルにそうするためのトリックはありますか?

ありがとう!

4

2 に答える 2

6

はい、可能です。
一歩一歩何が起こるか見てみましょう。

  1. するとfrom package.submodule1 import foosys.modulesがあるかどうかがチェックされますpackage
  2. 見つからない場合package/__init__.pyは、実行してロードします
  3. 再度sys.modulesチェックされますpackage.submodule1
  4. 見つからない場合はpackage/submodule1.py、存在するかどうかがチェックされます。

sys.modulesステップ 2の forにエントリを作成することで、ステップ 3 を通過させることができますpackage.submodule1

package/__init__.py

import sys
from .subpackage import submodule1
from .subpackage import submodule2

for module in (submodule1, submodule2):
    full_name = '{}.{}'.format(__package__, module.__name__.rsplit('.')[-1])
    sys.modules[full_name] = sys.modules[module.__name__]
于 2016-07-01T19:27:54.333 に答える