Python ライブラリ importの基本

前回の記事ではPythonにおけるファイル入出力について学びました。この記事ではPythonで重要となるライブラリとは何かとそのimport方法、また自分で作成したモジュールのimport方法について学びます。

この記事を読むことであなたは
・ライブラリとは何か
・Pythonでライブラリのimport
・自分で作成したモジュールのimport
について理解することができます。

Pythonにおけるライブラリとは

 Pythonは数値計算ならNumpy、データ分析ならPandas、データの可視化ならmatplotlibといった具合に目的に応じて非常に多くのライブラリがあります。これがPythonを使う大きなメリットです。ライブラリには大きく3種類に分けられます。

  • Pythonの標準ライブラリ
  • サードパーティライブラリ
  • 自作モジュール(自分で作成したプログラム群)

標準ライブラリ

 標準ライブラリの場合、Pythonに標準実装されている為、インストール不要でimportしてすぐに使う事ができます。標準ライブラリでよく使うものとしてはsys, os, datetime, math, randomなどです。使い方についてはここでは紹介しませんが、他にどんなライブラリがあるかは公式のドキュメントを参照してください。

サードパーティライブラリ

 このサードパーティライブラリが圧倒的に使用頻度も多いです。 上に挙げたライブラリはどれも非常によく使うライブラリですので、簡単に紹介しておきます。

  • Numpy: 行列計算、乱数生成など数値計算をする上で最も重要なライブラリ
  • Matplotlib: データの可視化で最も代表的なライブラリ。グラフ描画の細かい設定も可能
  • Seaborn: データをより洗練された形で可視化できる。統計データのプロットに強い
  • Pandas: データ分析用のライブラリ。カテゴリごとの分析や、Excel, csvへのファイル入出力も可能
  • TensorFlow / PyTorch /Keras: 深層学習用のライブラリ。学習データの前処理から訓練まで充実
  • CuPy: Numpyとほぼ同じインターフェースでGPUの演算が可能なライブラリ

 これらのライブラリはインストールされていない場合、インストールの必要があります。インストール方法はpipもしくはAnacondaを使っている場合はcondaでインストールします。例えば、numpyをインストールする場合は、次のどちらかでインストールします。

# pipでインストールする場合
pip install numpy

# condaでインストールする場合
conda install numpy

 もしAnacondaを使っている場合は、まずAnacondaでインストールできるか調べてから、無い場合はpipを使うという順番でインストールしましょう。

自作モジュール

 自分で作成したPythonのプログラムを他のプログラムからimportして使うことも出来ます。例えば、次のような状況を考えてみます。

 このような場合、例えば、main.pyからutilsの下にあるmy_module1.pyやmy_module2.pyなどを使用するなどの可能性が考えられます。実際のimportする方法についてはこの後、取り扱います。

Pythonにおけるライブラリのimport

ライブラリのimport方法

 Pythonでライブラリをimportする方法は簡単です。次のプログラムを見てください。

# Pythonの標準ライブラリ
import math
import os

# Pythonのサードパーティ
import matplotlib.pyplot as plt
import numpy as np
from numpy import arange

if __name__ == "__main__":
    #プログラムの内容を記述
    arr = np.array([1, 2, 3])

 このプログラム中ではいくつかのライブラリをimportしています。import ライブラリ名でライブラリをimportできます。またnumpyとmatplotlibについてはasを使っています。

 通常、ライブラリの中にある関数にアクセスするにはライブラリ名.関数名でアクセスします。ここで仮に、numpyをimport numpyという風にas無しでimportした場合、numpy.arrayのように記述します。しかし、numpy as npという風にimportするとプログラムの中であるように、np.arrayで書けます。この為、プログラムを少し簡潔に書く事ができます。

 ちなみに、numpyやnpなどのライブラリ名を名前空間と言います。名前空間があるおかげで、たくさんのライブラリをimportしていてもその関数がどのライブラリから来ているのかという事が明確になります。

別のimportの方法としてfrom numpy import arangeというimportのやり方もあります。これはnumpyという非常に大きなライブラリからarangeという関数だけをimportするやり方です。こちらは、先の名前空間が分からなくなってしまう事もあり、あまり使うことはありませんが、知識として知っておきましょう。

