プログラミング素人のはてなブログ

プログラミングも電気回路も専門外の技術屋の末端が勉強したことや作品をアウトプットするブログ。コードに間違いなど見つけられたら、気軽にコメントください。 C#、Python3、ラズパイなど。

Pythonの  "if __name__ == ‘__main__’:" とモジュール化

pythonでよく使う処理を関数として作成し、他のプログラムから呼び出すことができます。

main.py

import a  #a.pyをモジュールとして読み込む
import b  #b.pyをモジュールとして読み込む

a.function()
print("a is done.")
b.function()
print("b is done.")

a.py

print("start a.")
def function():
  print("This is a.")
if __name__ == ‘__main__’:
  print("a is main.")
  function()

b.py

print("start b.")
def function():
  print("This is b.")
if __name__ == ‘__main__’:
  print("b is main.")
  function()

このように、3つのpythonプログラムを作成し、同じフォルダに格納します。
a.py を実行すれば、

start a.
a is main.
This is a.

という風に実行されます。b.pyも同様。

main.py を実行すると、main.pyが実行され、a.pyとb.pyが呼び出されます。

start a.
start b.
This is a.
a is done.
This is b.
a is done.

しかし、単独にa.pyとb.pyを実行したときと異なり、main.pyを実行したときは、"a is main."、"b is main."は実行されません。
これは、"if __name__ == '__main__':"の中にあるためです。
"if __name__ == '__main__':"は直接a.pyまたはb.pyを実行したときに実行されます。

qiita.com

一方、main.pyを見ると

a.function()
print("a is done.")
b.function()
print("b is done.")

a.function()、b.function()と直接、a.py、b.pyのfunction()を実行しているように見えますが、
実は、これらの前に記述されている

print("start a.")、 print("start b.")は実行されます。

実は、

import a  #a.pyをモジュールとして読み込む
import b  #b.pyをモジュールとして読み込む

#a.function()
print("a is done.")
#b.function()
print("b is done.")

とすると、

start a.
start b.
a is done.
b is done.

モジュールとして呼び込むと、その時点で、
if __name__ == ‘__main__’:
以外の部分が実行されるのです。

通常、pythonのプログラムを同時に複数実行することはできませんが、このようなことに気をつけさえすれば、main.py(親プロセスと呼ぶ)から呼び出すことで、2つ以上のプログラムを実行させることができます。
それぞれの起動条件はmain.pyの中でfunction()の起動条件として設定します。