Python♪パッケージは、本を目で追うだけではわかりにくい。

 パッケージって、プログラムの初心者はあまり使わない(?)ですし、練習でコードを書くのにもフォルダを複数作る必要があり、面倒です。その割に、本を目で追うだけでは、わかったつもりになってしまう内容が多いです。この記事では、初心者が勘違いしたり、見落としそうな内容を整理し、ピックアップしたいと思います。

パッケージの理解には、自分でもコードを入力し実行してみることをお勧めします。なお、一度、importしたモジュールはPythonのインタプリタを、終了させなければimportしたままになるため、コードを検証する場合には、再起動する必要がありますので注意してください。

1.パッケージとは

パッケージを使うと、関係のある複数のモジュールをディレクトリ(フォルダ)にまとめ、整理することができます。

通常はモジュールを使用するときにはモジュールが入ったディレクトリにPATHが通ってなければなりません。しかし、パッケージの機能を使うと、importするときに、ディレクトリ(フォルダ)名と半角ピリオド「.」を用いて、モジュールの位置を指定することができるようになります。

例として、以下の図ようなフォルダ(ディレクトリ)構成のパッケージがあったとします。この例ではディレクトリpython_codeにはPATHが通っているという設定ですので、モジュールmain_mod.pyはフィル名を指定して実行することは可能です。しかし、ディレクトリaaa1やbbb1にはPATHが通っていませんので、パッケージの機能を使わなければ、その中にあるモジュールbbb1_mod1.pyは指定することができません。

この例ではディレクトリaaa1とbbb1には__init__.pyを入れ、パッケージであることを明示しています。ディレクトリに__init__.pyを入れることで、そのディレクトリ名(aaa1, bbb1)を使ってimport文を記述することができます。
具体的には「import aaa1.bbb1.bbb1_mod1」という記述が可能になります。なお、__init__.pyはコードを全く記述しない空のファイルでもかまいませんが、コードを記述することもできます。

※実はPytyon3.3からは、名前空間パッケージ(ネームスペースパッケージ)を用いることにより、__init__.pyがなくても同様のことができるようになりました。ですから、__init__.pyがなくてもエラーにはなりません。しかし、通常のパッケージ(レギュラーパッケージ)には__init__.pyが必要ですので、必要なものとして読み進めてください。通常のパッケージと名前空間パッケージの違いは、「7.通常のパッケージと名前空間パッケージ」で簡単に述べます。

[a001]

この記事のTopに戻る

2.パッケージからimportするための2つの書式

パッケージ内のモジュールをインポートする書式には2種類あります。具体的な例でインポートの仕方を説明します。

[a002]

この記事のTopに戻る

(1) 書式1 import ○○.△△.□□

1つめは「import ○○.△△.□□」という書式です。最後の□□はモジュール(あるいはパッケージ)にする必要があり、クラス、関数、変数にはできません。すると、必然的にその前の○○や△△は、パッケージになります。
なお、この書式で読み込んだモジュールを使用するときは、○○.△△.□□としなければなりません。○○や△△は省略することはできません。

コード01は、モジュールbbb1_mod1.pyの関数bbb1_def1を、main_mod.pyからimportし、実行したコードです。 「○○.△△.□□.関数名()」、「xxx = ○○.△△.□□ →  xxx.関数名()」といった書式で実行しています。実行例3のように、aaa1.bbb1.を省略することはできません。

#コード01
#インポート
import aaa1.bbb1.bbb1_mod1

#関数の実行例1
aaa1.bbb1.bbb1_mod1.bbb1_def1()

#関数の実行例2
xxx = aaa1.bbb1.bbb1_mod1
xxx.bbb1_def1()

#関数の実行例3(エラー)
#aaa1.bbb1.を省略することはできません。
bbb1_mod1.bbb1_def1()

[a002_01]

この記事のTopに戻る

(2) PATHが通っていないディレクトリの扱い

ディレクトリに__init__.pyを入れることにより、どこからでも呼び出せるようになるわけではありません。コード02は「import bbb1.bbb1_mod1」としていますが、ディレクトリbbb1が入っているディレクトリaaa1にはPATHが通っていませんので、aaa1.を省略することはできません。以下の例はエラーになります。