最後に__name__ == “__main__”という見慣れない記述がありますが、こちらは後でもう一度取り上げます。

自作モジュールのimport

 次に自分で作成したプログラムを他のプログラムで使う例を考えます。ここでは便宜を考えて、もう一度次の図を再掲します。

このようにmain.pyと同じ階層にutilsというライブラリがあり、その下にmy_module1.pyとmy_module2.pyという2つのプログラムがあるケースを考えます。

 もう1つ, __init__.pyというファイルがありますが、これは中身は空のファイルです。__init__.pyはPythonのモジュールとして使うディレクトリに置いておくファイルです。おまじないだと思っておけばよいです。

 さて、my_module1.pyとmy_module2.pyのプログラムの中身は具体的に次の通りです。

print("... import my_module1.py")
print("my name :", __name__)
if __name__ == "__main__:
    print("... import my_module2.py")
    print("my name :", __name__)

そして、main.pyは次の通りです。

import utils.my_module1 as my1
import utils.my_module2 as my2

print(__name__)

 まずライブラリのimport方法ですが、import utils.my_module1のように.(ドット)でパスを繋いで記述します。このプログラムの実行結果を見てみましょう。

実行結果

... import my_module1.py
my name : utils.my_module1
__main__

 これを見ると分かりますが、実行していないはずのmy_module1.pyのプログラムが実行されています。これはimportするとそのプログラムの中身が実行されてしまう為です。しかし、my_module2.pyの中身は実行されていません。

 ここでif __name__ == “__main__”が登場します。__name__とは簡単に言えば、ライブラリの名前のことです。例えば、my_module1.pyの場合、__name__を出力すると、utils.my_module1という名前が出力されている事がわかります。そして、今実行しているプログラムの場合、この__name__が__main__という名前になります。

 つまり、プログラムでif __name__ == “__main__”:のブロックに実行内容を書いておけば、他のプログラムからimportされた場合にはプログラムの内容が実行されません。この為、my_module2.pyの中身は実行されなかったわけですね。

まとめ

 この記事ではPythonにおけるライブラリのimportについて学習しました。以下に内容を纏めておきましょう。

# 通常のimport
import math

# asを使ってimport
import numpy as np 

# 自作のプログラムのimport
import utils.my_module1

# おまじない
if __name__ == "__main__":
    # importしたライブラリにアクセするにはnp.xxのようにアクセス
    arr = np.array([1, 2, 3, 4])

Tips: 気をつけよう * import

  Pythonにはやってはいけないライブラリimportのやり方があります。次のプログラムを見てください。

from numpy import *

arr = array([1, 2, 3])
arr_sqrt = sqrt(arr)

 1行目のimport *ですが、*ワイルドカードで任意の文字列にマッチします。つまり、numpyにある全ての関数をimportしてくるということになります。このimport方法は知識として知っておくのは問題ありませんが、基本的に使用しません

 なぜかと言うと、複数のライブラリで同じ名前の関数が被ったときにどういう挙動になるか分かりにくい為です。例えば、mathライブラリとnumpyライブラリにはどちらもsqrtという関数があります。この為、次のプログラムはどうでしょう?

from numpy import *
from math import *

arr = sqrt(1.0) # どちらの関数が呼ばれる???

 math.sqrtのsqrt関数が呼ばれるのかnumpy.sqrtの関数が呼ばれるのか結果が判断しにくいですね。この為、from ライブラリ import *は基本的に使いません。

 ただし、例外的にプログラム中で1つのライブラリしか使用せず、その場限りの分析にしか使わないようなプログラムには使っても良いと思います。

The following two tabs change content below.
メーカーR&D職 研究開発業務にPythonを使用。 Udemy講師およびKindleで電子書籍を出版。 Udemyでは受講生 約15,000名 Pythonの適用範囲: データ分析、画像処理、統計解析、並列計算、流体解析、深層学習

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

ABOUT US

メーカーR&D職 研究開発業務にPythonを使用。 Udemy講師およびKindleで電子書籍を出版。 Udemyでは受講生 約15,000名 Pythonの適用範囲: データ分析、画像処理、統計解析、並列計算、流体解析、深層学習