モジュール、パッケージ、ライブラリ|使い方や違いを使って理解しよう(初心者にもわかりやすく)【Python入門・応用17】

Python入門・応用17.サムネイル
Python入門・応用講座

こんにちは。キノコードです。この動画ではPythonのモジュールやパッケージ、ライブラリについて説明します。

この記事の執筆・監修

キノコード
キノコード

テクノロジーアンドデザインカンパニー合同会社のCEO。
日本最大級のプログラミング教育のYouTubeチャンネル「キノコード」や、プログラミング学習サービス「キノクエスト」を運営。
著書「あなたの仕事が一瞬で片付くPythonによる自動化仕事術」や、雑誌「日経ソフトウエア」や「シェルスクリプトマガジン」への寄稿など実績多数。

モジュール、パッケージ、ライブラリの違い

まず、モジュール、パッケージ、ライブラリの違いについて説明します。
モジュールは、関数やクラスをまとめたもので、拡張子が「.py」のPythonファイルのことです。
普段、みなさんが作成しているPythonファイルもモジュールとして読み込むことができます。
パッケージは、複数のモジュールをまとめたフォルダのことです。
ライブラリは、関数やクラス、モジュール、パッケージなど、他のプログラムから呼び出されるものの総称です。
複数のパッケージをまとめたものとして、ライブラリということもあります。
ライブラリの中にパッケージがあり、パッケージの中にモジュールがあるとイメージしていただけると理解しやすいと思います。

モジュールとパッケージの作成

最初にモジュールとパッケージを作成しましょう。
まず、rectangleというモジュールを作成します。
VSCodeを使っている方はエクスプローラーを開き、新しいファイルをクリックし、rectangle.pyという名前にします。
rectangleは長方形という意味です。

height = 10
width = 5

def area(height, width):
    return height * width

def edge_length(height, width):
    return 2 * (height + width)

モジュールの中では、heightとwidthという変数を定義し、それぞれ10と5を代入します。
次に、長方形の面積を計算する関数を作成しましょう。
areaという関数を定義し、引数にheightとwidthを渡します。
return文でheight、掛ける、widthの結果を返します。
もう一つ、長方形の辺の長さを計算する関数を作成しましょう。
edge_lengthという関数を定義し、引数にheightとwidthを渡します。
return文で2、掛ける、括弧、height、足す、width、括弧閉じ、の結果を返します。
これでrectangleモジュールが完成です。
拡張子の「.py」の前までがモジュール名です。

次はパッケージを作成しましょう。
エクスプローラーの新しいフォルダをクリックし、calculationという名前のフォルダを作成します。
作成したcalculationのフォルダの中にinitというモジュールを作成します。
新しいファイルをクリックし、init.pyという名前にします。
このinitモジュールは、パッケージを初期化するためのモジュールです。
通常、パッケージを作成するときは、このinitモジュールを作成します。
そうすると、パッケージを読み込む際、まずこのinitモジュールが読み込まれます。
このinitモジュールには、パッケージを読み込んだときに実行したいプログラムを書くこともできますし、何も書かなくても大丈夫です。
何も書かなかったとしても、このinitモジュールがあることによって、calculationがパッケージとして認識されます。
今回はこのinitモジュールには何も書かないことにします。
そしてこのcalculationの中に、更にadditionというモジュールを作成しましょう。

def add(x, y):
    return x + y

addという関数を定義し、引数にxとyを渡します。
return文でx、足す、yの結果を返します。
これでadditionモジュールは完成です。

もう一つ、calculationの中にsubtractionというモジュールを作成しましょう。

def sub(x, y):
    return x - y

subという関数を定義し、引数にxとyを渡します。
return文でx、引く、yの結果を返します。
これでsubtractionモジュールは完成です。

これで今回のレッスンで使うモジュールとパッケージが作成できました。
一つ一つのPythonファイルがモジュールです。
そして、モジュールが入っているcalculationというフォルダがパッケージです。

モジュールとパッケージの使用方法

次に、モジュールとパッケージの使用方法について説明します。
Pythonではimport文を使ってインストールしたライブラリや、自分で作成したパッケージやモジュールなどを読み込むことができます。
先ほど作成したモジュールやパッケージを使いながら確認していきましょう。

import rectangle

a = rectangle.height
print(a)

先ほど作成したrectangleモジュールと同じ階層に新しくPythonファイルを作成します。
このファイル名は任意の名前で大丈夫です。
このファイルから、モジュールを読み込んでみましょう。
importの後に読み込みたいモジュール名を書きます。
import、スペース、rectangleと書くと、rectangleモジュールを読み込むことができます。
そして、モジュール名、ドット、オブジェクト名と書くことで、モジュール内で定義した変数や関数などのオブジェクトを使用できます。
rectangleモジュールではheightという変数を定義しました。
この変数を使ってみましょう。
rectangle、ドット、heightと書き、これを変数aに代入します。
print関数でaを表示させてみましょう。
実行します。

