LoginSignup
8
4

More than 5 years have passed since last update.

pythonメモ:モジュール化:__name__ == '__main__'の使い方

Posted at

動機

pythonのスクリプトでよく見かける、

pseudo.py
if __name__ == '__main__':

がどういうものか分からなかったため。

モジュール化

こちらを参考にさせていただきました。
http://programming-study.com/technology/python-if-main/

pythonではよく他のスクリプトで定義されたものを引っ張ってきて使うことがありますよね。ライブラリをimportとか。自分で定義した関数を別のスクリプトにしておいて、モジュールとしてインポートするということも(今はできていませんが)ゆくゆくやりたい、そんなときに役立つもののだとか。

上記のif分にある__name__はスクリプト実行時に自動的に作成される変数で、スクリプトを直接実行したときには、__name__には__main__という名前が格納されます。

すなわち上記のif文は、スクリプトがシェルから直接実行されたかどうかで分岐するということですね。

以下のように、if文の内と外にそれぞれ実行文があるスクリプトを書いてみました。

name_is_main.py
def func(a,b):
  return a + b

print('MY NAME IS ' + __name__)

if __name__ == '__main__':
  print('hello!')
  print(func(3,4))

実行結果:
MY NAME IS __main__
hello!
7

name_is__not_main.py
import name_is_main as nim

print('my name is' + __name__)

if __name__ == '__main__':
  print('world!')
  print(nim.func(7,8))

実行結果:
MY NAME IS name_is_main
my name is __main__
world!
15

name_is_main.pyでは、そのまま__name__に__main__が入り、if文の中身も実行されました。

name_is_not_main.pyでは、インポートしたname_is_main.pyのif文外のprint文も実行されてしまいました。インポートしたname_is_main.pyには、スクリプト名であるname_is_mainが__name__に格納されています。
一方で、name_is_not_main.py自身の__name__には__main__が格納されました。

上記のように、インポートするスクリプトに余計な記述があると、インポートした側で勝手に実行されてしまうんですね。

使い道?

参考にさせていただいたサイトでは、if __name__==__main__: の使い道として、モジュールの動作をテストするスクリプトを書いておくことが紹介されていました。
なるほど。

テスト以外では、どのような使い方がされているのでしょうか...。

モジュール化するつもりのないスクリプトを書いている時、「この関数は他のところでも使えそうだからモジュール化を考えるか...」となったら、皆さんどうしているのでしょうか?その時点で、関数は別のスクリプトに移すのか、それとも上記のようなif文を用いることにして、スクリプト内にそのまま残しておくのか。

8
4
2

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
8
4