Edited at

python import関連のメモ

More than 1 year has passed since last update.

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もある)


検索順序


  1. sys.modules:すでにimportされたmodule

  2. 組み込みmodule

  3. freezeツールで処理されたmodule

  4. 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の注意点



  1. package属性がNoneかつname属性がmainのとき、相対importは使えない (python xxx.pyを実行時 xxx.py中では相対importは使えない)

  2. 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すること推奨