AI資格ドリル
資格を選ぶ↓

第6章 モジュール(40問中2問)

Python3基礎試験:importと__name__の違い

第6章のモジュールは、import の書き方ごとに名前の呼び方が変わる点と、ファイルを直接実行したときの __name__ の値が中心です。このページでは、説明用に作ったモジュールを使い、Python 3.9.6で実際に実行した結果で確かめます。覚えるのは、import は名前をモジュール名つきで呼ぶ、from import は直接呼ぶ、__name__ は直接実行したときだけ __main__ になる、の3つです。

このページは試験の学習用の整理です。公式の問題は転載せず、コードはすべて説明用に作った例です。

公式情報の確認

試験日、料金、申込条件、試験方式など変動する情報は、公式情報を最終確認してください。 当サイトの一次情報確認日: 2026-09-18。

試験の出題範囲・実施要項は変動するため、受験前に公式情報を確認してください。

結論

  1. import fibo はモジュール名 fibo だけを取り込む。関数は fibo.fib2() と呼び、fib2() だけでは NameError になる
  2. from fibo import fib2 は fib2 を直接取り込む。代わりに、モジュール名 fibo は定義されない
  3. from fibo import * は、アンダースコア(_)で始まる名前を除いてすべて取り込む。公式チュートリアルは、殆どの場面で使われないと述べている
  4. ファイルを直接実行すると __name__ は __main__ になり、import されたときはモジュール名になる。if __name__ == "__main__": の中は直接実行のときだけ動く
  5. モジュールは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 definedimport 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 definedfrom で取り込んでも、モジュール名 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 fibofibo実行されない

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冊です。読んだ章は、このサイトの章別問題で確かめられます。

PR

ほかの資格を含む参考書・問題集の一覧を見る

よくある質問

第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__ がモジュール名になるので、その中のコードは実行されません。

次に読むと効率的なページ

執筆: ミナト編集部(運営者情報を見る)