モジュールとパッケージの基本#

注意

このノートの学習では、Jupyter Notebook を使いません。

Python に限らず、ある程度規模が大きなアプリケーションを作る場合、ひとつのスクリプトファイルにすべてのコードを記述することは、ほとんどありません。コードは関連するものでグループ化し、グループ毎にスクリプトファイルを作って管理します。Python には、こうしたコードの適切な管理を促進するための モジュールパッケージ の 2 つの仕組みがあります。

  • モジュール
    変数や関数、クラスがまとめられた、ひとつのスクリプトファイル(拡張子「.py」)のことです。モジュール内の変数や関数、クラスは他のスクリプトファイルから読み込んで利用することができます。

  • パッケージ
    簡単に言えば、複数のモジュールをまとめたディレクトリ(フォルダ)のことです。関連するモジュールをグループ化して階層構造で整理できたり、パッケージ名で名前空間を分割してモジュール間の名前の衝突を回避できたりするなど、様々なメリットがあります。

このノートでは、自作のモジュールやパッケージを作ることで、それぞれの基本的な仕組みを学びます。

1. モジュールの基本#

まずは簡単なモジュールを自作して、モジュールの基本を学びましょう。

1-1. ディレクトリとファイル準備#

学習用のディレクトリ LearnPython の下に、module という名前のディレクトリ(フォルダ)を新たに作ります。さらに、その中に、 root.pysub.py の 2 つのスクリプトファイルを作成してください。root.pypython コマンドで直接実行するスクリプトファイルです。sub.pyroot.py から読み込んで利用します。

LearnPython
   |___ module
          |___ root.py
          |___ sub.py

1-2. sub.py の作成#

まずは、sub.py から作成します。以下のように、変数と関数をひとつずつ定義して、ファイルを保存してください。これだけで、このスクリプトファイルはモジュールとなり、中で定義した変数や関数、クラスは他のスクリプトファイルから利用できるようになります。

filename = 'sub.py'


def hello():
    print('hello')

1-3. root.py の作成#

次に root.py を作成します。他のモジュールは import キーワードに続けて、拡張子(.py)を除いたスクリプトファイルの名前を指定すると、読み込むことができます。

import スクリプトファイル名拡張子を除く

このように Python では、スクリプトファイルの名前がそのままモジュール名になります。また、モジュールを読み込むことを インポート と呼びます。

それでは、root.py から sub モジュール(sub.py)をインポートします。先頭に以下の import 文を記述してください。

import sub

モジュール内で定義された変数や関数は、モジュール名.変数名モジュール名.関数名 で参照できます。以下のように、sub モジュールで定義した変数 filename と関数 hello をそれぞれ参照するコードを追加してください。

import sub

print(sub.filename)
sub.hello()

これで自作のモジュールとそのモジュールを利用したスクリプトができました。

1-4. スクリプトの実行#

main.py を実行します。ターミナル(PowerShell)を開き、LearnPython がカレントディレクトリになっていることを確認して、python ./module/root.py を実行してください。モジュールが問題なくインポートできていれば、「sub.py」と「hello」がターミナルに出力されます。

> python ./module/root.py
sub.py
hello

このように、python コマンドの引数に指定して実行するスクリプトファイルはメインモジュールとも呼ばれます。Python はメインモジュールを根本として、インポートが必要なモジュールを探索する仕組みになっています。

1-5. インポートしたモジュールに別名を付ける#

インポートするモジュールには as キーワードを使って、別名を付けることもできます。今のように短いモジュール名であれば別名を付ける必要はありませんが、長いモジュール名だったり、もしくは他のモジュールやファイル内の変数や関数と名前が衝突したりする場合は、別名を付けてください。

import モジュール名 as モジュールの別名

以下の例では、 sub モジュールに s と別名を付けて利用しています。

import sub as s

print(s.filename)  # モジュールの別名から変数や関数を参照できる
s.hello()

1-6. モジュールから特定の変数や関数のみをインポートする#

モジュールから特定の変数や関数、クラスだけを直接インポートすることもできます。その場合、import の前に from というキーワードを付け、インポートの対象が所属するモジュールを指定します。

from モジュール名 import モジュール内の変数や関数クラスの名前

