モジュール

外部モジュールのimport

外部モジュールのimport

これまで既に何度か登場しましたが、外部モジュールを使用する際は、import文を使用します。例えば、標準ライブラリの数学モジュールを使用する場合、以下のようにmathをimportします。

import math
print(math.pi) # 3.141592653589793

mathモジュールの一部、例えばpiだけ使用したい場合は、from文と合わせて以下のように記述することもできます。また、この場合はmath.を書かずに使用することができます。

from math import pi
print(pi)

asによる別名

さらに、importしたモジュールが長い場合、asで別名を付けることができます。たとえば、numpyという数値計算モジュールでランダムな点を生成する場合、以下のように記述します。

import numpy
x = numpy.random.rand(50)
y = numpy.random.rand(50)

モジュールを利用するたびにnumpyと書かなければなりませんが、これにasで以下のように短い名前をつけることができます。

import numpy as np
x = np.random.rand(50)
y = np.random.rand(50)

モジュールと同名のクラス

さて、初学者が少し混乱するのがモジュール名と同じ名前のクラスがある場合です。たとえば、標準ライブラリのdatetimeモジュールにはdatetimeという型が存在します。利用する場合、以下のようにimportします。

import datetime
# datetimeモジュールのdatetimeをインポート

dt_obj = datetime.datetime(2017, 12, 22) # datetime型のオブジェクトを生成する

また、fromを使うと以下のように書き換えることができます。

from datetime import datetime
# datetimeモジュールのdatetimeをインポート

dt_obj = datetime(2017, 12, 22) # datetime型のオブジェクトを生成する

独自モジュールの作成

では次に独自にモジュールを作成してみましょう。拡張子がpyとなるpythonスクリプトを作成し、別のスクリプトから呼び出します。

単一モジュールのimport

まずはmod1.pyという名前の簡単なモジュールを作成します。

# mod1.py
def func1():
    print('func1')

同じディレクトリにrun.pyという実行スクリプトを作成します。

# run.py
import mod1
mod1.func1() # mod1.pyのfunc1関数が呼び出される。

パッケージ化

もう少しモジュールの数を増やしてそれらをまとめたパッケージを作ってみましょう。先ほど作ったrun.pyと同じディレクトリ内にmypkgというパッケージディレクトリを作成します。mypkgの中に、mod2.py、mod3.pyというモジュールを作成してみましょう。

# ./mypkg/mod2.py
def func2():
    print('func2')

# ./mypkg/mod3.py
class MyClass():
    def method3(self):
        print('method3')

さらに、パッケージには_init__.pyという空ファイルを配置します。これはディレクトリがパッケージであることを示す目印となります。

階層は以下のようになります。

$ tree
.
├── mod1.py
├── mypkg
│   ├── __init__.py
│   ├── mod2.py
│   └── mod3.py
└── run.py

最後にモジュール伸び出しのrun.pyを以下のように記述します。

import mod1
from mypkg import mod2, mod3  

mod1.func1()
mod2.func2()
mod3.MyClass().method3()

実行してみると、それぞれのモジュールを呼び出すことが確認できます。

__init__.pyの活用

さて、先ほど空のファイルだった__init__.pyですが、以下のように修正してみましょう。

# ./mypkg/__init__.py
from . import mod2
from . import mod3   

すると、run.py側では、以下のように呼び出すこともできます。

import mod1
import mypkg

mod1.func1()
mypkg.mod2.func2()
mypkg.mod3.MyClass().method3()

mypkgをimportすると、配下のものもimportされていることが確認できますね。