[Python]モジュール/パッケージ/ライブラリの意味とその実体

Pythonのimport文をよりよく知るためには「モジュール」や「パッケージ」といった用語の理解が必要になります。そこで今回は、Pythonにおける「モジュール/パッケージ/ライブラリとは何か」ということと、それがどこに存在しているのかをお話したいと思います。

モジュール

モジュールとは何か

まずモジュールとは一体何でしょうか。例を挙げて見ていきましょう。

import datetime
print(datetime.datetime.now())     #2020-02-15 12:34:04.103869
print(datetime.date.today())     #2020-02-15

Pythonで日付や時刻を扱う代表的なモジュールに「datetime」があります。しかしこのdatetimeは一体「どこから」「どのようなもの」がインポートされているのでしょうか?

モジュールのパスを確認する

このdatetimeがどこにあるか確認してみましょう。sysという別のモジュールを使って、モジュールがどこにあるのかを調べることができます。

import sys
for i in sys.path:
    print(i)
#Windows10
d:\Documents\python
C:\Users\ユーザー名\AppData\Local\Programs\Python\Python38\python38.zip
C:\Users\ユーザー名\AppData\Local\Programs\Python\Python38\DLLs      
C:\Users\ユーザー名\AppData\Local\Programs\Python\Python38\lib       
C:\Users\ユーザー名\AppData\Local\Programs\Python\Python38
C:\Users\ユーザー名\AppData\Roaming\Python\Python38\site-packages    
C:\Users\ユーザー名\AppData\Local\Programs\Python\Python38\lib\site-packages
#Windows10 WSL(Ubuntu) pyenv使用時
/mnt/d/Documents/python
/home/ユーザー名/.pyenv/versions/3.8.1/lib/python38.zip
/home/ユーザー名/.pyenv/versions/3.8.1/lib/python3.8
/home/ユーザー名/.pyenv/versions/3.8.1/lib/python3.8/lib-dynload  
/home/ユーザー名/.pyenv/versions/3.8.1/lib/python3.8/site-packages

sys.pathimport文が実行された時、Pythonがモジュールを検索するディレクトリのリストです。今回はそのリストをfor文で回し、一覧表示させています。
出てくるパスは環境によって大きな違いがありますが、共通しているのは

  • 実行したファイルが置かれているディレクトリ
  • Python標準で用意されたモジュール用のディレクトリ
  • pipやサードパーティモジュールのためのディレクトリ(site-packages)

が含まれているということです。

それぞれ探ってみましょう。Windowsの場合はここにdatetimeが存在します。(ユーザー名はご自身のものに変更してください)

C:\Users\ユーザー名\AppData\Local\Programs\Python\Python38\lib

Ubuntuの場合はここ。

/home/ユーザー名/.pyenv/versions/3.8.1/lib/python3.8

モジュールの正体はpyファイル

もうお気付きの方も多いかもしれませんが、モジュールの正体は僕たちが普段書いているのと同じ.pyファイルです。この.pyファイルの中にdatetimeクラスやtimeクラスが定義され、さらにその中にメソッドやプロパティが定義されています。

datetimeやpprint、正規表現で使用するreモジュールなどは全て同じフォルダで見つけることができます。

パッケージ

パッケージとは何か

パッケージはモジュールをまとめて1つのフォルダに収めたものです。例えば.jsonという種類のファイルを扱うパッケージ「json」を見てみましょう。

先ほどのdatetime.pyと同じフォルダにjsonフォルダも存在します。

フォルダを開いてみると、

jsonフォルダの中にも.pyファイルが並んでいます(pycacheフォルダはキャッシュに使用されるフォルダなので、気にしないでOKです)。「パッケージは複数のモジュールをまとめたもの」であるということが、これで分かるかと思います。

しかしこの中で、「init.py」だけは特別な存在です。

このファイルはimport文が実行された時、自動的に実行されるファイルであり、「パッケージ」には必須のファイルになっています。なお、ファイルの中身は空っぽでもかまいません。

補足: ライブラリについて

ライブラリとはこれまでの「モジュール」と「パッケージ」をまとめたザックリした用語です。

datetimeやreはモジュール、jsonはパッケージですが、どちらも同じ「importして使用するデータ型や関数」です。

これらをひとまとめにして、Pythonに最初から備わっているものを「標準ライブラリ」、pipなどで後からダウンロードして使用するものを「外部ライブラリ」と呼んで区別しています。

まとめ

  1. Pythonはimport 〇〇が実行されると、import文が記述されたファイルが置かれたフォルダや、登録されているフォルダの中から該当するライブラリを検索する

  1. 「モジュール」の実体は通常の.pyファイルであり、「パッケージ」の実体は複数のモジュールが集められたフォルダである。パッケージには__init.py__ファイルが必ず含まれる

タイトルとURLをコピーしました