よくある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__`](/media/filer_public_thumbnails/filer_public/8b/2f/8b2f3f68-2788-4ae3-a044-4b46b365a99e/python-mistake-script-without-main.jpeg__1500x900_q85_crop_subsampling-2_upscale.jpg)
![Các Vấn Đề Thường Gặp trong Python - [4] Các Script Thiếu `__main__`](/media/filer_public_thumbnails/filer_public/8b/2f/8b2f3f68-2788-4ae3-a044-4b46b365a99e/python-mistake-script-without-main.jpeg__400x240_q85_crop_subsampling-2_upscale.jpg)
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_1がscript_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__
を使用することによる追加の利点
-
意図しない実行の回避 – スクリプトのロジックが意図したときだけ実行されることを保証します。
-
モジュールコードの促進 – スクリプト固有のコードを自動的に実行することなく関数をインポートできるようにすることで、再利用を容易にします。
-
デバッグの改善 – インポートに干渉することなく、スクリプト内でテストケースを個別に実行するのに役立ちます。
結論
__main__ステートメントは、Pythonスクリプトを正しく実行するために必要な重要なコードです。__main__ステートメントがないと、スクリプトは実行できません。__main__ステートメントがないスクリプトを作成した場合は、スクリプトを実行可能にするために追加する必要があります。
参考文献