pythonの if name == ‘main’:は何のためにあるのか。
一言で言うと、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”)と処理が実行されてしまう。
インポートされた際に、プログラムが動かないようにするために、以下のように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__':
...