こんにちは。 id:hirokiky です。
今日も皆さまからPyQメールサポートにご質問いただいた内容で多かった質問と回答をご紹介します。 この質問はとくに疑問になりやすい点なのではないでしょうか。
質問
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 hello
と hello.py
をインポートした際にも 「Hello」と表示されてしまいます
>>> import hello # この時点で「Hello」が表示されてしまう Hello >>>
Pythonでは、インポートされたファイルの中身は実行されます。
ですので単にインポートしただけなのに main()
=> print("Hello")
と処理が実行されてしまいます。
単にPythonファイルをインポートして、main関数を再利用しようとしただけなのに実行まで勝手にされてしまうのは困ります。
import re
や from 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.py
は python hello.py
のように実行された(== importされたことで動作したのではない)」と判定できます。
if __name__ == '__main__': ...
PyQ の関数のクエストでもimportなどについて学習できますので参考にしてください。
おわりに
以上です。 PyQメールサポートではこのようなPythonの不思議についてやプログラム、設計の意図や勘所についてもお答えしております。 プログラミング・Python学習を集中して無駄なく行なうためにお手伝いいたします。