Pythonでモジュールやパッケージをインポート
ディレクトリ myproject
に main.py
があり(または相当の Jupyter Notebook
,サブディレクトリ sub
にモジュール mod_a.py
があり(関数 func_a()
が存在),このモジュールを main.py
で import
し,さらにこのモジュールにおいて,モジュール mod_b.py
(関数 func_b()
が存在)を import
する状況を想定します.まず,sub
をパッケージとして認識させるため,sub
ディレクトリに空のファイル __init__.py
を作成します.図示すると以下の状況です.
myproject/main.py
sub/__init__.py
mod_a.py (func_a())
mod_b.py (func_b())
サブディレクトリ sub
は2つのモジュールを持ち,__init__.py
を用意しておくと,パッケージになります.すなわち,サブディレクトリがモジュールを束ねるパッケージです.
main.py
で mod_a.py
を import
main.py
でパッケージ sub
(あるいはサブディレクトリ sub
に含まれる,mod_a.py
を import
するには以下の様にします.
### myproject/main.pyにおいて
import sub.mod_a sub.mod_a.func_a()
または,以下のようにすることもできます.
### myproject/main.pyにおいて
from sub import mod_a mod_a.func_a()
さらに,以下のようすることもできます.
### myproject/main.pyにおいて
from sub.mod_a import func_a func_a
このように,fromで指定したもの以下をimportすると,そのimportしたものを直接(パッケージ名やモジュール名を付けずに)呼び出せるようになります.func_a
以外にも関数やクラスが存在している場合は,それぞれをカンマで区切って列挙するか,from sub.mod_a import *
のようにアスタリスクですべてを読み込むこともできます.ただし,アスタリスクで読み込むと,何を読み込んだか分からなくなるので,避けた方がよいでしょう.
モジュール mod_a
から同じサブディレクトリ sub
に存在する,モジュール mod_b
を import
する
この方法を見つけるのに苦労しました.以下のような方法があります.
### myproject/sub/mod_a.pyにおいて
from . import mod_b mod_b.func_b()
同じサブディレクトリなので,つい,import mod_b
としたくなりますが,これはエラーとなります..
の代わりにサブディレクトリ名 sub
を用いて以下のようにすることもできます.
### myproject/sub/mod_a.pyにおいて
from sub import mod_b mod_b.func_b()
ドット .
を使えばサブディレクトリ名に無関係となるので便利です.