プログラミング素人のArduino

技術屋の末端。プログラミングは専門外。 電気回路も専門外です。 コードに間違いなど見つけられたら、気軽にコメントください。 VC#、ラズパイ始めました。

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()の起動条件として設定します。