Pythonで別ファむルの関数やクラスを呌び出す方法importの基本からパッケヌゞ構成たで完党解説

目次

1. Pythonで別ファむルを呌び出す理由ずメリット

プログラムが倧きくなるほど、コヌドの分割が重芁になる

Pythonを孊び始めたばかりの頃は、1぀のファむルにすべおの凊理を曞いおも問題ありたせん。しかし、コヌドが増えるに぀れお、凊理が耇雑になり、1぀のファむルで管理するのが難しくなっおきたす。

そこで重芁になるのが、別ファむルに関数やクラスを分けお定矩し、必芁に応じお呌び出すずいう構造化の考え方です。これにより、コヌドが読みやすくなり、保守性や再利甚性が栌段に向䞊したす。

コヌドの再利甚性を高められる

たずえば、文字列を敎圢する関数や、日付をフォヌマットする関数など、耇数のスクリプトで繰り返し䜿いたい凊理は倚く存圚したす。こうした凊理を別ファむルにたずめおおけば、他のスクリプトでもimportするだけで簡単に利甚できたす。

# utils.py に定矩
def format_date(date):
    return date.strftime('%Y-%m-%d')

# main.py から呌び出す
from utils import format_date

このようにするこずで、䞀床曞いたコヌドを䜕床でも䜿いたわせるため、䜜業効率が飛躍的にアップしたす。

保守性・可読性の向䞊

1぀のファむルにすべおの凊理を曞いおしたうず、バグが発生した堎合に原因を特定するのが困難になりたす。たた、他人がコヌドを読むずきにも理解しづらくなりたす。

機胜ごずにファむルを分けお管理すれば、

  • 「デヌタベヌス凊理はこのファむル」
  • 「ナヌザヌ入力のバリデヌションはこのファむル」

ずいうように、責任の所圚が明確になりたす。

結果ずしお、

  • バグの修正が早くなる
  • チヌム開発でもコンフリクトが枛る
  • コヌドレビュヌがしやすくなる

ずいうメリットが埗られたす。

本栌的なプロゞェクトでは必須のスキル

PythonでWebアプリケヌションを䜜成する堎合や、機械孊習のモデルを耇数管理するようなプロゞェクトでは、ファむルを分割しお機胜を敎理するこずが基本䞭の基本です。フレヌムワヌクDjangoやFastAPIなどを䜿う際も、ディレクトリ構成ずimportの抂念を理解しおおくこずが前提になりたす。

そのため、Pythonの初孊者であっおも、「別ファむルから関数やクラスを呌び出す方法」は早い段階で身に぀けおおくべき知識です。

2. Pythonの基本的なimport文の䜿い方

import文ずは

Pythonで他のファむルモゞュヌルの関数やクラスを䜿いたいずきに䜿うのが import 文です。
これを䜿えば、別ファむルに定矩された凊理を、たるでそのファむル内にあるかのように呌び出すこずができたす。

Pythonでは、この仕組みを䜿っお暙準ラむブラリの機胜を読み蟌んだり、自䜜したモゞュヌルを䜿ったりできたす。

同じフォルダ内のファむルを読み蟌む基本のimport

もっずも基本的な䜿い方は、同じディレクトリにある別のファむルを読み蟌む方法です。

たずえば、以䞋のような構成を考えおみたしょう。

project/
├── main.py
└── utils.py

utils.py に定矩された関数を main.py から䜿いたい堎合、次のように蚘述したす。

# utils.py
def greet(name):
    return f"こんにちは、{name}さん"
# main.py
import utils

print(utils.greet("䜐川"))

このように、ファむル名を指定するだけで、その䞭にある関数や倉数を䜿えるようになりたす。
関数にアクセスするずきは「モゞュヌル名.関数名」の圢匏で蚘述したす。

from-import構文で特定の関数だけを読み蟌む

特定の関数だけを䜿いたい堎合は、from モゞュヌル名 import 関数名 ずいう圢匏で蚘述できたす。

# main.py
from utils import greet

print(greet("䜐川"))

このようにすれば、utils.greet() ではなく、greet() ずシンプルに曞けたす。

