Python学習チャンネル by PyQ

Pythonのオンライン学習プラットフォームPyQのオフィシャルブログです

Pythonのif __name__ == "__main__" とは何ですか?への回答

f:id:nana_yu:20180502143157p:plain

こんにちは。 id:hirokiky です。

今日も皆さまからPyQメールサポートにご質問いただいた内容で多かった質問と回答をご紹介します。 この質問はとくに疑問になりやすい点なのではないでしょうか。

pyq.jp

質問

Pythonの if __name__ == '__main__': は何のためにあるものですか?

回答

はい。こちらはよくPythonプログラムに書かれていますね。 書かれることは多い割には、不思議の多いif文ですね。「これは『おまじない』なので気にしないでください」と言って回答を終わらせてしまうのは簡単ですが、それでは悲しいので、少し長くなりますが回答いたします。

一言で言うと、 if __name__=='__main__': はこのPythonファイルが「python ファイル名.py というふうに実行されているかどうか」を判定するif文です。

まず、以下の hello.py という if __name__ == '__main__'のないPythonファイル を先に見ていきましょう。

def main():
    print("Hello")

main()

この hello.py のように if __name__ == "__main__" 無しでも、 python hello.py とすることで「Hello」と表示するPythonファイルは作れます。

$ python hello.py
Hello

ですがこの hello.py の場合、外部から import hellohello.py をインポートした際にも 「Hello」と表示されてしまいます

>>> import hello  # この時点で「Hello」が表示されてしまう
Hello
>>>

Pythonでは、インポートされたファイルの中身は実行されます。 ですので単にインポートしただけなのに main() => print("Hello") と処理が実行されてしまいます。

単にPythonファイルをインポートして、main関数を再利用しようとしただけなのに実行まで勝手にされてしまうのは困ります。 import refrom datetime import datetime とするだけで自動でプログラムが動いたり表示されたりすると少し迷惑ですよね。

インポートされた際にプログラムが動かないようにするために、以下のように if __name__ == "__main__": というif文を書きます。

def main():
    print("Hello")

if __name__ == "__main__":
    main()

このif文の内部は import された際には実行されません。

>>> import hello
>>>

インポートで実行されない理由

Pythonには __name__ という特殊な変数があります。

この変数には、このPythonファイルのモジュール名が文字列で入っています。 import hello とされた場合、 hello.py 内部での __name__"hello" になります。 (Pythonにより自動的にこの変数は入れられます)。

python hello.py のようにプログラムを実行した場合、 hello.py の内部の __name__ 変数は "__main__" という文字列になります。 この "__main__" という文字列はPythonファイルをスクリプトとして直接実行した場合に自動で設定されます。

  • import hello した:hello.py 内部で __name__"hello" という文字列になる
  • python hello.py した:hello.py 内部で __name__"__main__" という文字列になる

ですので、 if __name__ == "__main__" という if文を使うことで、「この hello.pypython hello.py のように実行された(== importされたことで動作したのではない)」と判定できます。

if __name__ == '__main__':
    ...

PyQ の関数のクエストでもimportなどについて学習できますので参考にしてください。

pyq.jp

おわりに

以上です。 PyQメールサポートではこのようなPythonの不思議についてやプログラム、設計の意図や勘所についてもお答えしております。 プログラミング・Python学習を集中して無駄なく行なうためにお手伝いいたします。

あわせて学習

「==」と「in」の使い分けについて紹介します

blog.pyq.jp

Copyright ©2017- BeProud Inc. All rights reserved.