よくあるPythonの問題 - [4] __main__のないスクリプト

By JoeVu, at: 2023年1月13日20:40

Estimated Reading Time: __READING_TIME__ minutes

Các Vấn Đề Thường Gặp trong Python - [4] Các Script Thiếu `__main__`
Các Vấn Đề Thường Gặp trong Python - [4] Các Script Thiếu `__main__`

Pythonスクリプトは、特定のタスクを実行したり、特定の結果を得るために実行する必要があることがよくあります。しかし、スクリプトが正しく記述されていない場合、または__main__ステートメントが含まれていない場合、正しく実行できません。

 

この記事では、__main__がないスクリプトに関する一般的なPythonの問題と、それらの解決方法について説明します。

 

__main__とは何か

 

__main__ステートメントは、スクリプトが実行されたときに実行される特別なステートメントです。if __name__ == "__main__":行を使用すると、ファイルがスクリプトとして実行されたときにはコードを実行できますが、モジュールとしてインポートされたときには実行できません。

 

__main__に関する潜在的な問題とは何か


以下に、if __name__ == "__main__":の有無による例を示します。

 

script_1.py

 

def greeting(name):
    print(f"Hello {name}")

greeting("Joe")


script_2.py

 

import script_1

script_1.greeting("Snow")


実行

 

python script_1.py
python script_2.py


期待される出力は

 

Hello Joe
Hello Snow


しかし、実際の出力は

 

Hello Joe
Hello Joe
Hello Snow


理由script_1script_2でインポートされると、script_1のソースコードがすぐに実行されます。そのため、「Hello Joe」という行が結果に2回表示されます。


これを修正するには、if __name__ == "__main__":イディオムをscript_1.pyに追加する必要があります。

 

script_1.py

 

def greeting(name):
    print(f"Hello {name}")

if __name__ == "__main__":
    greeting("Joe")


script_2.py

 

import script_1

if __name__ == "__main__":
    script_1.greeting("Snow")


理由script_2.pyを実行すると、script_1.pyがインポートされますが、script_1.pyでは、__name____main__と等しくなく、__name__は現在「script_1」です。そのため、greeting("Joe")行は実行されません。

 

__main__を使用することによる追加の利点

 

  1. 意図しない実行の回避 – スクリプトのロジックが意図したときだけ実行されることを保証します。
     

  2. モジュールコードの促進 – スクリプト固有のコードを自動的に実行することなく関数をインポートできるようにすることで、再利用を容易にします。
     

  3. デバッグの改善 – インポートに干渉することなく、スクリプト内でテストケースを個別に実行するのに役立ちます。

 

結論


__main__ステートメントは、Pythonスクリプトを正しく実行するために必要な重要なコードです。__main__ステートメントがないと、スクリプトは実行できません。__main__ステートメントがないスクリプトを作成した場合は、スクリプトを実行可能にするために追加する必要があります。

 

参考文献

 

Tag list:
- Python
- Mistake
- Problem
- Script
- __main__

Related

Python

Read more
Python

Read more
Python

Read more

Subscribe

Subscribe to our newsletter and never miss out lastest news.