別のPythonファイルの関数を実行する
開発規模が大きくなってくるとPythonのファイル「.py」を複数に分けて管理する必要が出てきます。例えば以下シチュエーションの場合です。
何が書いてあるかがわかりにくいと思うのでノートを事例に書いてみます。
Pythonのプログラムを書くとき、別のノート(.pyファイル)に関数(お手伝いさん)を書いておくといろいろな良いことがあります。ここで言う「別のノートに書く」とは、コンピューターの中で別の場所にコードを保存することを意味します。これが良い理由は次の通りとなります。
実際に2つのPythonファイルを用意して実行してみましょう。
サンプルコード
受け取ったメッセージをコンソールにprintする関数を作ります。以下ソースをvs codeに「msg_test.py」として保存してください。
def print_msg(msgstr):
"""
受け取ったメッセージをprintで表示します。
引数:
msgstr(str): 受け取ったメッセージ
出力:
標準出力に挨拶のメッセージを表示します。
"""
print(msgstr)
############################################
# 関数のテスト
print_msg("こんにちは")
以下のような画面となっていればOKです。
ターミナルへ以下のように入力します。
python msg_test.py
以下のように「こんにちは」と出力されます。
別のファイルから呼び出す。
別ファイル「main.py」ファイルを作成して、以下ソースを貼り付けします。
from msg_test import print_msg # msg_test ファイルから print_msg 関数をインポート
# テストデータ
test_data = "これはテストでメッセージを作成するプログラムです。"
# メッセージを送ってprint_msg関数から出力する。
print_msg(test_data)
以下のような画面となっていればOKです。
ターミナルへ以下のように入力します。
python msg_test.py
以下のような結果になると思います。
「main.py」ファイルの1行目from msg_test import print_msg
の処理で、「msg_test.py」のprint_msg
関数を読み込みして処理できるようにしています。
ここでおかしいのは以下のように関数呼び出ししたにも関わらず「こんにちは」が出力されているところです。
この理由はmsg_test.py読み込みしたときに自動実行される振る舞いをするためです。
これを避けるにはPython では__name__
という特別な変数がありこれは現在のスクリプトの名前を格納します。スクリプトが直接実行されると__name__
は "__main__"
に設定されます。しかし、スクリプトが他のスクリプトからインポートされると__name__
はそのスクリプトのファイル名(拡張子 .py
を除く)に設定されます。
記載してもわかりずらいので、プログラムを直してみましょう。
「msg_test.py」を以下のサンプルコードに変更します。15行目にif __name__ == "__main__":
が追加されただけです。
def print_msg(msgstr):
"""
受け取ったメッセージをprintで表示します。
引数:
msgstr(str): 受け取ったメッセージ
出力:
標準出力に挨拶のメッセージを表示します。
"""
print(msgstr)
############################################
# 関数のテスト
if __name__ == "__main__":
print_msg("こんにちは")
この状態で「main.py」を実行すると以下の通りとなります。
ですので、関数を作成してテストを行う場合にはif __name__ == "__main__":
を入れてテストすることをお勧めします。
importの書き方を変える
「main.py」でimportを書きましたが以下のように変更することも可能です。
この場合1行目は「msg_test.py」すべてをimportするという意味となり7行目でmsg_test.print_msg(test_data)
というようにprint_msg
関数を指定して呼び出ししています。この書き方のメリットは1つの.pyファイルの中にある複数の関数を利用したい場合に便利となります。
import msg_test # msg_test インポート
# テストデータ
test_data = "これはテストでメッセージを作成するプログラムです。"
# メッセージを送ってprint_msg関数から出力する。
msg_test.print_msg(test_data)
最後に
以上が別ファイルのPythonファイルの関数を実行する例となります。いろいろな関数を組み合わせてプログラムを作成する場合に必須の考え方となりますので覚えておいてください。
コメント