この方法でインポートすれば、参照するときの モジュール名. を省略できるようになります。以下の例では、sub モジュールから直接、変数 filename をインポートしているため、こちらは参照時に sub. を省略できています。

import sub
from sub import filename

print(filename)  # 「モジュール名.」を省略できる
sub.hello()      # hello は直接インポートしていないため「モジュール名.」は省略できない

1-7. 複数のモジュールや変数、関数などをインポートする#

複数のモジュールや変数、関数などをインポートする場合、それぞれに import 文を書くこともできますが、次のようにカンマ区切りで並べると、ひとつの文にまとめることができます。

import モジュール名1, モジュール名2, ...
from モジュール名 import 変数名, 関数名, クラス名, ...

以下の例では、 sub モジュールから変数 filename と関数 hello の両方を 1 つの import 文でインポートしています。

from sub import filename, hello

print(filename)
hello()

1-8. import 文を記述すべき場所#

基本的に import 文はファイル内のどこにでも記述できますが、PEP8 というコーディング規約では、ファイルの先頭に記述することが推奨されています。また、import 文は、以下のように、いくつかのグループに分け、各グループ間には空行を入れることが推奨されています。

import 標準ライブラリ
# 空行
import サードパーティ製のライブラリ
# 空行
import 自作のライブラリ

ライブラリ という言葉は、特定の機能やタスクを実行するために必要な再利用できるコードの集まりのことを指します。ここでは、関数やクラス、モジュールの集まりだと考えてください。

2. パッケージの基本#

続けて、簡単なパッケージを自作して、パッケージの基本を学びましょう。

2-1. ディレクトリとファイルの準備#

同じく、学習用のディレクトリ LearnPython の下に、mypackage という名前のディレクトリを新たに作ります。さらに、その中に、 __init__.pymodule1.pymodule2.py の 3 つのスクリプトファイルを作成してください。

また、LearnPython の直下に test_package.py を作成します。このスクリプトファイルから mypackage にある module1module2 の 2 つのモジュールをインポートして利用します。

LearnPython
   |___ test_package.py
   |___ mypackage
          |___ __init__.py
          |___ module1.py
          |___ module2.py

Python では、 __init__.py が存在するディレクトリがパッケージとして扱われます。__init__.py には、次のような設定を行うコードを記述します。

  • パッケージ全体で必要な初期化処理

  • パッケージ内だけで使う非公開モジュールと外部から利用できる公開モジュールの制御

  • サブパッケージのインポート

  • パッケージレベルの変数や関数の定義

  • パッケージのバージョン情報の定義

特にこうした設定が必要なければ、__init__.py は空にして構いません。今回はどちらのモジュールも外に公開するため、__init__.py は空のままにしておきます。

2-2. module1.py の作成#

このファイルには、以下のようにひとつだけ変数を定義して保存します。

filename = 'module1.py'

2-3. module2.py の作成#

module1.py と同じく、ひとつだけ変数を定義して保存します。

filename = 'module2.py'

2-4. test_package.py の作成#

パッケージをインポートしたり、パッケージから特定のモジュールをインポートしたりする場合、以下のように記述します。

import パッケージ名
from パッケージ名 import モジュール名

test_package.py に、上で用意した mypackage から module1module2 の 2 つのモジュールをインポートするコードを、次のように書いてください。これで、 各モジュール内に定義した変数 filename を参照できるようになります。

from mypackage import module1, module2

print(module1.filename, module2.filename)

2-5. メインモジュールの実行#

最後に、python コマンドで test_package.py を実行して動作を確認します。ターミナルを開き、LearnPython がカレントディレクトリになっていることを確認した上で、python test_package.py をターミナル上で実行してください。以下のように文字列が出力されていれば、問題なくパッケージから各モジュールをインポートできています。

> python test_package.py
module1.py module2.py

おわりに#

非常に簡単な例でしたが、モジュールとパッケージをそれぞれ自作したことで、少し理解ができたのではないでしょうか。Python の標準ライブラリには、OSの機能を呼び出したり、ファイル操作やインターネット通信を行ったりする機能を提供するモジュールが数多く用意されています。次のノートでは、その中から分かりやすいものをいくつかピックアップして紹介します。