**module(モジュール)**は単一の .py ファイルであり、**package(パッケージ)**はモジュールのディレクトリです。import によって他のモジュールのコードを利用でき、プログラムを再利用可能な部品へと整理できます。
モジュールと import
python
# math_utils.py — a module
def add(): a + b
PI =
# main.py — different ways to import
import math_utils # import the whole module
math_utils.add(2, 3) # access via the module name
from math_utils import add, PI # import specific names
add(2, 3) # use directly
from math_utils import add as plus # import with an alias
import numpy as np # common aliasing convention
mypackage/
__init__.py ← marks it as a package (can be empty)
module_a.py
subpackage/
__init__.py
module_b.py
from mypackage.module_a import something
from mypackage.subpackage.module_b import other
__init__.py ファイルは、ディレクトリをパッケージとして標識します(パッケージ初期化コードを実行したり、from package import * が何を公開するかを定義したりもできます)。
if __name__ == "__main__" のイディオムdef main():
print("running as a script")
if __name__ == "__main__": # True only when run directly, not when imported
main()
これにより、ファイルは import 可能なモジュールとしても、実行可能なスクリプトとしても振る舞えます。このブロック内のコードは、ファイルが直接実行されたとき(python file.py)にのみ実行され、import されたときには実行されません。ほぼ普遍的な Python のイディオムです。
import sys
sys.path # the list of directories Python searches for imports
# includes: the current directory, installed packages (site-packages), stdlib
import os, json, datetime # standard library — "batteries included"
import requests # third-party — installed via pip from PyPI
モジュールとパッケージは、Python コードを一つの巨大なファイルではなく、再利用可能で保守しやすい単位へと整理する手段であり、自明でないあらゆるプロジェクトの基礎です。
import のスタイル、パッケージ構造(__init__.py)、if __name__ == "__main__" のイディオム(スクリプト/モジュールの二面的な振る舞い)、そして Python がどのようにモジュールを見つけるか(sys.path)を理解することは、プロジェクトを構成し、コードを再利用し、膨大な標準ライブラリと PyPI のエコシステムを使う上で不可欠です。
import エラーや構造の混乱はよくある初期のハードルであり、この知識がそれを解消します。