#コード02(エラー)
#bbb1が入っているaaa1にPATHが通っていない。
import bbb1.bbb1_mod1

[a002_02]

この記事のTopに戻る

(3) モジュールではなく、パッケージをインポートした場合

import ○○.△△.□□の書式は、□□をパッケージやモジュールにできるといいましたが、□□をパッケージとした場合、ディレクトリ□□の中のモジュールにはアクセスできません。
パッケージをimportした場合は、ディレクトリ□□の中の__init__.pyに、必要なモジュールをimportするコードを記述するといった使い方をしなければ、使い方が限定されると思われます。

コード03は、パッケージのbbb1をインポートした例ですが、実行例1、実行例2のようにbbb1の中のモジュールを呼び出そうとするとエラーになります。ただ、実行例3では<class ‘module’>が出力されますので、aaa1.bbb1がインポートされていないわけではありません。

#コード03
#インポート例1
import aaa1.bbb1

#関数の実行例1(エラー)
#bbb1の中のモジュールはimportされていない。
aaa1.bbb1.bbb1_mod1.bbb1_def1()

#関数の実行例2(エラー)
#bbb1の中のモジュールはimportされていない。
xxx = aaa1.bbb1.bbb1_mod1
xxx.bbb1_def1()

#関数の実行例3
#<class 'module'>が出力される。
print(type(aaa1.bbb1))

[a002_03]

この記事のTopに戻る

(4) 書式2  from ○○.△△ import □□

書式2「from ○○.△△ import □□」では、importの後の□□の部分は、△△.□□のようにドットが入る書式にはできません。したがって、「from ○○.△△ import □□」を「from ○○ import △△.□□」とは書き換えられません。(コード04のインポート例2を参照)
なお、□□は、書式1と異なり、パッケージ、モジュール、クラス、関数、変数のどれでもかまいません。

モジュールを実行するときは、importの後の□□を使います。○○.△△.□□とすると、エラーになります。(コード04の実行例2を参照)

#コード04
#インポート例1
from aaa1.bbb1 import bbb1_mod1

#インポート例2(エラー)
#importより後は「.」が入った書式にできない。
from aaa1 import bbb1.bbb1_mod1

#関数の実行例1
bbb1_mod1.bbb1_def1()

#関数の実行例2(エラー)
#fromのあとのaaa1.bbb1は記述できない。
aaa1.bbb1.bbb1_mod1.bbb1_def1()

[a002_04]

この記事のTopに戻る

3.__init__.pyが実行されるタイミング

モジュールはimportしたときに一度だけ、モジュール内のコードを実行します。その性質を使って、__init__.pyが、どのタイミングでimportされるのかを確認します。フォルダ構成と各モジュールのコードは以下のようになっています。

#コード05
print('■メインモジュールmain_modのコード開始')

from aaa1.bbb1.bbb1_mod1 import bbb1_def1

print('■メインモジュールmain_modのimport文実行完了')
bbb1_def1()
print('■メインモジュールmain_modの__name__→',__name__)
print('■メインモジュールmain_modのコード終了')
#出力05
■メインモジュールmain_modのコード開始
ディレクトリaaa1の中の__init__.py
ディレクトリbbb1の中の__init__.py
モジュールbbb1_mod1の__name__→ aaa1.bbb1.bbb1_mod1
■メインモジュールmain_modのimport文実行完了
モジュールbbb1_mod1の関数bbb1_def1
■メインモジュールmain_modの__name__→ __main__
■メインモジュールmain_modのコード終了

結果から言うと、import文の中で、その__init__.pyが入ったディレクトリの名称が使われるときに実行されます。上のコード05では、4行目の「from aaa1.bbb1.bbb1_mod1 import bbb1_def1」の赤字の部分により、aaa1, bbb1の__init__.pyが実行されます。
出力05では、__init__.pyのインポートはコード05の1行目のprint文よりも後に実行されています。ですから、コードが実行される前にまとめて__init__.pyが処理されるわけではありません。
次に、aaa1, bbb1の__init__.pyが実行されたあとに、コード05の4行目の 「from aaa1.bbb1.bbb1_mod1 import bbb1_def1」の赤字の部分により、モジュールbbb1_mod1のコードが実行されています。
コード05の4行目は、モジュールbbb1_mod1ではなく、関数のbbb1_def1をimportする命令文なのですが、モジュールbbb1_mod1のコードが実行されています。
なお、bbb1_def1は、モジュールではなく関数ですので、インポートされるときに関数の中のコードは実行されません。