10と表示されました。
rectangleモジュールで定義した変数を使えることがわかります。

import rectangle

result = rectangle.area(4, 5)
print(result)

次はrectangleモジュールで定義した関数areaを使ってみましょう。
rectangle、ドット、areaと書き、引数に4と5を渡します。
結果を変数resultに代入し、表示させてみましょう。
実行します。

20と表示されました。
読み込んだモジュールで定義した関数も使えることがわかります。

from rectangle import height, width, area

print(height)
print(width)
print(area(4, 5))

また、fromを使ってモジュールを読み込むこともできます。
from、モジュール名、import、オブジェクト名と書くと、モジュール内のオブジェクトを読み込むことができます。
from、rectangle、importと書いて、変数heightとwidth、関数areaを読み込んでみましょう。
同じモジュールから複数のオブジェクトを読み込むときはカンマで区切ります。
print関数でheightとwidthを表示させてみましょう。
また、areaの引数に4と5を渡して表示させてみましょう。
実行します。

結果が表示されました。
読み込んだ変数や関数を使えることがわかります。

from rectangle import edge_length as edge

print(edge(4, 5))

更に、asを使うことでインポートしたオブジェクトを別名で読み込むことができます。
asで別名を付けた場合は、もとのオブジェクト名としては使えないので注意しましょう。
from、rectangle、import、edge_length、as、edgeと書いて、rectangleモジュールで定義したedge_length関数をedgeとして使用できるようにします。
edgeの引数に4と5を渡して表示してみましょう。
実行します。

18と表示されました。
edge_length関数をedgeとして使えることがわかります。

from calculation import addition

result = addition.add(1, 2)
print(result)

今度はパッケージの中にあるモジュールを読み込んでみましょう。
from、パッケージ名、import、モジュール名と書くと、パッケージ内のモジュールを読み込むことができます。
from、calculation、import、additionと書いて、calculationパッケージの中にあるadditionモジュールを読み込みます。
そしてadditionモジュールのadd関数を使い、引数に1と2を渡します。
結果を変数resultに代入し、表示させてみましょう。
実行します。

3と表示されました。
パッケージの中にあるモジュールを読み込めていることがわかります。

from calculation.subtraction import sub

result = sub(2, 1)
print(result)

また、from、パッケージ名、ドット、モジュール名、import、オブジェクト名と書くと、パッケージの中にあるモジュール内のオブジェクトを読み込むことができます。
from、calculation、ドット、subtraction、import、subと書いて、calculationパッケージの中にあるsubtractionモジュール内のsub関数を読み込みます。
読み込んだsub関数を使い、引数に2と1を渡します。
結果を変数resultに代入し、表示させてみましょう。
実行します。

1と表示されました。
sub関数を読み込めていることがわかります。

ライブラリ

次は、ライブラリについて説明します。
ライブラリは関数やクラス、モジュール、パッケージなど、他のプログラムから呼び出されるものの総称と説明しました。
先ほど作成したパッケージやモジュールは全てライブラリです。
その他にも、ライブラリには標準ライブラリとサードパーティーライブラリがあります。
サードパーティーライブラリは外部ライブラリとも言います。
それぞれについて、詳しく説明します。

標準ライブラリ

まず標準ライブラリについて説明します。
標準ライブラリは、Pythonをインストールした時に一緒にインストールされるパッケージ、モジュール、関数などのことです。
別でインストールせずに、import文を書くと使用可能になる「math」や「random」などは標準ライブラリです。
また、import文を書かずに使えるprint関数などの組み込み関数も標準ライブラリです。

サードパーティーライブラリ

次に、サードパーティーライブラリについて説明します。
サードパーティーライブラリは、Pythonをインストールした時点ではインストールされていないパッケージ、モジュール、関数などのことです。
サードパーティーライブラリは、インストールしてimport文を書くと使用できます。
データサイエンスで用いられる「pandas」や、グラフを描写できる「matplotlib」などはサードパーティーライブラリです。
サードパーティーライブラリが豊富なことがPythonの強みの一つです。
多くのサードパーティーライブラリがあることで、機械学習やデータ分析、グラフ化などの幅広い用途で使うことができます。

モジュールをインポートしたときの挙動

次に、モジュールをインポートしたときの挙動について説明します。
import文でモジュールをインポートすると、そのPythonファイルを実行するのと同じ処理を実行します。
確認してみましょう。

print("hello")

rectangleモジュールと同じ階層に、新しくgreeting.pyというファイルを作成します。
そして、print関数でhelloと表示させます。
これで完成です。
まず、このファイルを実行してみましょう。
実行します。

