python 3を対象
用語
- module: import される対象(fileのようなもの)
-
package: 中に階層構造をもつmodule(difのようなもの)
__path__ 属性をもってるmoduleはpackageと呼ばれる
__name__: importするときにmoduleをユニークに識別するのに利用. 完全修飾名で記述 aa.bb.cc
__package__: sub moduleなら親のpackage名, top levelのmoduleは空の文字列. 値は文字列
注意:全てのpackageはmoduleだが、全てのmoduleはpackageとは限らない(中に構造がないmoduleもある)
検索順序
- sys.modules:すでにimportされたmodule
- 組み込みmodule
- freezeツールで処理されたmodule
- import pathを起点にしてmoduleの検索
importの種類
- explicit 相対import (implicit相対importはpython3では廃止)
from .package import module: current
from ..package import module: parent
from ...package import module
- 絶対 import
import aaa: sya.pathに存在する必要がある(相対なら from . import aaa)
explicit 相対importの注意点
- package属性がNoneかつname属性がmainのとき、相対importは使えない (python xxx.pyを実行時 xxx.py中では相対importは使えない)
- working dirを通過する相対importは使えない
回避方法
1.について
python aaa/bbb.pyで実行
python -m aaa.bbbで実行
-m option: sys.path から指定されたモジュール名のモジュールを探し、その内容を main モジュールとして実行します。
2.について
working dirをより親にする(もしはsys.pathに追加して)working dirを相対 importが通過しないようにする
[http://d.hatena.ne.jp/chlere/20110618/1308369842]
結局 sys.pathや環境変数PYTHONPATHを使うことになるので絶対importしてsetup.pyを書いてinstallすること推奨