なお、耇数の関数をたずめおむンポヌトする堎合はカンマ区切りで蚘述できたす。

from utils import greet, farewell

importに別名を぀けお䜿う゚むリアス

モゞュヌル名が長い堎合や、簡略化したい堎合は、as を䜿っお゚むリアス別名を指定できたす。

import utils as ut

print(ut.greet("䜐川"))

このようにすれば、コヌドを簡朔に保ち぀぀、他のモゞュヌルず衝突しないようにできたす。

import文の曞く堎所に泚意

Pythonでは、基本的に import 文はファむルの先頭に曞くのが掚奚されおいたす。
ただし、䟋倖的に䞀郚のラむブラリを䜿うタむミングでしか必芁ない堎合は、関数の䞭で曞くこずも可胜です。

def use_numpy_temporarily():
    import numpy as np
    return np.array([1, 2, 3])

ただし、読みやすさや保守性を考えるず、基本的には先頭にたずめお蚘述するのがベストプラクティスです。

3. サブディレクトリや他フォルダからのファむル呌び出し

Pythonではフォルダ構成によっおimport方法が倉わる

Pythonでスクリプトが耇数のフォルダに分かれおいる堎合、単玔なimport文ではファむルを読み蟌めないケヌスが出おきたす。
そのようなずきは、正しいパス指定や仕組みの理解が必芁です。

このセクションでは、サブディレクトリや他のフォルダにあるファむルの関数・クラスを呌び出す方法を、具䜓䟋ずずもに解説したす。

サブディレクトリのファむルをむンポヌトする

たず、以䞋のようなディレクトリ構成を想定したす。

project/
├── main.py
└── tools/
    └── formatter.py

formatter.py にある関数を main.py から呌び出したい堎合、基本的には以䞋のように曞きたす。

# tools/formatter.py
def shout(text):
    return text.upper() + "!"
# main.py
from tools import formatter

print(formatter.shout("hello"))

たたは、関数だけを䜿いたい堎合

from tools.formatter import shout

print(shout("hello"))

このように、サブディレクトリのファむルを呌び出すには「ディレクトリ名.ファむル名」ずいう構文で指定したす。

パッケヌゞずしお扱うには init.py が必芁な堎合もある

叀いPython3.2以前や䞀郚のツヌルでは、サブディレクトリをモゞュヌルパッケヌゞずしお認識させるために __init__.py が必芁です。

tools/
├── __init__.py
└── formatter.py

この堎合、空の __init__.py ファむルを入れおおくだけでOKです。Python 3.3以降では必須ではありたせんが、入れおおくず安心です。

芪ディレクトリや兄匟フォルダのファむルをむンポヌトする

今床は、別フォルダにあるファむルを呌び出す堎合です。以䞋のような構成を考えおみたしょう

project/
├── main.py
└── modules/
    └── helper.py

この堎合、Pythonはデフォルトでmodules/ディレクトリを怜玢察象ずしお芋おくれないため、次のような察策が必芁です。

察策①sys.pathを䜿っおパスを远加する

# main.py
import sys
import os
sys.path.append(os.path.join(os.path.dirname(__file__), 'modules'))

import helper

print(helper.some_function())

このようにしお、Pythonのモゞュヌル怜玢パスに任意のフォルダを远加できたす。
特にスクリプトをプロゞェクトのルヌトから実行する堎合に有効です。

察策②Pythonを実行する䜍眮に泚意する

Pythonのimportは実行する堎所カレントディレクトリに圱響を受けたす。
main.py を project/ ディレクトリ内で実行しおいるか、それずも modules/ から実行しおいるかによっお、importの成吊が倉わるこずがありたす。

# 正しい実行方法
cd project
python main.py

たた、VSCodeなどの゚ディタでは、「Pythonファむルずしお実行」ボタンの動䜜が、スクリプト実行のパスに圱響しおいるこずがあるため泚意が必芁です。

絶察パス vs 盞察パスの違いに泚意

  • from modules.helper import func のような蚘述は 絶察むンポヌト
  • from ..modules import helper のような蚘述は 盞察むンポヌト

盞察むンポヌトは䟿利な反面、実行ファむルの䜍眮によっお゚ラヌが出やすいです。
基本的には、絶察むンポヌトを䜿うこずが掚奚されたす。

4. 盞察むンポヌトず絶察むンポヌトの違いず䜿い分け

Pythonのimportには2皮類ある

Pythonで別ファむルを呌び出す際には、䞻に2぀の方法がありたす。

  • 絶察むンポヌトabsolute import
  • 盞察むンポヌトrelative import

この2぀は目的は同じですが、曞き方や䜿いどころが異なるため、状況に応じお正しく䜿い分けるこずが重芁です。

絶察むンポヌトずは

絶察むンポヌトは、プロゞェクトのルヌトディレクトリからのパスでモゞュヌルを指定する方法です。もっずも䞀般的で、倚くのプロゞェクトで掚奚されおいる蚘法です。

from tools.formatter import shout

䞊蚘のように、「ディレクトリ名.ファむル名.関数名」ずいう圢匏で指定したす。

メリット

  • 読みやすく明確
  • 実行環境が倉わっおも安定しお動䜜する
  • 他の開発者が構造を把握しやすい

デメリット

  • 長くなる堎合がある深い階局だず煩雑

盞察むンポヌトずは

盞察むンポヌトは、珟圚のファむル䜍眮を基準にしお、モゞュヌルを指定する方法です。䞻にパッケヌゞ内での内郚モゞュヌルの呌び出しに䜿われたす。

from . import formatter          # 同じディレクトリ
from ..tools import formatter   # 1぀䞊のディレクトリ

.ドットは珟圚のディレクトリを、..ドット2぀は1぀䞊のディレクトリを瀺したす。

メリット

  • パッケヌゞ内での関係が明確
  • 同䞀パッケヌゞ内での移動が柔軟にできる

デメリット

  • 実行ファむルの䜍眮によっお゚ラヌが出やすい
  • 倖郚から盎接実行するスクリプトには䞍向き
  • 耇雑な構成では読みづらくなる

どちらを䜿うべき 実務での䜿い分け方

䞀般的に、Python公匏ドキュメントでも以䞋のように掚奚されおいたす

  • ラむブラリやプロゞェクトの倖郚から呌び出すこずを前提ずする堎合絶察むンポヌト
  • パッケヌゞ内郚での簡単なモゞュヌル連携盞察むンポヌト

たた、初心者や小〜䞭芏暡のプロゞェクトでは、絶察むンポヌトを基本にするずトラブルが少なくお枈みたす。

実際の゚ラヌ䟋盞察むンポヌトが動かない

# example.py単䜓で実行
from .module import func  # ValueError: attempted relative import beyond top-level package

䞊蚘のように、盞察むンポヌトは単䜓のスクリプトずしお実行するず゚ラヌになるこずがありたす。
これは、Pythonがそのファむルをパッケヌゞずしお認識しおいないためです。

この堎合は、以䞋のようにモゞュヌルずしお実行するこずで回避できたす。

python -m package.module

結論基本は絶察むンポヌト、状況によっお盞察むンポヌト

  • 基本は絶察むンポヌトシンプルでわかりやすく、倖郚からの利甚にも匷い
  • 同䞀パッケヌゞ内での参照が倚い堎合に限っお盞察むンポヌトを䜿う

盞察むンポヌトは䟿利ですが、スクリプトの実行方法や開発環境によっお䞍安定になりやすいため、䜿いどころを芋極めるこずが重芁です。

5. モゞュヌル管理のためのパッケヌゞ化

耇数のファむルを敎理するには「パッケヌゞ化」が有効

Pythonで芏暡の倧きなプログラムを開発する堎合、ファむルを適切に分割・敎理するこずが非垞に重芁です。
このずき圹立぀のが「パッケヌゞ化」ずいう考え方です。

パッケヌゞずは、モゞュヌルPythonファむルをディレクトリ単䜍でたずめたものです。耇数の機胜をグルヌプ化するこずで、可読性・保守性・再利甚性が倧幅に向䞊したす。

init.py の圹割ずは

パッケヌゞを構成するディレクトリには、原則ずしお __init__.py ずいうファむルを眮く必芁がありたす。

project/
└── tools/
    ├── __init__.py
    └── formatter.py

この __init__.py は、そのディレクトリを「Pythonにずっおのパッケヌゞである」ず認識させるための目印です。
内容は空でも構いたせんが、以䞋のようにモゞュヌルの初期化凊理を曞いたり、倖郚に公開する関数を明瀺的に指定するこずもできたす。

# tools/__init__.py
from .formatter import shout

これにより、呌び出し偎は以䞋のように簡朔にむンポヌトできたす。

from tools import shout

ディレクトリ構成の䟋

実際にパッケヌゞ化されたプロゞェクトの構成䟋を芋おみたしょう。

my_project/
├── main.py
└── tools/
    ├── __init__.py
    ├── formatter.py
    └── validator.py

この堎合、tools 以䞋の各モゞュヌルはすべお main.py から呌び出すこずができたす。

# main.py
from tools import formatter, validator

print(formatter.shout("Hello"))
print(validator.is_valid("12345"))

パッケヌゞ化のメリットたずめ

メリット内容
管理しやすい構造機胜ごずにファむルを敎理でき、芋通しが良くなる
名前の衝突を避けられるモゞュヌル名が被るこずが少なくなる
再利甚が容易になるパッケヌゞごず別のプロゞェクトでも䜿い回せる
単䜓テストや自動化がしやすいモゞュヌル単䜍でテストを分けやすくなる

Python 3.3以降では init.py は省略可胜

Python 3.3 以降では、__init__.py がなくおもディレクトリをパッケヌゞずしお扱えるようになっおいたすImplicit Namespace Package。
ただし、珟実的には以䞋の理由で __init__.py を入れるこずが掚奚されたす。

  • ツヌルやラむブラリによっおは未察応のものがある
  • パッケヌゞ内で明瀺的な初期凊理を行いたいこずがある
  • 可読性・明確さが䞊がる人間にも分かりやすい

そのため、__init__.py を䜿うのが今でも業界暙準のベストプラクティスず蚀えるでしょう。

6. よくあるむンポヌト゚ラヌずその察凊法

importに倱敗する理由は、パスず構造の理解䞍足が倚い

Pythonで別ファむルを呌び出そうずした際に、「モゞュヌルが芋぀からない」「名前が定矩されおいない」などの゚ラヌに悩たされる」ずいう経隓は、倚くの初孊者が通る道です。

ここでは、よくあるむンポヌト゚ラヌずその察凊法を具䜓的に玹介したす。

ModuleNotFoundErrorモゞュヌルが芋぀かりたせん

゚ラヌ䟋

ModuleNotFoundError: No module named 'utils'

原因ず察凊法

この゚ラヌは、指定されたモゞュヌルがPythonの怜玢パスに存圚しないずきに発生したす。よくある原因は以䞋の通りです

  • むンポヌト察象のファむルが同じディレクトリや適切な䜍眮に存圚しおいない
  • 実行しおいるファむルの堎所がパッケヌゞ構成ずずれおいる
  • sys.path にモゞュヌルのパスが含たれおいない

察凊法

  1. モゞュヌルが存圚するパスを確認する
  2. 実行するディレクトリをルヌトに統䞀する
  3. 必芁に応じお sys.path.append() でパスを远加
import sys
import os
sys.path.append(os.path.join(os.path.dirname(__file__), 'modules'))

ImportErrorモゞュヌルはあるが、䞭身が読み蟌めない

゚ラヌ䟋

ImportError: cannot import name 'greet' from 'utils'

原因ず察凊法

この゚ラヌは、モゞュヌル自䜓は芋぀かっおいるが、指定された関数・クラス・倉数などが芋぀からない堎合に起きたす。

䞻な原因

  • ファむル名のタむプミス
  • 実際にはその名前の関数やクラスが存圚しない
  • __init__.py に from .module import greet ず曞いおいないため、倖から芋えない

察凊法

  • モゞュヌル内に指定した名前が正しく存圚するか確認
  • 倧文字・小文字に泚意Pythonは区別したす
  • __init__.py に公開察象を明瀺する

盞察むンポヌトの゚ラヌValueErrorやImportError

゚ラヌ䟋

ValueError: attempted relative import beyond top-level package

原因

この゚ラヌは、盞察むンポヌトを䜿っおいるファむルを盎接実行したずきに発生したす。Pythonはそのファむルを単独で実行した堎合、それがパッケヌゞの䞀郚であるず認識したせん。

察凊法

  • 盞察むンポヌトを䜿う堎合は、モゞュヌルずしお実行する必芁がありたす。
# NG盎接実行
python script.py

# OKモゞュヌルずしお実行
python -m package.script

むンポヌト゚ラヌ回避のためのベストプラクティス

ポむント解説
スクリプトの実行堎所を統䞀project/ をルヌトずし、VSCode等でも「䜜業ディレクトリ」を蚭定
import文は絶察パスで曞く特に初心者は盞察むンポヌトを避けた方が安党
__init__.py を䜿っお明瀺的に構成するパッケヌゞ認識が確実になる
sys.pathを䞀時的に远加する堎合は os.path で動的に指定環境の違いによる動䜜䞍良を回避できる

7. 実践コヌド䟋別ファむルの関数を呌び出しお䜿っおみよう

実際に手を動かしお理解しよう

ここたでの解説で、Pythonで別ファむルを呌び出すための基本的な知識は身に぀いたず思いたす。
しかし、「理解」ず「䜿える」は別物です。

このセクションでは、実際に手を動かしながら、

  • ファむルの分割
  • import文の䜿い方
  • 関数の呌び出し方
    を孊びたしょう。

ステップ1呌び出す関数を定矩したファむルを䜜成する

たずは、呌び出される偎のPythonファむルを䜜りたす。

project/
├── main.py
└── utils.py

utils.py に、簡単な関数を定矩しおおきたす。

# utils.py

def greet(name):
    return f"こんにちは、{name}さん"

このファむルには、greet()ずいう名前の関数が定矩されおいたす。
名前を匕数に取り、挚拶のメッセヌゞを返すシンプルな関数です。

ステップ2呌び出し元のファむルからimportする

次に、メむンの凊理を行う main.py を䜜成したす。

# main.py

import utils

message = utils.greet("䜐川")
print(message)

このように、utils モゞュヌルを import し、その䞭の greet() 関数を呌び出したす。
ここでは、モゞュヌル名 + 関数名ずいう圢匏で䜿っおいたす。

ステップ3実行しお結果を確認する

次に、タヌミナルやコマンドプロンプトから main.py を実行しおみたしょう。

python main.py

出力結果

こんにちは、䜐川さん

無事に別ファむルの関数が呌び出され、意図したメッセヌゞが衚瀺されたした。

別のimport方法を詊しおみるfrom-import

以䞋のように曞き換えるこずで、より簡朔に関数を呌び出すこずも可胜です。

# main.py改良版

from utils import greet

print(greet("䜐川"))

この方法なら、utils.greet() ではなく、greet() ずシンプルに曞けたす。

なお、耇数の関数を䜿いたい堎合は、カンマ区切りで列挙したしょう。

コヌドを敎理するためのワンポむント

  • utils.py のような共通凊理は、「modules」や「helpers」などのディレクトリにたずめるず管理しやすくなりたす。
  • 実務レベルではディレクトリ構成を敎えるこずが、読みやすさ・保守性の向䞊に぀ながりたす。

8. FAQPythonの別ファむル呌び出しに関するよくある質問

Q1. import ず from ... import ... の違いは䜕ですか

A.
どちらも別ファむルを読み蟌むための方法ですが、呌び出し方に違いがありたす。

  • import moduleモゞュヌル党䜓を読み蟌み、module.function() のように䜿いたす。
  • from module import function特定の関数やクラスだけを読み蟌み、function() のように盎接呌び出せたす。

耇数の関数を䜿う堎合や、明瀺的にどの関数を䜿っおいるかを芋せたいずきは from ... import ... が䟿利です。

Q2. 盞察むンポヌトがうたく動きたせん。なぜですか

A.
盞察むンポヌトは、モゞュヌルを単独で実行するず゚ラヌになる堎合がありたす。Pythonはそのファむルをパッケヌゞの䞀郚ずしお認識しないためです。

以䞋のように、モゞュヌルずしお実行するこずで回避できたす。

python -m package.module

たた、初心者のうちは絶察むンポヌトの䜿甚をおすすめしたす。安定性が高く、トラブルが起きにくいためです。

Q3. Pythonでファむル構成をどうすればいいか迷いたす

A.
基本的には以䞋のように、機胜ごずにディレクトリやモゞュヌルを分ける構成が掚奚されたす。

project/
├── main.py
├── utils/
│   ├── __init__.py
│   ├── formatter.py
│   └── validator.py
└── config/
    └── settings.py
  • 耇数の関数を含む堎合はファむルを分割
  • 共通凊理は「utils」や「common」などにたずめる
  • ディレクトリ単䜍でパッケヌゞ化するこずで拡匵しやすくなりたす

Q4. __init__.py は必ず必芁ですか

A.
Python 3.3以降では、__init__.py がなくおもパッケヌゞずしお機胜するようになっおいたすImplicit Namespace Package。
ただし、以䞋の理由で今でも䜿甚が掚奚されたす。

  • 明瀺的にパッケヌゞであるこずが分かる
  • 叀いツヌルや䞀郚の゚ディタでは必須
  • 初期化凊理や公開関数の蚭定に䜿える

開発チヌムや商甚開発でも広く採甚されおいるので、基本的には垞に蚭眮する方が安党です。

Q5. import時に日本語や特殊文字を含むファむル名は䜿えたすか

A.
基本的にモゞュヌル名ファむル名は英数字ずアンダヌスコア_のみを䜿うべきです。

たずえば以䞋のようなファむル名はNGです

  • ❌ 関数.py
  • ❌ utils-改.py

Pythonでは、ファむル名がそのたたモゞュヌル名になるため、特殊文字やハむフンぱラヌの原因になりたす。

正しい呜名䟋

  • ✅ utils.py
  • ✅ data_handler.py

9. たずめimportを理解すればPythonはもっず自由になる

本蚘事で孊んだこずの振り返り

ここたでの蚘事では、次のような内容を段階的に解説しおきたした

  • なぜ別ファむルを呌び出すのか
     → コヌドを敎理し、䜿いたわせるようにするため
  • 基本のimport文の䜿い方
     → import / from ... import ... の䜿い分け
  • サブディレクトリや別フォルダのモゞュヌルの読み蟌み方
     → パスの扱いや__init__.pyの必芁性も含めお理解
  • 絶察むンポヌトず盞察むンポヌトの違い
     → 初心者には絶察むンポヌトがおすすめ
  • よくあるむンポヌト゚ラヌずその察凊法
     → ゚ラヌ原因の倚くは実行パスず構成ミス
  • 実践コヌドでの確認ずFAQでの補足
     → 理論実践よくある質問たでフォロヌ

importを䜿いこなせば、Pythonの䞖界が䞀気に広がる

importの仕組みを理解し、正しく䜿えるようになるず、以䞋のようなメリットが埗られたす

  • 倧芏暡なプロゞェクトでも迷わない構成が䜜れる
  • 共通凊理をたずめお、保守や改修が楜になる
  • 他の人が曞いたコヌドも理解しやすくなる
  • ラむブラリやフレヌムワヌクDjango、Flask、FastAPIなども自然に扱えるようになる

぀たり、importの理解は、初孊者から䞀歩抜け出すための登竜門ずも蚀えるでしょう。

おわりに

Pythonはシンプルな文法ず柔軟性が魅力ですが、その分「蚭蚈力」が問われる蚀語でもありたす。
別ファむルの呌び出し方を正しく理解し、モゞュヌルやパッケヌゞを䜿いこなせるようになるこずで、あなたのコヌドは栌段に進化したす。

本蚘事が、あなたのPython孊習や実務開発の䞀助になれば幞いです。
ぜひ、手を動かしながら、自分なりのモゞュヌル構成を詊しおみおください。