蛇使いな彼女BLOG
【第16回】 ライブラリ余談ーモジュール化
2020.08.06

こんにちは!もとちゃんです
今日は基本的な操作そっちのけでモジュール化について簡単に方法を書こうと思います。
思い立ったが吉日です。
最近処理工程の多いプログラムを作っていると、一つのスクリプトに収まりきらないんですよね~。
行数さえ気にしなければ収まるっちゃ収まるんですが…
Pythonは「インデントを揃えましょう!」というルールがありますから、for文(繰り返し)やif文(条件分岐)、def関数が多いと、おのずと字下げも多くなりますし、後々プログラムの調整をしている際に誤ってインデントを無くしてしまうとそれだけでプログラムが正常に動いてくれないのです。
(繊細です)
行数の多い大きなプログラムというのは、この調整のしづらさと、ごちゃごちゃして見づらいのがネックなんですね~。
さて、本題ですが今回の目標は
•後の作業を楽にする
•後から見直しても分かりやすくする
この2点です。
以下では例としてユーザーからの入力データ(数字)を適当な配列にして、可視化を行います。
メインプロジェクト:test_mj.py
サブプロジェクト:test_a.py
test_mj.pyは入力データから乱数を生成し、それをtest_aの図化関数を使って可視化します。
test_a.pyには図化の関数が記述されています。
•test_a.py

4行目:まず図化に必要なmatplotlibをインポート。
5行目:次にinput()というのはユーザーから入力を受け取るためのツールです。
ここでは任意のグラフタイトル(アルファベット)を入力させます。
7行目:def pltfig(xval,yval,title): は任意の関数を定義しています。
各引数は、
xval=X軸データ
yval=Y軸データ
title=図のタイトル名 を想定しています。
タイトル名以外はtest_mj.pyで受け取った値を代入します。
def関数の宣言をしたら、次の行目からはインデントを揃えて記述します。
これが冒頭で言ったルールですね(・ω・)
•test_mj.py

こちらのメインプロジェクトでは先程のpltfig関数を使って図化を行います。
別のプログラム(test_a.py)の関数を使って処理を行いたいので、このプログラムのシステムにパスを通してあげます。

行目:まずosとsysをインポートします。
(osは必要であればインポート)
5行目:次に、sys.path.append() で()の中に開きたいプログラムがあるフォルダパスを指定します。
今回はこんな階層構造↓

()の中にはプログラムtest_a.pyのフォルダまでのパス(フルパス)を記述しました。
C:/…/hebikano_code_sample/test_mj/test_a /test_a.py
参考として、開きたいプログラムが同じ階層にあったり、1つ上の階層にある場合、直接 importファイル名(.pyは不要) でインポートできる場合や
sys.path.append(os.path.join(os.path.dirname(‘__file__’),’..’)) などど書いて
パスを通すこともできます。
これは今開いているプロジェクトファイル(__file__)からひとつ外側の領域パスを追加するという意味です。
確か
(今回何故かこの方法ができなかったのでos使わずフルパスにしました(;´д`))
7行目:パスを通し終わったら次にインポートします。
モジュールとしてインポートするときは
同じ階層にある場合
main
a.py (実行中)
b.py(呼出す側)
)
main
a.py (実行中)
b.py(呼出す側)
)
import プログラム名(test_a)としますが、test_a.pyはtest_aフォルダに格納されているのでエラーは返さないものの起動しません。
8行目:次に、違う階層にある場合
test
main
a.py (実行中)
b.py(呼出す側)
)
test
main
a.py (実行中)
b.py(呼出す側)
)
import ファイル名(test_a).プログラム名(test_a)
from ファイル名(test_a) import プログラム名(test_a)
などと表記してインポートします。

こちらはタイトル名のインプット要求がされ、正常に起動しました。
これで無事test_a.pyをモジュールとしてインポートできたので、
13行目:val=float(input('数値を入力: ')) で任意の数字を入力し、22行目:pltfig()を使って図化します。
インポートしたモジュール名と関数名を「.」で区切って表記します。
a.pltfig(x,y,a.title)
見て分かる通り、関数だけでなく変数も「.」で区切れば参照することができます。
これを実行するとこのような図が展開されます。

今回はモジュール化したいプログラムとメインプロジェクトの階層構造によって適切にパスを追加してあげること、インポートの方法、関数の呼び出し方について説明しました。