その他にも、メインモジュールであるmain_mod.pyの「__name__」が「__main__」になっているのに対して、モジュールbbb1_mod1の「__name__」が「aaa1.bbb1.bbb1_mod1」になっている点が注目ポイントです。モジュールの「__name__」は、メインモジュールとして実行したときには「__main__」となり、import文でインポートした時には「モジュール名」となります。
パッケージを用いて読み込んだ場合には、モジュール名「bbb1_mod1」だけではなく、モジュールの位置がわかるように「aaa1.bbb1.bbb1_mod1」となっています。

[a003]

この記事のTopに戻る

4.絶対importと相対import

importによるモジュールの位置の指定には、絶対importと相対importがあります。今までの具体例は、全て絶対importです。たとえば「from aaa1.bbb1.bbb1_mod1 import bbb1_def1」のように、PATHが通っているディレクトリ内のパッケージaaa1から始まる記述になっています。
一方、「カレントディレクトリ」からの相対位置によってモジュールの位置を示すのが相対importです。相対importでは、以下の様にピリオド「.」を用いて相対位置を表現します。

「.」カレントディレクトリ
「..」親ディレクトリ
「…」親ディレクトリの親ディレクトリ
「….」親ディレクトリの親ディレクトリの親ディレクトリ

[a004]

この記事のTopに戻る

(1) 相対importの具体的な書式

例えば下の図のようなフォルダ(ディレクトリ)構成で、図の右に示すようなコードが記述されているとします。
この場合、モジュールbbb1_mod2からモジュールbbb1_mod2や関数bbb1_def1をimportするときは、コード06のようになります。呼び出し元のモジュールbbb1_mod2が存在するディレクトリ(bbb1)がカレントディレクトリになります。4行目の「from . import bbb1_mod1」の「.」は、絶対importでは「aaa1.bbb1」に相当します。
なお相対importは、書式2 「from ○○.△△ import □□」では使用できますが、書式1「 import ○○.△△.□□」では使用できず、エラーとなります。

#コード06

#インポート例1
from . import bbb1_mod1

#インポート例2
from .bbb1_mod1 import bbb1_def1 

#インポート例3(エラー)
#「import ○○.△△.□□」タイプは使えない
import .bbb1_mod1

次に、モジュールbbb1_mod2からモジュールaaa1_mod1や関数aaa1_def1をimportする例をコード07の示します。「..」は呼び出し元のモジュールbbb1_mod2のカレントディレクトリ(bbb1)の親のディレクトリ(aaa1)を示します。したがって、コード06の4行目「from .. import aaa1_mod1」の「..」は絶対importの「aaa1」に相当します。

#コード07

#インポート例1
from .. import aaa1_mod1

#インポート例2
from ..aaa1_mod1 import aaa1_def1

#インポート例3(エラー)
#「import ○○.△△.□□」タイプは使えない
import ..aaa1_mod1

[a004_01]

この記事のTopに戻る

(2) 相対importの実行例

以下、具体的な実行例を示します。

以下、main_mod.py(コード08a)、bbb1_mod2.py(コード08b)のコードと、main_mod.pyの実行結果を出力08に示します。どの様な順番で実行されているのかが、出力08を見ればわかると思います。なお、min_mod.pyの出力には「■」、bbb1_mod2.pyの出力には「□」を出力の頭につけました。

#コード08a(main_mod.py)
print('■メインモジュールmain_modのコード開始')

from aaa1.bbb1.bbb1_mod2 import bbb1_def2

print('■メインモジュールmain_modのimport文実行完了')
bbb1_def2()
print('■メインモジュールmain_modの__name__→',__name__)
print('■メインモジュールmain_modのコード終了')
#コード08b(bbb1_mod2.py)
print('□bbb1_mod2の一番最初')

from .. import aaa1_mod1
from .bbb1_mod1 import bbb1_def1

