Python のモジュールを作る

2016年8月20日

はじめに

Python のモジュールを作る方法について。

環境

  • Windows 7 64 bit
  • MSYS2 64 bit (MinGW w64)
  • Anaconda3 4.1.11

Python におけるモジュールのインポート

Python によるモジュールのインポートをは次のようにする。

import pkg

モジュール pkg に属する関数 f() を呼ぶには次のようにする。

pkg.f()

モジュールを参照する名前を変えることができる。

import pkg as p
p.f()

モジュールに属する関数やクラスを直接インポートすることもできる。

from pkg import f
f()

モジュールに属するすべてのものをインポートすることもできる。

from pkg import *

ただし、モジュールはライブラリとしてだけでなく、名前空間としての役割もあるため、上のようなやりかたは推奨されていない。名前が被ったときは、後で読み込んだものに置き換えられる。モジュール名を省きたいときは、極力個別にインポートする。

モジュールのインポートは一度しか行われない。リロードしたければ、reload() 関数を用いる。

reload(pkg)

ただし、更新がなければリロードしてもインポートされない。

モジュールの場所

モジュールは、sys.path に含まれるパスから検索される。sys.path には、実行したスクリプトのあるディレクトリが含まれる。環境変数 PYTHONPATH でパスを追加することができる。Python のインストールディレクトリの lib/site-packages に "*.pth" という名前でパスのリストを含むファイルを置いておくことでもパスを追加できる。

モジュールの作りかた

ファイルとして作る

もっとも単純な方法は、"モジュール.py" というファイルを作ることである。たとえば、次のようなファイルを作る。

pkg.py

def f():
    print('pkg.f()')

pkg.py のあるディレクトリで Python を起動し、以下のように実行できる。

>>> import pkg
>>> pkg.f()
pkg.f()

ディレクトリ階層で作る

モジュールをディレクトリ階層で作ることもできる。たとえば、以下のようなディレクトリ階層を作る。

pkg/
 |- __init__.py
 |- sub_pkg/
     |- __init__.py

pkg ディレクトリの中にさらに sub_pkg というディレクトリを作成し、それぞれのディレクトリに "__init__.py" というファイルを置いている。"__init__.py" のあるディレクトリはモジュールとして認識される。厳密には、モジュールをディレクトリでひとまとめにしたもの (ここでは "pkg") をパッケージ、その中にあるモジュール (ここでは "sub_pkg") をパッケージのサブモジュールというらしい。

モジュールに関数などを追加するには、__init__.py で定義するか、別にファイルを作ってそれをインポートすればよい。たとえば、pkg の中に pkg_1.py というファイルを作り、関数 f() を定義したとする。その場合は、pkg の __init__.py を次のようにする。

from .pkg_1 import f

こうすれば、pkg をインポートすれば、関数 f() を pkg.f() として参照できる。ただし、pkg.pkg_1 も見えるようになるので、関数 f() は pkg.f() および pkg.pkg_1.f() として見えることになる。

これが気持ち悪ければ、"pkg_1" の代りに "_pkg_1" などと頭にアンダースコアを付ける。それでも pkg._pkg_1.f() などが見えることには変わりはないが、気分的にアクセスしにくくなる。また、"from pkg import *" としたとき、"pkg_1" などはインポートされるが、"_pkg_1" などはインポートされない。

参考