第6章 モジュール(40問中2問)
Python3基礎試験:importと__name__の違い
第6章のモジュールは、import の書き方ごとに名前の呼び方が変わる点と、ファイルを直接実行したときの __name__ の値が中心です。このページでは、説明用に作ったモジュールを使い、Python 3.9.6で実際に実行した結果で確かめます。覚えるのは、import は名前をモジュール名つきで呼ぶ、from import は直接呼ぶ、__name__ は直接実行したときだけ __main__ になる、の3つです。
このページは試験の学習用の整理です。公式の問題は転載せず、コードはすべて説明用に作った例です。
この記事の目次
公式情報の確認
試験日、料金、申込条件、試験方式など変動する情報は、公式情報を最終確認してください。 当サイトの一次情報確認日: 2026-09-18。
試験の出題範囲・実施要項は変動するため、受験前に公式情報を確認してください。
結論
- import fibo はモジュール名 fibo だけを取り込む。関数は fibo.fib2() と呼び、fib2() だけでは NameError になる
- from fibo import fib2 は fib2 を直接取り込む。代わりに、モジュール名 fibo は定義されない
- from fibo import * は、アンダースコア(_)で始まる名前を除いてすべて取り込む。公式チュートリアルは、殆どの場面で使われないと述べている
- ファイルを直接実行すると __name__ は __main__ になり、import されたときはモジュール名になる。if __name__ == "__main__": の中は直接実行のときだけ動く
- モジュールは1セッションに1回しか実行されない。直したあとに読み込み直すには、インタープリターの再起動か importlib.reload() を使う
importの書き方と名前の呼び方
次の fibo.py を例に、書き方ごとの違いを確かめます。fib2 はフィボナッチ数列のリストを返す関数、先頭に _ が付いた _hidden とそうでない shown は、後で from fibo import * の動きを見るための変数です。
print("fibo を読み込み中")
_hidden = "非公開"
shown = "公開"
def fib(n):
a, b = 0, 1
while a < n:
print(a, end=" ")
a, b = b, a + b
print()
def fib2(n):
result = []
a, b = 0, 1
while a < n:
result.append(a)
a, b = b, a + b
return result
print("__name__ は", __name__)
if __name__ == "__main__":
print("スクリプトとして実行された")公式チュートリアルによると、import fibo は fibo で定義された関数の名前を現在の名前空間に直接追加せず、モジュール名 fibo だけを追加します。from fibo import fib2 のように書くと、モジュール内の名前を直接取り込み、fibo という名前は取り込みません。
| コード | 実行結果 | ひとこと |
|---|---|---|
import fibo
print(fibo.fib2(100)) | [0, 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89] | モジュール名を付けて fibo.fib2 と呼ぶ |
import fibo
fib2(100) | NameError: name 'fib2' is not defined | import fibo はモジュール名 fibo だけを取り込む |
from fibo import fib2
print(fib2(10)) | [0, 1, 1, 2, 3, 5, 8] | 名前を直接取り込むので、モジュール名なしで呼べる |
from fibo import fib2
fibo.fib2(10) | NameError: name 'fibo' is not defined | from で取り込んでも、モジュール名 fibo は定義されない |
import fibo as f
print(f.fib2(10)) | [0, 1, 1, 2, 3, 5, 8] | as の後ろの名前にモジュールが束縛される |
from fibo import fib2 as fibonacci
print(fibonacci(10)) | [0, 1, 1, 2, 3, 5, 8] | from に as を付けても、別名で呼べる |
実行結果の欄は、読み込み時に出る「fibo を読み込み中」「__name__ は fibo」の2行を省いています。
from で取り込むと、モジュール名は使えなくなります。fibo.fib2() と fib2() のどちらが通るかは、書き方で決まります。as を付けると、別の名前で呼べます。import fibo as f では f がモジュールに、from fibo import fib2 as fibonacci では fibonacci が関数に束縛されます。
from fibo import * を実行した名前空間を調べると、取り込まれた名前は shown・fib・fib2 の3つで、_hidden は含まれませんでした。公式チュートリアルは、この書き方はアンダースコアで始まるものを除くすべての名前をインポートし、未知の名前が定義済みの名前を上書きする可能性があるため、殆どの場面で使われないと述べています。import * では、先頭が _ の名前は取り込まれません。
__name__と__main__
公式チュートリアルによると、python fibo.py のようにモジュールを実行すると、__name__ に __main__ が設定されている点を除いて、import したときと同じようにコードが実行されます。モジュールの末尾に if __name__ == "__main__": を書くと、そのファイルが import できるモジュールであると同時に、スクリプトとしても使えます。
| 実行のしかた | __name__ の値 | if の中のコード |
|---|---|---|
| python fibo.py | __main__ | 実行される(「スクリプトとして実行された」と表示) |
| 別のファイルから import fibo | fibo | 実行されない |
Python 3.9.6で fibo.py を直接実行すると、「fibo を読み込み中」「__name__ は __main__」「スクリプトとして実行された」の順に表示されました。import したときは、最後の1行が表示されず、__name__ は fibo でした。if __name__ == "__main__": の中は、import されたときには動きません。
importは1回だけ実行される
公式チュートリアルによると、モジュールの実行文は、import 文の中で最初にモジュール名が見つかったときにだけ実行されます。実行効率上の理由で、各モジュールはインタープリターの1セッションごとに1回だけ import されます。
Python 3.9.6で import fibo を2回続けて書いても、「fibo を読み込み中」は1回しか表示されませんでした。モジュールを修正した場合は、インタープリターを再起動するか、直したいモジュールが1つだけなら importlib.reload(modulename) を使います。importlib.reload(fibo) を実行すると、もう一度「fibo を読み込み中」と表示されました。import を2回書いても、読み込みの処理は1回です。
dir()とsys.path
公式チュートリアルによると、組み込み関数 dir() は、あるモジュールがどんな名前を定義しているかを調べるために使い、ソートされた文字列のリストを返します。引数がない場合は、現在定義している名前を列挙します。dir() は組み込みの関数や変数の名前はリストせず、それらが必要なら標準モジュール builtins を見ます。
Python 3.9.6で dir(fibo) の結果から __ で始まる名前を除くと、_hidden・fib・fib2・shown が並びました。また、from fibo import fib のあとに現在の名前空間で dir() を呼ぶと fib は含まれましたが、組み込みの print は含まれませんでした。print は builtins の側のリストにあります。dir() は定義した名前の一覧で、組み込みの名前は builtins を見ます。
モジュールを探す場所は sys.path に入っています。公式チュートリアルによると、sys.path は文字列からなるリストで、インタープリターがモジュールを検索するときのパスを決めます。検索は、入力されたスクリプトのあるディレクトリ(ファイルが指定されていない場合はカレントディレクトリ)、PYTHONPATH 環境変数に列挙されたディレクトリ、インストール方法に依存するデフォルトの順です。スクリプトのあるディレクトリが先頭に置かれるため、標準ライブラリと同じ名前のスクリプトを置くと、ライブラリより先に読み込まれます。
パッケージと相対import
公式チュートリアルによると、パッケージは、ドット付きモジュール名でモジュールの名前空間を構造化する手段です。モジュール名 A.B は、パッケージ A のサブモジュール B を表します。ディレクトリをパッケージとして扱わせるには、namespace package という高度な機能を使う場合を除き、__init__.py というファイルが必要です。
パッケージの中では、先頭のドットで現在のパッケージや親パッケージを指定する相対 import が使えます。公式チュートリアルの例は、from . import echo、from .. import formats、from ..filters import equalizer です。相対 import は現在のモジュールのパッケージ名が基準になるため、メインモジュールとして使うモジュールでは、絶対 import を使います。
Python3エンジニア認定基礎試験の学習に使う書籍(Amazon)
試験範囲を通して読むときの1冊です。読んだ章は、このサイトの章別問題で確かめられます。
よくある質問
第6章のモジュールは、何問出ますか?
このサイトが整理した公式の章別出題数では、40問中2問(5.0%)です。出題数は少ない章なので、import の書き方の違いと、if __name__ == "__main__": が動く条件を優先して確認します。
import fibo と from fibo import fib2 は、何が違いますか?
取り込まれる名前が違います。公式チュートリアルによると、import fibo は fibo という名前だけを現在の名前空間に追加するので fibo.fib2() と呼びます。from fibo import fib2 は fib2 を直接取り込み、fibo という名前は定義されません。
from fibo import * で、取り込まれない名前はありますか?
アンダースコア(_)で始まる名前は取り込まれません。公式チュートリアルは、アンダースコアで始まるものを除くすべての名前をインポートすると説明しています。説明用のモジュールで試すと、_hidden は取り込まれず、shown・fib・fib2 だけが取り込まれました。
if __name__ == "__main__": の中は、いつ実行されますか?
python fibo.py のようにファイルを直接実行したときだけです。公式チュートリアルによると、このときは __name__ に __main__ が設定されます。他のファイルから import されたときは __name__ がモジュール名になるので、その中のコードは実行されません。
