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.path
はimport文が実行された時、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などで後からダウンロードして使用するものを「外部ライブラリ」と呼んで区別しています。
まとめ
- Pythonは
import 〇〇
が実行されると、import文が記述されたファイルが置かれたフォルダや、登録されているフォルダの中から該当するライブラリを検索する
- 「モジュール」の実体は通常の.pyファイルであり、「パッケージ」の実体は複数のモジュールが集められたフォルダである。パッケージには__init.py__ファイルが必ず含まれる