Pythonでモジュールやパッケージをインポート

Table of Content

ディレクトリ myprojectmain.py があり(または相当の Jupyter Notebook ,サブディレクトリ sub にモジュール mod_a.py があり(関数 func_a() が存在),このモジュールを main.pyimport し,さらにこのモジュールにおいて,モジュール 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.pymod_a.pyimport

main.py でパッケージ sub(あるいはサブディレクトリ sub に含まれる,mod_a.pyimport するには以下の様にします.

### 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_bimport する

この方法を見つけるのに苦労しました.以下のような方法があります.

### 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()

ドット . を使えばサブディレクトリ名に無関係となるので便利です.

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください