【Python】モジュールを別フォルダでインポートする方法


前回、Pythonで別ファイル(モジュール)でプログラムを動かす方法を紹介しました。
今回は、同じフォルダ内ではなく、別フォルダにあるモジュールをインポートしてプログラムを実行する方法を紹介します。


【Python】別フォルダにあるモジュールをインポートしプログラムを実行する方法

Pythonでは別ファイルで分けてプログラムを実行することにより、メンテナンスを安く、プログラムも分割されて見やすくなります。

前回は、同じフォルダ内でのモジュールを使ったプログラムを実行しましたが、以下では別フォルダにあるモジュールを使用したプログラムの実行の仕方を紹介します。

プログラムを実行したいモジュールのフォルダに「__init__.py」を配置する

別フォルダのモジュールをimportするルールとして、「__init__.py」を配置します。
この「__init__.py」はファイルを作成するだけで、中身は何も書かなくても大丈夫です。

__init__.py

また、今回の別フォルダのモジュールを実行するプログラムの階層構成は以下となります。

Python
 |--- __init__.py
 |--- import-test01.py
 |--- import-test03.py
 |--- module02.py
 |--- module04.py
 |--- test
      +
      |--- __init__.py
      |--- import-test02.py
      |--- module01.py
      |--- test2
            +
            |--- __init__.py
            |--- module03.py
            |--- import-test04.py


フォルダ配下のモジュールをインポートしファイルを実行

以下では、「import-test01.py」で一つしたの別フォルダにある「module01.py」をインポートしてプログラムを実行します。

Python
 |--- __init__.py
 |--- import-test01.py
 |--- import-test03.py
 |--- module02.py
 |--- module04.py
 |--- test
      +
      |--- __init__.py
      |--- import-test02.py
      |--- module01.py
      |--- test2
            +
            |--- __init__.py
            |--- module03.py
            |--- import-test04.py

インポートするモジュールの内容は前回のモジュールと同様の内容となります。

※ module01.py

def add(a, b):
    return a + b

def sub(a, b):
    return a - b

※ import-test01.py

from test import module01

sum = module01.add(10, 5)
dif = module01.sub(20, 15)
print(sum, dif)

※ 実行結果

$ python3 import-test01.py 
15 5

関数を利用したモジュール名を使用しないプログラム

関数を毎回指定するのがめんどくさい方は以下のようにimportで関数をしてすることで簡単なプログラムを作成することが可能です。

※ import-test01.py

from test.module01 import add, sub

sum = add(10, 5)
dif = sub(20, 15)
print(sum, dif)

※ 実行結果

$ python3 import-test01.py 
15 5

一つ以上、下のフォルダにあるモジュールをインポートするプログラム

上記では、別フォルダの一つしたにあるモジュールをインポートするプログラムでしたが、それより下のモジュールをインポートする方法は以下となります。

Python
 |--- __init__.py
 |--- import-test01.py
 |--- import-test03.py
 |--- module02.py
 |--- module04.py
 |--- test
      +
      |--- __init__.py
      |--- import-test02.py
      |--- module01.py
      |--- test2
            +
            |--- __init__.py
            |--- module03.py
            |--- import-test04.py

※ module03.py

def add(a, b):
    return a + b

def sub(a, b):
    return a - b

一つ以上下のフォルダのモジュールをインポートする場合は、「.」を使用します。
今回のインポートするモジュールは「module03」となるため、「test」フォルダのもう一つ下の「test2」フォルダないのモジュールを指定します。

書き方は以下となります。

test.test2

※ import-test03.py

from test.test2 import module03

sum = module03.add(10, 5)
dif = module03.sub(20, 15)
print(sum, dif)

※ 実行結果

$ python3 import-test03.py 
15 5

関数を利用したモジュール名を使用しないプログラム

こちらも上記と同じようにimportで関数を指定することにより、いちいちモジュール名を指定せず簡単なプログラムを書くことができます。

※ import-test03.py

from test.test2.module03 import add, sub

sum = add(10, 5)
dif = sub(20, 15)
print(sum, dif)

※ 実行結果

$ python3 import-test03.py 
15 5

親ディレクトリ(フォルダ)のモジュールをインポートしファイルを実行

次に親ディレクトリ、一つ上のフォルダを指定してプログラムを実行する方法を紹介します。
一つ上のディレクトリ指定には「import sys」を利用します。

※ 一つ上のフォルダのモジュールを指定するプログラム

import sys
sys.path.append('../')
import module02

また、一つ以上のフォルダ内にあるモジュールを指定するさいは以下のように「(‘../’)」を増やします。

親フォルダの指定例

#1つ上のフォルダ内のモジュールをインポート
import sys
sys.path.append('../')
import module01

#2つ上のフォルダ内のモジュールをインポート
sys.path.append('../../')
import module02

#3つ上のフォルダ内のモジュールをインポート
sys.path.append('../../../')
import module03

一つ上のフォルダのモジュールをインポートしファイルを実行

以下では一つ上のフォルダ内にあるモジュールをインポートしたプログラムとなります。

Python
 |--- __init__.py
 |--- import-test01.py
 |--- import-test03.py
 |--- module02.py
 |--- module04.py
 |--- test
      +
      |--- __init__.py
      |--- import-test02.py
      |--- module01.py
      |--- test2
            +
            |--- __init__.py
            |--- module03.py
            |--- import-test04.py

※ module02.py

def add(a, b):
    return a + b

def sub(a, b):
    return a - b

一つ上のフォルダを指定する際は、「import sys」を指定し、上の階層を指定する場合「(‘../’)」をプログラムに書きます。

※ import-test02.py

import sys
sys.path.append('../')
import module02

sum = module02.add(10, 5)
dif = module02.sub(20, 15)
print(sum, dif)

※ 実行結果

$ python3 import-test02.py 
15 5

関数を利用したモジュール名を使用しないプログラム

親ディレクトリ指定でも関数を利用したプログラムを書くことができます。
以下は設定例となります。

※ import-test02.py

import sys
sys.path.append('../')
from module02 import add, sub

sum = add(10, 5)
dif = sub(20, 15)
print(sum, dif)

※ 実行結果

$ python3 import-test02.py 
15 5

一つ以上、上のフォルダのモジュールをインポートしファイルを実行

Python
 |--- __init__.py
 |--- import-test01.py
 |--- import-test03.py
 |--- module02.py
 |--- module04.py
 |--- test
      +
      |--- __init__.py
      |--- import-test02.py
      |--- module01.py
      |--- test2
            +
            |--- __init__.py
            |--- module03.py
            |--- import-test04.py

※ module04.py

def add(a, b):
    return a + b

def sub(a, b):
    return a - b

一つ以上、上のフォルダ内のモジュールをインポートする場合は、上記と同じく「import sys」を指定し、「../」を追記します。

※ import-test04.py

import sys
sys.path.append('../../')
import module04

sum = module04.add(10, 5)
dif = module04.sub(20, 15)
print(sum, dif)

※ 実行結果

$ python3 import-test04.py 
15 5

関数を利用したモジュール名を使用しないプログラム

同じように関数を利用したプログラムは以下のようになります。

※ import-test04.py

import sys
sys.path.append('../../')
from module04 import add, sub

sum = add(10, 5)
dif = sub(20, 15)
print(sum, dif)

※ 実行結果

$ python3 import-test04.py 
15 5

モジュールを分割してメンテナンスしやすくし、フォルダ別でプログラムをしたい方は是非今回の記事を合わせて参考にしてください。

別ファイル(モジュール)を利用したプログラム作成の記事はこちらから!

【Python】モジュールでプログラムを機能ごとにファイル分割

2019年12月22日

モジュール指定は使用することで使いやすのでぜひ活用してください。


関連記事


コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

日本語が含まれない投稿は無視されますのでご注意ください。(スパム対策)

ABOUTこの記事をかいた人

blank

インターネット関連のSEをやっています。 ネットワーク、サーバー、ストレージ、仮想基盤まで幅広く手を出しており、MVNOの構築経験もあります。 現在は、Pythonを使ったプログラミングの開発をしネットワークの自動化ツールを作成しています! Pythonの入門書も作成しているので、ぜひ参考にしてください!