モジュールとパッケージ

関数をいくつか定義して他から利用できるようにしたファイルをモジュールという。あるモジュールが上位モジュール(パッケージ)に含まれていることがあり、さらにパッケージ自体も上位パッケージがありえる。

  1. モジュール
  2. モジュールの関数呼び出し
  3. モジュールの自作
  4. モジュールとして認識できる場所
  5. パッケージ
  6. パッケージの自作

モジュール

関数をいくつか定義して他から利用できるようにしたファイルをモジュールという。Pythonに付属している標準ライブラリのモジュールはすぐに利用できる。その他、外部ライブラリを利用したり、モジュールの自作もできる。


モジュールの関数呼び出し

import文

モジュールの関数呼び出しは、まずファイルの冒頭などにおいてimport文でモジュール名を指定しておき、実際に呼び出すところではモジュール名.関数名()のようにする。

import モジュール名
モジュール名.関数名(引数)

例えば、標準ライブラリのmathモジュール(数学関連)のsqrt関数(平方根を求める)なら、

import math
print(math.sqrt(100)) # 10.0(100の平方根)

組み込み関数

組み込み関数builtinsモジュールに属しているが、これはimport文やモジュール名の付加を省略でき、単に関数名()とするだけで呼び出せる。


モジュールの自作

自作するモジュールのファイル拡張子は.pyにする。モジュールの利用側はimport文で拡張子を除いたファイル名を指定する。

例えば下記のようなモジュール(ファイル名「挨拶.py」)を作り、

# 挨拶.py
def hello():
  print('こんにちは')

それと同じディレクトリにプログラムを作って、

# プログラム.py
import 挨拶
挨拶.hello() # こんにちは

__pycache__

モジュールをimportして実際に実行すると、モジュールのあるディレクトリに__pycache__というディレクトリができる。この中にはモジュールをコンパイルしたファイルが読み込みを高速化するためにキャッシュされる。


モジュールとして認識できる場所

モジュールとして認識できる場所(モジュール検索パス)は、sys.pathという変数にリストされている。リストの先頭は「実行したプログラムファイルのあるディレクトリ」になる。

import sys
print(sys.path)

検索パス・リストの2番目に独自のパスを挿入したい場合は、シェル(Bash)の環境変数PYTHONPATH:区切りで定義する(そのシェルから実行した場合だけ有効)。

export PYTHONPATH=/path/to/ディレクトリ1:/path/to/ディレクトリ2

上記の他、sys.pathリストを直接変更でも。


パッケージ

あるモジュールが上位モジュール(パッケージ)に含まれていることがあり、さらにパッケージ自体も上位パッケージがありえる。このように階層構造になっているモジュールの場合、importと関数呼び出しは.で名前を区切って、

import 親パッケージ.子パッケージ.モジュール名
親パッケージ.子パッケージ.モジュール名.関数名(引数)

パッケージの自作

パッケージの階層構造を自作する最も単純なやり方は、ディレクトリの階層をそのまま利用する方法。上記のモジュール検索パスのディレクトリ配下に「親ディレクトリ/子ディレクトリ/モジュール.py」のように作れば、ディレクトリ名がパッケージ名となるので、下記のようにimport、実行できる。

import 親ディレクトリ.子ディレクトリ.モジュール名
親ディレクトリ.子ディレクトリ.モジュール名.関数名(引数)

__init__.pyが不要に

Python3.3からは、上のやり方は名前空間パッケージとして認識されるようになり、それまでパッケージのディレクトリに置く必要があった__init__.pyというファイルが不要になった(PEP 420)。

例えば、下記プログラムと同じディレクトリにpackage1/という空のディレクトリを作っただけでも、

import package1
print(package1) # <module 'package1' (namespace)>

ちゃんと認識されるので、その配下に子パッケージやモジュールを作ればよい。