helloと表示されました。

import greeting

もう一つ、rectangleモジュールと同じ階層に、新しくsample.pyというファイルを作成します。
このファイルから、先ほど作成したgreetingモジュールをインポートしてみましょう。
import greetingとだけ書きます。
結果を確認してみましょう。
実行します。

先ほどと同様に、helloと表示されました。
import文でgreetingをインポートすることによって、greetingを実行するのと同じ処理が実行されていることがわかります。

モジュールのアトリビュート

最後に、モジュールのアトリビュートについて説明します。
Pythonのモジュールでは、いくつかのアトリビュートが自動的に定義されます。
確認してみましょう。

print(dir())

組み込み関数のdir関数を使うと、オブジェクトのアトリビュートを取得できます。
引数を渡さない場合は、実行しているPythonファイルのアトリビュートが取得されます。
dir関数の引数を渡さずに、print関数で表示してみましょう。
実行します。

前後にアンダースコアが2つ付いた、いくつかのアトリビュートが表示されました。
このように何も書いていないファイルでも、プログラムを実行するとこのようなアトリビュートが定義されます。
この中でもよく使われるnameについて詳しく説明します。

Pythonファイルのプログラムを実行したとき、このnameには「main」という文字列が代入されます。
一方、Pythonファイルがモジュールとして他のプログラムにインポートされた場合、このnameにはモジュール名が代入されます。
具体例で確認してみましょう。

def name_check():
    print("__name__ :", __name__)

name_check()

まず、rectangleモジュールと同じ階層にtest.pyという名前のファイルを作成します。
そして、name_checkという関数を定義します。
print関数の中に文字列でnameとコロンを書きます。
そしてカンマを書き、変数のnameを書きましょう。
これでname_checkという関数の定義は完成です。
そして、今定義したname_check関数を呼び出してみましょう。
実行します。

結果が表示されました。
変数nameは定義していませんが、エラーは発生していません。
Pythonファイルのプログラムを実行したとき、nameには自動的にmainという文字列が代入されていることがわかります。

import test

test.name_check()

もう一つ、rectangleモジュールと同じ階層に、新しくlesson.pyというファイルを作成します。
まず、先ほど作成したtest.pyをモジュールとしてインポートします。
そして、testモジュールで定義したname_check関数を呼び出してみましょう。
実行します。

結果が表示されました。
test.pyをモジュールとしてインポートすると、nameにはモジュール名であるtestが代入されていることがわかります。
ただし、同じ内容が2回表示されています。
なぜでしょうか?
import文でモジュールをインポートすることによって、モジュールを実行するのと同じ処理が実行されるんでしたね。
関数やクラスのみが書かれている場合は、その関数やクラスが定義されるだけなので問題ありません。
しかし、今回のように、関数を呼び出すような処理が書かれている場合は、その結果も表示されてしまいます。
従って、今回は1行目の「import test」が処理されたときに、testモジュールのname_check関数が実行され、結果が表示されます。
そして、3行目のtest.name_checkが処理されるときに、再び結果が表示されます。
そのため、同じ内容が2回表示されています。
このような意図していない結果にならないように、Pythonファイルが直接実行された場合と、モジュールとしてインポートされた場合で異なる処理になるように書く方法がよく使われます。
実際にコードを書いて確認してみましょう。

def name_check():
    print("__name__ :", __name__)

if __name__ == "__main__":
    name_check()

先ほど作成したtest.pyのファイルを書き換えます。
先ほどはname_check関数を定義した後、そのままname_check関数を呼び出していました。
今回はその前に1行、if文を付け加えましょう。
if、name、==(イコール2つ)、文字列でmain、コロンと書きます。
こうすると、もしnamemainだったらname_check関数を実行するようになります。
test.pyが直接実行された場合は、nameにはmainが代入されるので、name_check関数が呼び出されます。
一方、test.pyがモジュールとして他のプログラムにインポートされた場合は、nameにはモジュール名が代入されるので、name_check関数は呼び出されません。
まず、test.pyを直接実行してみましょう。
実行します。

直接実行した場合には、nameにはmainという文字列が代入されています。
従って、if文の条件を満たし、name_check関数が呼び出されています。

import test

test.name_check()

今度はlesson.pyに戻ります。
コードの中身は変わっていません。
結果を確認してみましょう。
実行します。

今度は結果が1行だけ表示されました。
今度は、testモジュールのnameにはモジュール名であるtestが代入されています。
従って、testモジュールのif文の条件を満たさないので、インポートしただけではname_check関数は実行されません。
testモジュールのname_check関数を呼び出した時だけ、関数が実行されています。
このようにコードを書く方法も覚えておきましょう。