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()
ドット . を使えばサブディレクトリ名に無関係となるので便利です.


