Python では、モジュールは Python の文と定義で自己完結したファイルです。例えば、file.py
はfile
という名前のモジュールと考えることができます。これはパッケージとは異なり、パッケージはディレクトリ内にあるモジュールのコレクションで、モジュールに構造と階層を与えます。
モジュールは、大きなプログラムを、より管理しやすい小さなファイルに分解するのに役立ちます。モジュールを使えば、コードの再利用が現実のものとなる。例えば、異なるプログラムで頻繁に使用される関数があるとします。この関数をモジュールで定義しておけば、その都度コードをコピーすることなく、様々なプログラムでインポートすることができます。
この記事では、Pythonモジュールの作成方法と、Pythonコードでの使用方法について説明します。
ライティングモジュール
モジュールは、拡張子が .py
の単純な Python ファイルです。ファイル名がモジュール名となります。このファイルの中に、クラス、変数、関数の定義と実装を書くことができます。これらは他のPythonプログラムで使用することができます。
まず、”Hello World “を表示する関数を作ってみましょう。これを行うには、新しいPythonファイルを作成し、hello.py
という名前で保存します。そのファイルに次のコードを追加します。
def my_function():
print("Hello World")
上記のコードを実行すると、何も返されません。これは、このプログラムが何もするように言っていないからです。確かにコードの中に my_function()
という名前の関数を作りましたが、その関数を呼び出したり、呼び出されたりはしていません。この関数が呼び出されると、”Hello World” というテキストが表示されるはずです。
次に、上記のファイルを保存したディレクトリに移動し、main.py
という名前のファイルを新規に作成します。このファイルに以下のコードを追加してください。
import hello
hello.my_function()
出力
Hello World
この関数は正常に起動されました。まず、モジュールをインポートするところから始めました。ファイル名は hello.py
で、インポートされたモジュールの名前は hello
です。
また、関数を呼び出すために使用した構文に注目してください。これは「ドット記法」と呼ばれるもので、最初にモジュール名を指定し、次に関数名を指定することで、関数を呼び出すことができるようになっています。
しかし、これはモジュールをインポートして関数を呼び出す方法のひとつに過ぎない。次のようにすることもできた。
from hello import my_function
my_function()
出力
Hello World
上記の例では、最初の行は hello
という名前のモジュールから my_function
という名前の関数をインポートするように Python インタープリタに命じています。このような場合、関数にアクセスするためにドット記法を使う必要はなく、直接呼び出せばよいのです。
しかし、hello
モジュールが複数の関数を持っている場合、from hello import my_function
と記述しても、 hello
のすべての関数はインポートされず、 my_function
だけしかインポートされません。もし、他の関数にアクセスしようとすると、エラーが発生します。モジュール全体をインポートするか、個々の関数をインポートしないと使えません。
モジュール内で変数を定義して、それを他のモジュールから利用することができます。例として、hello.py
を開き、以下のコードを追加してください。
def my_function():
print("Hello World")
# The variable that'll be used in other modules
name = "Nicholas"
次に、main.py
ファイルを開き、以下のように修正します。
import hello
hello.my_function()
print(hello.name)
出力
出力
my_function()`関数だけでなく、モジュール全体をインポートしたので、モジュール内で定義された関数と変数の両方を呼び出すことに成功しました。
先ほど、モジュールの中でクラスを定義することができると述べました。次の例では、これをどのように行うか見てみましょう。hello.py` ファイルを開き、以下のように修正します。
Hello World
Nicholas
ここでは、Student
という名前のクラスを定義しています。このクラスでは、name
と course
という 2 つの変数が定義されています。メソッド get_student_details()
もこの中で定義されており、学生の詳細をコンソールに出力します。
次に、ファイル main.py
を開き、以下のように修正します。
def my_function():
print("Hello World")
# Defining our variable
name = "Nicholas"
# Defining a class
class Student:
def __init__(self, name, course):
self.course = course
self.name = name
def get_student_details(self):
print("Your name is " + self.name + ".")
print("You are studying " + self.course)
出力
import hello
hello.my_function()
print(hello.name)
nicholas = hello.Student("Nicholas", "Computer Science")
nicholas.get_student_details()
上記のスクリプトでは、再びドット記法を用いて hello
モジュールから student
クラスのオブジェクトを生成しています。次に、 get_student_details()
関数を使用して、学生の詳細を取得しました。
モジュールのほとんどはクラスの定義で構成されていますが(ほとんどの場合)、インポートしたときに実際に独自のコードを実行することも可能です。ここでは、関数 my_function()
の定義と、その関数の呼び出しについて説明します。
Hello World
Nicholas
Your name is Nicholas.
You are studying Computer Science
次に、main.py
ファイルを開いて、以下の行を除いてすべて削除してください。
def my_function():
print("Hello World")
my_function()
出力
出力
上記の出力は、モジュールの中で関数を定義し、呼び出したことを示しています。モジュールがインポートされると、関数を呼び出すことなく、関数から直接結果を返します。この動作は常に望ましいわけではありませんが、モジュールがインポートされたときにキャッシュからデータをプリロードするような、特定のユースケースには便利です。
全てのモジュールオブジェクトをインポートする
あるモジュールに含まれるすべてのオブジェクト (関数、変数、クラスなど) をインポートするには、 import *
ステートメントを使用することができます。例えば、hello
モジュールに含まれるすべてのオブジェクトをインポートするには、以下のように記述します。
import hello
上記の記述をプログラムに追加すると、hello
モジュールに含まれるすべての関数、変数、クラスを hello
という接頭辞を付けずに使用できるようになります。
別のパスからモジュールにアクセスする
Pythonでは、モジュールは複数のプロジェクトで使用されます。したがって、モジュールをあるプロジェクトのディレクトリに置いておくと、他のプロジェクトがそれを簡単に使えなくなるので、意味がありません。
プログラムと同じディレクトリにないモジュールにアクセスする必要がある場合、いくつかのオプションがあります。次のセクションで、これらについて説明します。
パスの追加
別のパスからモジュールをインポートするには、まず sys
モジュールをインポートし、さらにプログラムで使用したい他の Python モジュールもインポートする必要があります。
sysモジュールは Python 標準ライブラリによって提供され、システム固有の関数やパラメータを提供します。sys
モジュールの path.append()
関数を使用すると、現在のプロジェクトにモジュールのパスを追加することができます。
このことを示すために、main.py
のファイルがあるディレクトリから hello.py
ファイルを切り取ります。それを別のディレクトリに貼り付けます。私の場合、”F: Python” というディレクトリに貼り付けました。
次に、main.py
を開き、sys
モジュールをインポートして、Python インタープリターがファイルを探すパスを指定します。以下はその例です。
Hello World
出力
from hello import *
上記のスクリプトでは、 sys.path.append('F:/Python/')
という行が、モジュールをインポートする際に検索するパスのリストにこのパスを含めるように Python インタープリタに指示しています。
Pythonのパスへのモジュールの追加
上記の方法は sys
モジュールをインポートしている場合のみ動作します。もし、sys
モジュールをインポートせず、モジュールのパスを指定した場合は、エラーが発生します。システム全体からモジュールを利用できるようにするには、Python が通常モジュールやパッケージをチェックするパスにモジュールを追加すればよい。この方法では、前のセクションで行ったように sys
モジュールをインポートしてモジュールへのパスを指定する必要がなくなります。
他のことをする前に、まずPythonがモジュールとパッケージを検索するパスを特定する必要があります。お使いのオペレーティングシステムのコマンドラインを開き、python
コマンドを実行するだけです。そうすると、Pythonのターミナルが表示されます。
以下のように sys
モジュールをインポートしてください。
import sys
sys.path.append('F:/Python/')
import hello
次に、以下のコマンドを実行すると、パスが出力されます。
Hello World
出力には少なくとも1つのシステムパスが含まれます。プログラミング環境から実行した場合は、いくつかのパスが出力されます。私の場合、以下のようになりました。
import sys
あなたの目標は、現在使用している環境のものを見つけることです。以下のようなものを探すとよいでしょう。
print(sys.path)
あなたの hello.py
ファイルをそのパスに移動します。その後、以下のように、通常の方法で任意のディレクトリから hello
モジュールをインポートできるようになります。
$ python
Python 2.7.10 (default, Oct 23 2015, 19:19:21)
[GCC 4.2.1 Compatible Apple LLVM 7.0.0 (clang-700.0.59.5)] on darwin
Type "help", "copyright", "credits" or "license" for more information.
>>> import sys
>>> print(sys.path)
['', '/Library/Python/2.7/site-packages/six-1.10.0-py2.7.egg', '/Library/Python/2.7/site-packages/cffi-1.2.1-py2.7-macosx-10.9-intel.egg', '/Library/Python/2.7/site-packages/pycparser-2.14-py2.7.egg', '/Library/Python/2.7/site-packages/virtualenv-13.1.2-py2.7.egg', '/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python27.zip', '/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7', '/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/plat-darwin', '/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/plat-mac', '/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/plat-mac/lib-scriptpackages', '/System/Library/Frameworks/Python.framework/Versions/2.7/Extras/lib/python', '/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/lib-tk', '/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/lib-old', '/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/lib-dynload', '/Library/Python/2.7/site-packages']
>>>
出力
/Library/Python/2.7/site-packages
結論
これでこの記事は終わりです。モジュールとは、変数や関数を定義したPythonのファイルです。モジュールに関数を定義しておけば、プログラムごとに関数を定義する必要がなく、別のプログラムから呼び出すことができるため、コードの再利用が容易になります。モジュールは主に関数やクラスの定義に使われますが、変数やクラスのインスタンスをエクスポートすることもできます。