Pythonの「import」は、さまざまな機能を搭載したモジュールやパッケージを利用し、より便利なプログラミングを行うための構文です。
一見するとごく単純な機能のように思えますが、実は奥が深いものです。さらには使い方に注意が必要な機能もあります。とくに、自身でモジュールやパッケージを作成する場合は、importの使い方をより深く理解しておくことが重要です。
そこで本記事では、Pythonのimportの基本的な使い方に加えて、実践的なテクニックについても解説します。importについてわからないことがある人は、ぜひ参考にしてみてください。
なお、本記事のソースコードの実行時に「SyntaxError」というエラーが出るときは、「# coding: UTF-8」の部分を「# coding: Shift_JIS」に書き換えてください。
目次
Pythonの「import」とは、モジュールやパッケージに搭載されている機能を利用するための構文です。
Pythonでは、「print()」や「open()」など、基本的な関数(メソッド)はそのまま使えます。しかし、「sin()」や「cos()」のような数学関連の関数などは、単に呼び出すだけでは使えません。これらのメソッドは、外部のモジュールやパッケージで中身が定義されているからです。
このような、外部ファイルにある機能を利用するために必要なのがimport構文です。import構文を使用することで、モジュールやライブラリを取り込み、プログラム中で利用できるようになります。いわば「Pythonの機能を拡張するための機能」だと考えると、わかりやすくなるでしょう。
importで重要なのが、「モジュール」「パッケージ」「ライブラリ」の違いです。
「モジュール」は、ソースコードを記述する「pyファイル」のことで、クラスや関数のまとまりのようなものです。そのモジュールを複数まとめたフォルダを「パッケージ」と呼びます。Pythonでは、「ライブラリ」という用語の厳密な定義はありませんが、基本的にライブラリはパッケージのことを指すことが多いです。
たとえば、科学技術計算や機械学習などで活用される「numpy」は、パッケージ形式で配布されています。こうした形式の違いで、インポートの方法が異なる部分もあるので注意が必要です。
Pythonのパッケージをimportすることで、パッケージに搭載されている機能が使えるようになります。しかし、importの方法には以下の4種類があり、それぞれ構文や効果が異なるので注意が必要です。
Pythonでモジュールをimportするときは、以下の構文のように「import」のあとに、ファイルの拡張子を除いたモジュール名を指定します。
「sys」は、Pythonのシステム関連の処理をまとめたモジュールです。実際に、sysモジュールをインポートして、Pythonのバージョン情報を表示してみましょう。
//サンプルプログラム
# coding: UTF-8
# 「sysモジュール」をインポートする
import sys
# Pythonのバージョン情報を表示する
print(sys.version)
//実行結果
なお、インポートしたオブジェクトを使用するときは、クラスやメソッド名の前に「モジュール名.」を追加する必要があります。モジュール名を指定しなければ、エラーが出るので注意が必要です。
複数のモジュールを同時にimportしたい場合は、以下のように「,」で区切って並べることで、ソースコードを簡潔に記載できます。
この機能を利用して、「sys」に加えて「randomモジュール」もimportしてみましょう。randomは、さまざまな種類の乱数を発生させるためのモジュールです。
//サンプルプログラム
# coding: UTF-8
# 「sysモジュール」と「randomモジュール」をインポートする
import sys, random
# Pythonのバージョン情報を表示する
print(sys.version)
# ランダムな整数値を0~255の範囲で表示する
print(random.randint(0, 256))
//実行結果
ただし、このように「,」で区切って並べる書き方は、可読性の低下やミスの原因になるため推奨されていません。そのため、基本的には以下のように、1つずつimportするほうが無難です。
モジュール全体ではなく、特定のオブジェクトやメソッドだけをimportすることもできます。その場合は、以下の構文で記載しましょう。
このように記載すると、指定したオブジェクトだけimportできるので、容量節約や実行速度につながるケースがあります。また、通常のインポート時は「モジュール名.オブジェクト名」で呼び出す必要がありますが、fromを使用した場合はオブジェクト名のみで大丈夫です。むしろ、モジュール名を記載するとエラーになるので注意しなければいけません。詳細は以下のサンプルコードのとおりです。
//サンプルプログラム
# coding: UTF-8
# mathモジュールの「e」をインポートする
from math import e
# 自然対数値を表示する
print(e)
# mathモジュールのその他のメソッドやオブジェクトは使えない
print(math.sin(1))
//実行結果
このように、「from math import e」の場合は単に「e」と記載するだけで、mathモジュールにある自然対数値が使えます。ただし、その他の部分はインポートされていないので、「math.sin()メソッド」などは使えません。
モジュールをimportするときは、以下のように「as」を使うと、別名を付けたうえでオブジェクトにアクセスできます。
通常の「import」と「from」を使う場合のどちらも、上記の「as」構文が使えます。詳細は以下のサンプルコードのとおりです。
//サンプルプログラム
# coding: UTF-8
# mathモジュールを「m」という別名でインポートする
import math as m
# 「math.sqrt(2)」を「m.sqrt(2)」と記載できる
print(m.sqrt(2))
# mathを「m」という名称でインポートしているため、「math.sqrt(2)」と記載するとエラーになる
print(math.sqrt(2))
//実行結果
上記の例では、mathモジュールを「m」という別名でインポートしています。元の名前の「math」を使うと、エラーが出るので注意が必要です。
numpyなどのパッケージを使用するとき、asがよく使われることがあります。ただし、モジュールやオブジェクトの別名が、変数名などと衝突するとエラーが出ます。そのため、よほど名前が長いものをインポートするとき以外は、asを使う必要性は低いでしょう。
パッケージの作成とインポート方法について、以下の4つのポイントに分けて解説します。
Pythonのパッケージ(ライブラリ)は、自分で自由に作れます。まずはPythonのプロジェクトフォルダ、つまり実行するメインモジュールがある場所に、以下のように「Package」というフォルダを作りましょう。前述したように、パッケージは複数のモジュールをまとめたフォルダです。
次に、テキストエディタ(メモ帳など)を開いて、「__init__.py」「ModuleA.py」「ModuleB.py」という3つのファイルを、「UTF-8エンコード」で作成・保存します。
続いて、各ファイルの内容を以下のように編集しましょう。
//__init__.py
from Package import ModuleA
from Package import ModuleB
//ModuleA.py
# coding: UTF-8
def funcA():
print(“ModuleAのfuncA()です!”)
//ModuleB.py
# coding: UTF-8
def funcB():
print(“ModuleBのfuncB()です!”)
そのうえで、PythonのIDEを開いて以下のソースコードを実行すると、パッケージ内に存在する各モジュールのメソッドを呼び出せます。
//サンプルプログラム
# coding: UTF-8
# 「Package」パッケージをインポートする
import Package
# ModuleAのfuncA()を呼び出す
Package.ModuleA.funcA()
# ModuleBのfuncB()を呼び出す
Package.ModuleB.funcB()
//実行結果
モジュールの場合と同じように、「import パッケージ名」と記載すると、パッケージをimportできます。パッケージ内のクラスやメソッドにアクセスしたい場合は、以下のような構文で記載する必要があります。
ただし、このように使えるようにするためには、「__init__.py」というファイルを正確に記載する必要があります。
先ほどのサンプルコードは、「__init__.py」ファイルが無ければ機能しません。なぜなら、このファイルがモジュールの構成を示すからです。「__init__.py」ファイルがなくてもプログラムは動作しますが、その場合は以下のソースコードのように、1つずつモジュールをimportする必要があります。
//サンプルプログラム
# coding: UTF-8
# Packageの「ModuleAモジュール」をインポートする
from Package import ModuleA
# Packageの「ModuleBモジュール」をインポートする
from Package import ModuleB
# ModuleAのfuncA()を呼び出す
ModuleA.funcA()
# ModuleBのfuncB()を呼び出す
ModuleB.funcB()
//実行結果
上記のプログラムのimport文は、先ほどの「__init__.py」ファイルの中身と同じです。これは、「Package」パッケージにある「ModuleA」と「ModuleB」をimportすることを指します。つまり、「__init__.py」ファイルでは、あらかじめ各モジュールのimport文を記載しておくということです。
前述した方法では、各モジュールのメソッドを呼び出すときに、パッケージ名を指定しないといけません。パッケージ名を省略したい場合は、import文を以下のように変更しましょう。
この構文を「ワイルドカードimport」と呼びます。ワイルドカードimportを活用すると、次のサンプルコードのように、モジュール名を直接指定できるようになるので便利です。ワイルドカードimportの使い方は以下のとおりです。ソースコード以外のファイルは、先ほどと同じ内容で実行してください。
//サンプルプログラム
# coding: UTF-8
# 「Package」パッケージをインポートする
from Package import *
# ModuleAのfuncA()を呼び出す
ModuleA.funcA()
# ModuleBのfuncB()を呼び出す
ModuleB.funcB()
//実行結果
「__init__.py」ファイルより深い階層にあるモジュールをパッケージに含めるときは、以下のように「.」でフォルダ名を指定する必要があります。
深い階層のパッケージを利用する例を紹介します。まず、先ほど作成した「Packageフォルダ」に、「Moduleフォルダ」を追加しましょう。
そのうえで、Moduleフォルダ内部で「ModuleC.py」をUTF-8エンコードで作成します。「__init__.py」と「ModuleC.py」の2つのファイルを以下のように編集し、ソースコードを実行しましょう。
//__init__.py from Package import ModuleA from Package import ModuleB from Package.Module import ModuleC //ModuleC.py # coding: UTF-8 def funcC(): print("ModuleCのfuncC()です!") //サンプルプログラム # coding: UTF-8 # 「Package」パッケージをインポートする from Package import * # ModuleAのfuncA()を呼び出す ModuleA.funcA() # ModuleBのfuncB()を呼び出す ModuleB.funcB() # ModuleCのfuncC()を呼び出す ModuleC.funcC()
//実行結果
Pythonでモジュールやパッケージをimportするときは、以下の3種類のエラーが発生する可能性があります。各エラーの意味や対処法を確認しておきましょう。
「ModuleNotFoundError」は、パッケージやモジュールが見つからないことを意味するエラーです。存在しないものを指定した際はもちろん、スペルミスや大文字小文字の間違いでもエラーが出ます。詳細は以下のサンプルコードのとおりです。
//サンプルプログラム
# coding: UTF-8
# 「numpy」モジュールをインポートする
import numpi # スペルミスで「numpi」になっている!
//実行結果
なお、パッケージやモジュールの名称は、大文字と小文字が区別されます。たとえば、「Package」を「package」のように書くと、エラーが出るので注意が必要です。
モジュールやパッケージを正しくimportできても、肝心の呼び出し時にモジュールやパッケージの名称を間違えると「NameError」が出ます。前述したように、大文字と小文字は区別されるので注意が必要です。詳細を以下のサンプルコードで確認しましょう。
//サンプルプログラム
# coding: UTF-8
# 「random」モジュールをインポートする
import random
# random.random()を呼び出す
randum.random() # スペルミスで「randum」になっている!
//実行結果
モジュール名・パッケージ名にあるメソッドやクラスを呼び出すときに、スペルミスをすると「AttributeError」が出ます。詳細は以下のサンプルコードのとおりです。
//サンプルプログラム
# coding: UTF-8
# 「random」モジュールをインポートする
import random
# ランダムな浮動小数点値を表示する
print(random.randum()) # スペルミスで「randum」になっている!
//実行結果
また、モジュールやパッケージの名称と、変数名が重複しているときもAttributeErrorになります。「as」で別名を付けているときは、AttributeErrorがとくに発生しやすいので注意が必要です。
Pythonの「相対import」とは、同じパッケージにあるモジュールをインポートすることを指します。「相対パスを使ったimport」という意味ではないので注意が必要です。一方で、これまで紹介したimportの方法は「絶対import」と呼びます。
相対importは、「モジュールから他モジュールをインポート」したいときに便利です。ここからは、同じパッケージ内のモジュールを「相対import」する方法について、以下の4つの
まずは、メインモジュール(Pythonで実行するモジュール)と同じディレクトリに、「Package」という名前でパッケージ(フォルダ)を作成してください。そのうえで、「ModuleA.py」と「ModuleB.py」の2つのモジュールを追加しましょう。中身は以下のとおりです。
//ModuleA.py # coding: UTF-8 # 同じディレクトリの「ModuleB」モジュールを相対importする from . import ModuleB # 「from . import モジュール名」で相対import可能 def funcA(): print("「ModuleA」の「funcA()」です!") # ModuleBモジュールのfuncB()を呼び出す ModuleB.funcB() //ModuleB.py # coding: UTF-8 def funcB(): print("「ModuleB」の「funcB()」です!")
「ModuleA.py」の「from . import」という部分が、相対importの構文です。「.」をひとつ記載することで、「同階層のモジュール」を示します。この点を踏まえて、メインモジュールに以下のようなソースコードを記載して実行しましょう。
//サンプルプログラム
# coding: UTF-8
# 「Module.ModuleA」パッケージをインポートする
import Module.ModuleA
# Module.ModuleAのfuncA()を呼び出す
Module.ModuleA.funcA()
//実行結果
このように、パッケージ内のモジュールから、同じパッケージに属する他モジュールをimportする構文が「相対import」です。
同じ階層の場合は「.」のみでしたが、下層のフォルダにあるモジュールを相対impotする場合は、「.フォルダ名」と記載します。まずは、先ほど作った「Moduleフォルダ」内部に「Innerフォルダ」を作り、この中に「ModuleB.py」を移動させましょう。そのうえで、「ModuleA.py」を以下のように変更して、先ほどと同じメインモジュールを実行してください。
//ModuleA.py # coding: UTF-8 # 下位ディレクトリの「ModuleB」モジュールを相対importする from .Inner import ModuleB # 「from .フォルダ名 import モジュール名」で相対import可能 def funcA(): print("「ModuleA」の「funcA()」です!") # ModuleBモジュールのfuncB()を呼び出す ModuleB.funcB()
//実行結果
上位階層にあるモジュールを相対importしたい場合は、「..」とドットを2つ並べましょう。サンプルコードを実行するために、まず「ModuleA.py」を「Innerフォルダ」に移動し、「ModuleB.py」は「Moduleフォルダ」に移してください。そのうえで、「ModuleA.py」を以下のように書き換えてから、サンプルコードを実行してみましょう。
//ModuleA.py # coding: UTF-8 # 上位ディレクトリの「ModuleB」モジュールを相対importする from .. import ModuleB # 「from .. import モジュール名」で相対import可能 def funcA(): print("「ModuleA」の「funcA()」です!") # ModuleBモジュールのfuncB()を呼び出す ModuleB.funcB() //サンプルプログラム # coding: UTF-8 # 「Module.Inner.ModuleA」パッケージをインポートする import Module.Inner.ModuleA # Module.Inner.ModuleAのfuncA()を呼び出す Module.Inner.ModuleA.funcA()
//実行結果
深い階層にある「ModuleA」をimportするために、メインモジュールのimport文が「import Module.Inner.ModuleA」となっています。ModuleA.pyでは、上位階層のModuleB.pyをimportするために、「from .. import ModuleB」と記載していることがポイント。なお、「ModuleB.py」が上位階層のフォルダに入っている場合は、「ModuleA」のimport文を「from ..フォルダ名 import」とすればOKです。
パッケージ自体より上位階層にあるモジュールは、相対importができません。たとえば、「ModuleB.py」が「Moduleフォルダ」の上位、つまりメインモジュールと同じ階層にある場合は、「ModuleB.py」を相対importできません。実際に、以下のサンプルコードを試してみましょう。
//ModuleA.py # coding: UTF-8 # 上位ディレクトリの「ModuleB」モジュールを相対importする from .. import ModuleB # 「from .. import モジュール名」で相対import可能 def funcA(): print("「ModuleA」の「funcA()」です!") # ModuleBモジュールのfuncB()を呼び出す ModuleB.funcB() //サンプルプログラム # coding: UTF-8 # 「Module.ModuleA」パッケージをインポートする import Module.ModuleA # Module.ModuleAのfuncA()を呼び出す Module.ModuleA.funcA()
//実行結果
このように、「ValueError: attempted relative import beyond top-level package」というエラーが出ます。「トップレベルのパッケージ以上の階層への相対importを試みた」という意味です。
つまり、パッケージの一部ではないメインモジュールでは、相対importは使えないということです。そのため、メインモジュールはパッケージ群よりも上位の階層に置くようにしましょう。
また、相対importは必ずパッケージ内部のモジュールに対して行わないといけません。そのため、メインモジュール内で相対importの構文を使うことはできません。相対importは、あくまでパッケージ限定の機能です。
Pythonの代表的なモジュールには、以下のようなものがあります。
モジュール名 | 分野 | 概要 |
---|---|---|
re | 文字列操作 | 正規表現操作 |
math | 数学関連 | 数学関数 |
random | 数学関連 | 擬似乱数の生成 |
copy | データ | 浅いコピーと深いコピーの操作 |
csv | ファイル | CSVファイルの読み書き |
os | OS | ファイルやディレクトリなどの操作 |
os.path | OS | ファイルやディレクトリなどのパスの操作が可能。上記の「osモジュール」内部に存在する |
tkinter | GUI | Tcl/Tk の Python インターフェイス |
sys | ランタイム | システムパラメータと関数 |
これらのモジュールをソースコード内で利用するときは、前述したように「import モジュール名」の構文でインポートしましょう。
Pythonのimportは、モジュールやパッケージの機能を利用するときに必要です。import文は、インポートする対象や目的によって、構文が異なります。
自身でパッケージを作成する場合は、フォルダの階層構造・「__init__.py」ファイルの書き方・相対importの構文などに注意が必要です。今回紹介した知識・テクニックを参考にして、Pythonのimportを活用してみましょう。
2024.06.17
子供におすすめのプログラミングスクール10選!学習メリットや教室選びのコツも紹介
#プログラミングスクール
2022.01.06
【完全版】大学生におすすめのプログラミングスクール13選!選ぶコツも詳しく解説
#プログラミングスクール
2024.01.26
【未経験でも転職可】30代におすすめプログラミングスクール8選!
#プログラミングスクール
2024.01.26
初心者必見!独学のJava学習方法とおすすめ本、アプリを詳しく解説
#JAVA
2024.01.26
忙しい社会人におすすめプログラミングスクール15選!失敗しない選び方も詳しく解説
#プログラミングスクール
2022.01.06
【無料あり】大阪のおすすめプログラミングスクール14選!スクール選びのコツも紹介
#プログラミングスクール
2024.01.26
【目的別】東京のおすすめプログラミングスクール20選!スクール選びのコツも徹底解説
#プログラミングスクール
2024.01.26
【無料あり】福岡のおすすめプログラミングスクール13選!選び方も詳しく解説
#プログラミングスクール
2024.01.26
【徹底比較】名古屋のおすすめプログラミングスクール13選!選び方も詳しく解説
#プログラミングスクール
2024.01.26
【徹底比較】おすすめのプログラミングスクール18選!失敗しない選び方も徹底解説
#プログラミングスクール