直接インポートされたパッケージは、サブパッケージまたはサブモジュールをその名前空間に自動的に配置しません。
>>> import mydir
>>> dir(mydir)
['__builtins__', '__doc__', '__file__', '__name__', '__package__', '__path__']
(ここにはありませんのでご注意innerdir
ください。)
しかし、パッケージを介してインポートする場合、Python は名前空間を一緒に接続します。
>>> import mydir.innerdir
>>> dir(mydir)
['__builtins__', '__doc__', '__file__', '__name__', '__package__', '__path__', 'innerdir']
>>> dir(mydir.innerdir)
['__builtins__', '__doc__', '__file__', '__name__', '__package__', '__path__']
( には がないことに注意してくださいmymodule
。mydir.innerdir
)
__all__
Python では、 のマジック変数を使用して、パッケージに自動的に含めるサブモジュールを明示的に指定できます__init__.py
が、デフォルトでは、コード内の__init__.py
コードを実行するだけで、他には何もしません。
次のいずれかを実行できます。
import mydir.innerdir.mymodule; mydir.innerdir.mymodule.hi()
from mydir.innerdir import mymodule; mymodule.hi()
from mydir.innerdir.mymodule import hi; hi()
__init__.py
または、ファイルを編集して__all__
、ワイルドカード インポート用の変数を含めることもできます。
# file mydir/innerdir/__init__.py
print 'Running mydir/innerdir/__init__.py'
__all__ = ['mymodule']
次に、次のようなことができます。
from mydir.innerdir import *; mymodule.hi()
さらにクレイジーなことに、サブパッケージとモジュールを積極的にインポートできます (これはお勧めしません!):
# file mydir/__init__.py
print 'Running mydir/__init__.py'
import innerdir
# file mydir/innerdir/__init__.py
print 'Running mydir/innerdir/__init__.py'
import mymodule
今、これらは動作します:
import mydir; mydir.innerdir.mymodule.hi()
from mydir import innerdir; innerdir.mymodule.hi()
パッケージのドキュメントをブラッシュ アップすることをお勧めします。このドキュメントでは、これらすべてが説明されており、ここで示したものとまったく同じディレクトリ構造になっています。