def bbb1_def2():
    print('□モジュールbbb1_mod2の関数bbb1_def2')
    
aaa1_mod1.aaa1_def1()
bbb1_def1()
print('□モジュールbbb1_mod2の__name__→',__name__)
#出力08
■メインモジュールmain_modのコード開始
ディレクトリaaa1の中の__init__.py
ディレクトリbbb1の中の__init__.py
□bbb1_mod2の一番最初
モジュールaaa1_mod1の__name__→ aaa1.aaa1_mod1
モジュールbbb1_mod1の__name__→ aaa1.bbb1.bbb1_mod1
モジュールaaa1_mod1の関数aaa1_def1
モジュールbbb1_mod1の関数bbb1_def1
□モジュールbbb1_mod2の__name__→ aaa1.bbb1.bbb1_mod2
■メインモジュールmain_modのimport文実行完了
□モジュールbbb1_mod2の関数bbb1_def2
■メインモジュールmain_modの__name__→ __main__
■メインモジュールmain_modのコード終了

[a004_02]

この記事のTopに戻る

(3) メインモジュールには相対importは使えない

メインモジュール(main_mod.py)に下記のような相対importは使用できません。相対importを使うと、出力09のようなエラーが発生します。
上の出力08の13行目を見るとわかりますが、モジュールをメインモジュールとして使う場合には、変数__name__には’__main__’という文字列が代入されます。そして、相対importでは、この’__main__’という文字列がカレントディレクトリの位置を示す文字列として認識されます。しかし、’__main__’は、モジュールの位置を示す名称とは扱えないので、「’__main__’がパッケージではない」というエラーが発生したのです。
出力08の6, 7, 10行目のように、import文によりインポートされたモジュールは、変数__name__に、カレントディレクトリの位置を示す文字列が代入されるので、相対importを使うことができます。

#コード09(エラー)
#メインモジュール(main_mod.py)では相対importは使用できない。
from .bbb1.bbb1_mod2 import bbb1_def2
#出力09
ModuleNotFoundError: No module named '__main__.bbb1'; '__main__' is not a package

[a004_03]

この記事のTopに戻る

5.「from ○○.△△ import *」の利用

自分が用意したパッケージで、「from ○○.△△ import *」のような書式で「*(アスタリスク)」を使って、ディレクトリ内のモジュールを一度にインポートしようとしても、複数のモジュールを読み込むための準備をしなければ、なにもimportできません。
つまり、それなりの準備をすれば、複数のモジュールを一度にインポートできますが、不特定多数のモジュールがインポートされてしまうこの方法は、推奨されていませんので、極力避けるようにしてください。

[a005]

この記事のTopに戻る

(1) 「import *」だけでは何もインポートできない

下のようなディレクトリ(フォルダ)構成のパッケージがあったとします。そして、main_mod.pyのコードがコード11のように、単純にモジュールbbb1_mod2を読み込むだけのコードを実行すると、出力11のように出力され、モジュールbbb1_mod2がインポートされていることがわかります。

#コード11(main_mod.py)
from aaa1.bbb1 import bbb1_mod2
#出力11
ディレクトリaaa1の中の__init__.py
ディレクトリbbb1の中の__init__.py
モジュールbbb1_mod2の__name__→ aaa1.bbb1.bbb1_mod2

次に、importの後を「*」にしてみます。今度は、出力12より、ディレクトリbbb1内のモジュールbbb1_mod1, bbb1_mod2は、どちらもインポートされていないことがわかります。「import *」を使って「モジュール」を読み込むのはこれだけではできません。

#コード12(main_mod.py)
from aaa1.bbb1 import *
#出力12
ディレクトリaaa1の中の__init__.py
ディレクトリbbb1の中の__init__.py

なお、ここで、混同してはならないのは、「モジュール」ではなく、「関数」ならば「import *」により読み込み可能です。例えばmain_mod.pyのimport を、「from aaa1.bbb1.bbb1_mod1 import *」とすれば、モジュールbbb1_mod1の中の関数「bbb1_def1()」を、関数名だけで呼び出せるようになります。

さて、話を元に戻しますが、それでは、どのようにすれば「import *」により、モジュールを読み込むことができるのでしょうか。以下、2つの使い方をご紹介します。

