PythonのコードをWebや書籍で調べると、
「if __name__ == ‘__main__’」という記述を見かけることはありませんか?
初心者のうちは、「良く分からないし難しそう…」
そう思って見なかったことにする人が多いようです。
しかし、正しく理解することでコードの理解が深まります。
また、自分でも使用することができるとコーディングの幅が広がります。
この記事では「if __name__ == ‘__main__’」を基本から理解し、
実例を交えて使い方を習得することができます。
初心者向けに丁寧な解説をしていますが、少し難しい内容となっています。
分かりにくい点があれば、コメントでお知らせください。
「if __name__ == ‘__main__’」の基本
Pythonでは、スクリプトファイルを直接実行した場合と、
モジュールとして他のスクリプトからインポートされた場合で、挙動が異なる場合があります。
このため、Pythonでは「if name == ‘main‘」を使って、
スクリプトファイルが直接実行された場合にのみ実行されるコードブロックを指定することができます。
具体的には、以下のように記述します。
if __name__ == '__main__':
# ここに直接実行した場合に実行されるコードを書く
このコードブロック内には、
通常スクリプトファイルを実行するために必要なコードを書きます。
例えば、ファイルからデータを読み込んで処理する、コマンドライン引数を処理する、関数を呼び出すというコードが含まれることが多いです。
一方で、このコードブロックの外にあるコードは、
他のスクリプトからインポートされた場合にも実行されます。
例えば、関数の定義やグローバル変数の定義などが含まれます。
このように、「if name == ‘main‘」を使うことで、
スクリプトファイルが直接実行された場合にのみ実行されるコードを指定することができます。
これにより、スクリプトファイルをモジュールとして他のスクリプトからインポートする際に、
不必要な処理が実行されることを防ぐことができるのです。
以上が、Pythonにおける「if name == ‘main‘」の使い方についての基本的な説明です。
具体例
テキストだけで説明しようとするとムズカシイことなので、具体例を用いて説明します。
例えば、以下のようなスクリプトファイル「example.py」があるとします。
def greet(name):
print(f"Hello, {name}!")
if __name__ == '__main__':
greet("John")
このスクリプトファイルでは、関数「greet」を定義しています。
そして、「if name == ‘main‘」のコードブロック内で、
この関数に引数「John」を渡して実行しています。
このスクリプトファイルを直接実行すると、以下のように出力されます。
Hello, John!
一方で、このスクリプトファイルを他のスクリプトからインポートする場合には、
「if name == ‘main‘」のコードブロック内のコードは実行されず、
関数「greet」が定義されるだけになります。
例えば、以下のようなスクリプトファイル「main.py」を作成し、
先程の「example.py」をインポートして使うことができます。
import example
example.greet("Mike")
このスクリプトファイルを実行すると、以下のように出力されます。
Hello, Mike!
このように、「if name == ‘main‘」を使うことで、
スクリプトファイルが直接実行された場合にのみ実行されるコードを指定することができます。
実用例①
以下のようなスクリプトファイル「example.py」があるとします。
このスクリプトファイルでは、
モジュールがインポートされる際に初期化処理を実行します。
def init():
"""モジュールの初期化処理"""
print("Initializing module...")
init()
def add_numbers(a, b):
return a + b
このスクリプトファイルを直接実行する場合、
モジュールがインポートされる際に「init」関数が呼び出されて初期化処理が実行されます。
Initializing module...
しかし、このスクリプトファイルが他のスクリプトからインポートされた場合にも、
「init」関数が呼び出されてしまいます。
そこで、「if name == ‘main‘」を使って、
直接実行された場合にのみ初期化処理を実行するように変更することができます。
def init():
"""モジュールの初期化処理"""
print("Initializing module...")
if __name__ == '__main__':
init()
def add_numbers(a, b):
return a + b
このように、「if name == ‘main‘」を使うことで、
モジュールがインポートされたときに不必要な処理が実行されることを防ぐことができます。
実用例②
続いて、テストコードの実行に用いた例をご紹介します。
以下のようなスクリプトファイル「example.py」があるとします。
このスクリプトファイルは、
数値を受け取って2倍にして返す「double」関数を定義しています。
def double(x):
return 2 * x
このスクリプトファイルを直接実行した場合には、何も実行されません。
しかし、このスクリプトファイルが他のスクリプトからインポートされた場合には、
「double」関数が定義されます。
このスクリプトファイルの機能をテストするために以下のようなテストコードを別のファイルに書いても良いですが、
このファイル自体でもテストコードを記述することができます。
def test_double():
assert double(2) == 4
assert double(5) == 10
assert double(0) == 0
print("All tests passed!")
if __name__ == '__main__':
test_double()
このスクリプトファイルを直接実行した場合には、
テストコードが実行されて、すべてのテストがパスしたことが表示されます。
実用例③
最後に、ウェブアプリケーション開発の際に「if name == ‘main‘」を使うことで、
開発とデバッグを容易にする方法をご紹介します。
以下は、Flaskフレームワークを使用して簡単なウェブアプリケーションを作成する例です。
from flask import Flask, request
app = Flask(__name__)
@app.route('/')
def index():
return 'Hello, world!'
@app.route('/greet')
def greet():
name = request.args.get('name', 'world')
return f'Hello, {name}!'
if __name__ == '__main__':
app.run(debug=True)
この例では、Flaskフレームワークを使用して、
ルートURLと「/greet」URLを持つ簡単なウェブアプリケーションを作成しています。
「/greet」URLには、クエリ文字列のパラメータ「name」が含まれており、
このパラメータを使用して、Webページに挨拶を表示しています。
このスクリプトファイルを直接実行する場合、
「if name == ‘main‘」ブロックが実行され、Flaskアプリケーションが起動します。
* Serving Flask app 'app'
* Debug mode: on
WARNING: This is a development server. Do not use it in a production deployment. Use a production WSGI server instead.
* Running on http://127.0.0.1:5000
Press CTRL+C to quit
* Restarting with stat
* Debugger is active!
* Debugger PIN: 493-782-302
ブラウザを起動すると、index関数が実行されます。
一方、以下のような他のPythonスクリプト「example.py」からFlaskアプリケーションをインポートする場合、このブロックは実行されません。
import app
app.index()
つまり、上記のexample.pyを実行しても何も起きないということです。
それは、このスクリプトファイルがモジュールとしてインポートされても「app.run(debug=True)」は実行されないため、Flaskアプリケーションが自動的に起動しないからです。
実用例から分かること
このように、「if name == ‘main‘」を使うことで、
ウェブアプリケーションの開発とデバッグを容易にすることができます。
また、このブロックを使用することで、
Pythonスクリプトファイルがモジュールとしてインポートされた場合に不必要な動作を防止することができます。
まとめ
いかがだったでしょうか。
「if name == ‘main‘」を説明するのは非常に難しいです。
少しでも理解できたと思っていただければ嬉しいです。
一番の近道は実際に使ってみることなので、簡単なサンプルを作って実行してみましょう!
それでは、ステキなPythonライフを!
Pythonについて詳しく知りたいという方は、こちらの書籍もおススメです。