Help us understand the problem. What is going on with this article?

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

ymd_
機械学習やってます
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away