[a005_01]

この記事のTopに戻る

(2)  使い方1:先にimportしたモジュールをimport

先に「import ○○.△△.□□」でimportしたモジュールを「from ○○.△△ import *」でインポートすると、モジュールを呼び出すときに○○.△△の部分を省略できます。
コード13では、5行目の関数の実行部分で、「aaa1.bbb1.bbb1_mod2.bbb1_def2」とする必要があり、エラーになります。

#コード13(main_mod.py)(エラー)
#関数の実行では、aaa1.bbb1.bbb1_mod2.bbb1_def2 とする必要がある。
import aaa1.bbb1.bbb1_mod2

bbb1_mod2.bbb1_def2()

それに対して、コード14のように、「import aaa1.bbb.bbb1_mod2」のあとに「from aaa1.bbb1 import *」とすると、「aaa1.bbb1.」は不要となり、「bbb1_mod2.bbb1_def2()」で、関数を実行することができました。

#コード14(main_mod.py)
import aaa1.bbb1.bbb1_mod2
from aaa1.bbb1 import *

bbb1_mod2.bbb1_def2()
#出力14
ディレクトリaaa1の中の__init__.py
ディレクトリbbb1の中の__init__.py
モジュールbbb1_mod2の__name__→ aaa1.bbb1.bbb1_mod2
モジュールbbb1_mod2の関数bbb1_def2

[a005_02]

この記事のTopに戻る

(3) 使い方2:__init__.pyに「__all__=リスト」を記述

「import *」を用いて、複数のモジュールを読み込む方法として、__init__.pyの中に「__all__=読み込みたいモジュール名のリスト」を書き込む方法があります。

コード15a(main_mod.py)と、コード15b(ディレクトリbbb1の中の__init__.py)を見てください。ディレクトリbbb1の中の「__init__.py」に、「__all__=[‘bbb1_mod1’, ‘bbb1_mod2’]」を書き込むと、main_mod.pyの中から「from aaa1.bbb1 import *」とすることで、複数のモジュールをインポートすることができました。

#コード15a(main_mod.py)
from aaa1.bbb1 import *
#コード15b(ディレクトリbbb1の中の__init__.py)
print('ディレクトリbbb1の中の__init__.py')
__all__=['bbb1_mod1', 'bbb1_mod2']
#出力15
ディレクトリaaa1の中の__init__.py
ディレクトリbbb1の中の__init__.py
モジュールbbb1_mod1の__name__→ aaa1.bbb1.bbb1_mod1
モジュールbbb1_mod2の__name__→ aaa1.bbb1.bbb1_mod2

なお、参考までに、コード16aのように、「import aaa1.bbb1」だけでは、「__all__=モジュールのリスト」で指定したモジュールはインポートされません。(コード16bはコード15bと同じ内容)

#コード16a(main_mod.py)
import aaa1.bbb1
#コード16b(ディレクトリbbb1の中の__init__.py)
print('ディレクトリbbb1の中の__init__.py')
__all__=['bbb1_mod1', 'bbb1_mod2']
#出力16
ディレクトリaaa1の中の__init__.py
ディレクトリbbb1の中の__init__.py

[a005_03]

この記事のTopに戻る

6.__init__.pyの中でimportする方法

__init__.pyの中で、複数のモジュールをimportする方法もあります。この方法であれば、相対importや絶対importにより、様々な場所のモジュールをインポートすることが可能です。
ただし、この方法は、「__all__」を使う方法よりも、更に不特定多数のモジュールがインポートされてしまいますので、極力、使用を避けたい方法です。

[a006]

この記事のTopに戻る

(1) __init__.pyが入ったパッケージをimportする方法

下のようなディレクトリ構成のパッケージを想定します。この中で、ディレクトリbbb1の中の__init__.pyに、import文を記述します。

ディレクトリbbb1の中の__init__.pyのコードはコード17bのようになっており、モジュールaaa1_mod1, bbb1_mod1, bbb1_mod2をimportするためのimport文が記述されています。そして、このコード17bを実行するためには、 コード17aのように「import aaa1.bbb1」とし、パッケージbbb1をインポートします。
この方法でimportしたモジュールは、モジュール名だけでは実行できず、「aaa1.bbb1.bbb1_mod2.bbb1_def2()」「aaa1.aaa1_mod1.aaa1_def1()」といった書式で、関数を実行します。

