だぐざの大釜

データサイエンス他いろいろ学んだ備忘録

pythonプログラムのはじめの「#!」や「if __name__ = "__main__"」について

仕事上、データ分析でpythonを使用してるが、より良いコードがかけるように改めて学び直しています。

Hello, World!を出力するプログラム

#!/usr/bin/env python
# -*- coding; utf-8 -*-

def main():
    print("Hello, World!")


if __name__ = "__main__":
    main()

よくあるプログラミング入門の最初のステップです。 "Hello, World"を出力するだけなのになぜこんなにも長いのでしょうか。

1行目: シバン(Shebang

#!/usr/bin/env python

ソースコードの一行目はシバン(Shebang)といいます。

シェルがファイルを実行可能ファイルを扱うときに、書かれたプログラムを使って処理するためのものです。

/usr/bin/python のように特定のパスのpythonをしておらず、/usr/bin/env経由でpythonを指定することで、パスに依存せずに呼び出すことができます。

シバンの指定があるソースコードは、ファイルの実行権限を付与することで直接実行できます。

$  cmod +x helloworld.py
$ ./helloworld.py
Hello, World!

2行目: エンコード宣言

# -*- coding; utf-8 -*-

2行目はエンコード宣言と呼ばれ、ソースコードをどの文字コードを使って解釈すればよいかを指定します。

日本語などマルチバイト文字を含む場合に特に必要です。

main関数

def main():
    print("Hello, World!")

main()関数として、"Hello, World"を出力します

特殊属性

if __name__ = "__main__":
    main()

__name__は特殊属性と呼ばれ、モジュールの名前が文字列で格納されています。

ここでは、__name__という名前の変数の内容が"__main__"という文字列と一致しているかをチェックして、一致する場合はmain()関数を実行しています。

if name = "main" とはなにか?

ここで、モジュールとは、実のところ単なるPythonファイル(*.py)そのものです。例えばhelloworld.pyというファイルであればhelloworldモジュールとなります。モジュールは別のモジュールなどからインポートして使うことができます。

実は、モジュールがスクリプトとして実行されるとき、__name__には__main__という文字列が格納されています。一方で、モジュールとして実行される場合は、"name"という文字列が格納されています。つまり、main()関数をモジュールとしてインポートして使う場合の配慮のため、if __name__ = "__main__":をつけています。

参考

www.amazon.co.jp

note.nkmk.me