#コード17a(main_mod.py)
import aaa1.bbb1

aaa1.bbb1.bbb1_mod2.bbb1_def2()
#bbb1.bbb1_mod2.bbb1_def2() #エラー
#bbb1_mod2.bbb1_def2() #エラー

aaa1.aaa1_mod1.aaa1_def1()
#aaa1_mod1.aaa1_def1() #エラー
#コード17b(ディレクトリbbb1の中の__init__.py)
print('ディレクトリbbb1の中の__init__.py')
from . import bbb1_mod1
from . import bbb1_mod2
from .. import aaa1_mod1
#出力17
ディレクトリaaa1の中の__init__.py
ディレクトリbbb1の中の__init__.py
モジュールbbb1_mod1の__name__→ aaa1.bbb1.bbb1_mod1
モジュールbbb1_mod2の__name__→ aaa1.bbb1.bbb1_mod2
モジュールaaa1_mod1の__name__→ aaa1.aaa1_mod1
モジュールbbb1_mod2の関数bbb1_def2
モジュールaaa1_mod1の関数aaa1_def1

[a006_01]

この記事のTopに戻る

(2) 「import *」を使用する方法

ディレクトリの構成は先ほどの例と同じです。メインモジュールであるmain_modのコードのみ、記述内容を変えます。

ディレクトリbbb1の中の__init__.pyのコードは先ほどと同じで、コード18bのようになっており、モジュールaaa1_mod1, bbb1_mod1, bbb1_mod2をimportするためのimport文が記述されています。ただ、今度は、このコード18bを実行するために、 コード18aのように「from aaa1.bbb1 import *」としました。
この方法でimportしたモジュールは、モジュール名だけで実行できでき、モジュール名の前にパッケージ名を加えるとエラーになります。

#コード18a(main_mod.py)
from aaa1.bbb1 import *

#aaa1.bbb1.bbb1_mod2.bbb1_def2() #エラー
#bbb1.bbb1_mod2.bbb1_def2() #エラー
bbb1_mod2.bbb1_def2()

#aaa1.aaa1_mod1.aaa1_def1() #エラー
aaa1_mod1.aaa1_def1()
#コード18b(ディレクトリbbb1の中の__init__.py)
print('ディレクトリbbb1の中の__init__.py')
from . import bbb1_mod1
from . import bbb1_mod2
from .. import aaa1_mod1
#出力18
ディレクトリaaa1の中の__init__.py
ディレクトリbbb1の中の__init__.py
モジュールbbb1_mod1の__name__→ aaa1.bbb1.bbb1_mod1
モジュールbbb1_mod2の__name__→ aaa1.bbb1.bbb1_mod2
モジュールaaa1_mod1の__name__→ aaa1.aaa1_mod1
モジュールbbb1_mod2の関数bbb1_def2
モジュールaaa1_mod1の関数aaa1_def1

[a006_02]

この記事のTopに戻る

7.通常のパッケージと名前空間パッケージ

通常のパッケージ(レギュラーパッケージ)と名前空間パッケージ(ネームスペースパッケージ)の実用的な部分での違いを簡単に説明します。なお、明快な通常のパッケージを利用することをお勧めします。

[a007]

(1) 通常のパッケージの利点

(a) __init__.pyの中に「__all__=[モジュールのリスト]」という書式で一度にimportしたいモジュールを列挙することができる。
(b) __init__.pyの中にimport文を記述することができる。
(c) __init__.pyが入っていれば、パッケージであることが判別できる。

[a007_01]

(2) 名前空間パッケージの利点

(a) __init__.pyを省略できる。
(b) PATHが通っているところに、同じ名前のディレクトリが存在した場合でも、それぞれの同名のディレクトリの中にあるモジュールを指定することができる。ただし、これは、メリットでもあり、デメリットでもある。(通常のパッケージではエラーになるため、ディレクトリ名の重複をさけることができる。)

[a007_02]

この記事のTopに戻る