if __name__ == '__main__':#
Pythonのスクリプトファイルの中に、このような文があることがあります。
例えば、次のような Python スクリプトが argv_printer2.py という名前で保存されているとします。
#! /usr/bin/python3
# argv_printer2.py
import sys
def print_argv(argv):
for index, arg in enumerate(argv):
print(f"引数{index}: {arg}")
if __name__ == '__main__':
# 何か処理が書かれている。
print_argv(sys.argv[1:])このスクリプトをターミナル上で実行すると、if __name__ == '__main__': の中の処理が実行されます。
一方、他のファイルから参照して、argv_printer2.pyを読み込んだとき、if文の中の処理は実行されません。
このif文はターミナル上で実行したかどうかを判定するために使われます。
このような __name__ や __main__ という変数や文字列は、特殊変数 と呼びます。
Pythonの公式ドキュメントにも書かれていますので、より詳細はそちらを参照してください。
シェバン#
上記のargv_printer2.pyの1行目を確認しましょう。
#!から始まる行が確認できます。
この行はシェバン(shebang)と呼ばれ、スクリプトファイルの先頭に書かれます。
このシェバンは、必ず1行目である必要があります。
シェバンより前には何も書いてはいけませんし、空行も入れてはいけません。
通常、スクリプトファイルは、python3 script.py のように script.py
をどのようなプログラム(ここではpython3)に読み込ませて実行するかを指定する必要があります。
一方、シェバンが書かれているスクリプトファイルは、./script.py というようにスクリプト名だけで実行できます。
script.pyの1行目に #! /usr/bin/python3 と書かれているとしましょう。
このとき、ターミナル上で ./script.py と実行すると、/usr/bin/python3 script.py が実行されることになります。
もし、/usr/bin/python3 が存在しない場合は、エラーが出ます。
ですので、皆さんそれぞれの環境で、python3 がどこにあるかを確認して、適切なパスを指定してください。
ターミナル上で、which python3 と実行すると、python3 のパスが表示されます。
なお、シェバンを書いていても、python3 script.py と実行することもできます。
このとき、シェバンは無視され、python3 でscript.pyが実行されます。
実行可能ファイルにする#
ファイル属性の確認#
上では、シェバンを適切に書くと、ターミナル上で ./argv_printer2.py arg1 arg2 arg3 と実行することができますと書きました。
が、実際に実行してみると、おそらく zsh: permission denied: ./argv_printer2.py というエラーが出るでしょう(bash: ./argv_printer2.py: Permission deniedかもしれません)。
./argv_printer2.py と実行するためには、 実行権限 を与える必要があります。
ls -l argv_printer2.pyを実行すると、次のような出力が得られるでしょう(数値は以下の例と異なっていても構いません)。
$ ls -l argv_printer2.py
-rw-r--r--@ 1 tamada staff 252 9 9 08:55 argv_printer2.pyこの出力結果のそれぞれの意味は以下の画像を確認してください(画像を押すと画像が更新されます)。

このとき、先頭の -rw-r--r-- に注目してください。
この文字列は、ファイルの種類とアクセス権限を表しています。
-rw-r--r-- のうち、先頭の1文字が - であるため、ファイルであることがわかります。
この先頭の1文字は、ディレクトリの場合は d になります。
アクセス権限は、3つのグループに分かれています。
最初の3文字は所有者の権限、次の3文字はグループの権限、最後の3文字目はその他のユーザの権限を表しています。
そして、その3文字は先頭から、読み取り権限(r)、書き込み権限(w)、実行権限(x)を表しています。
アルファベットが書かれているときは、その権限があることを表し、-が書かれているときは、その権限がないことを表します。
ですので、-rw-r--r-- は、所有者には読み取りと書き込みの権限があり、グループとその他のユーザには読み取り権限のみがあることを表しています。
このとき、実行権限がないため、./argv_printer2.py を実行するとエラーが出てくるわけです。
実行権限を与える#
実行権限を与えるには、chmod というコマンドを使います(CHange MOde)。
chmod には、数値で権限を指定する方法と、記号で権限を指定する方法があります。
ここでは、記号で権限を指定する方法を紹介します。
chmod の記号での権限指定は、誰に、どのような権限を、与えるか、取り除くかを指定します。
$ chmod <誰に>+<権限> <ファイル名> # 権限を与える場合
$ chmod <誰に>-<権限> <ファイル名> # 権限を取り除く場合<誰に> には、以下の文字を指定します。
| 記号 | 意味 |
|---|---|
u | 所有者(user) |
g | グループ(group) |
o | その他のユーザ(other) |
a | 全て(all) |
<権限>は rwx の好きな文字を組み合わせて指定します。
r は読み取り権限、w は書き込み権限、x は実行権限を表します。
$ ls -l argv_printer2.py # 権限を確認する。
-rw-r--r--@ 1 tamada staff 252 9 9 08:55 argv_printer2.py
$ chmod a+x argv_printer2.py # すべてのユーザに実行権限を与える。
$ ls -l argv_printer2.py # x が追加されていることを確認する。
-rwxr-xr-x@ 1 tamada staff 252 9 9 08:55 argv_printer2.py
$ chmod a-rwx argv_printer2.py # すべての権限を取り除く。
$ ls -l argv_printer2.py # 権限がなくなっていることを確認する。
----------@ 1 tamada staff 252 9 9 08:55 argv_printer2.py
$ cat argv_printer2.py # 読み取り権限がないので、ファイルの内容が表示できない。
cat: argv_printer2.py: Permission denied
$ chmod u+rwx argv_printer2.py # ユーザにのみ、読み取り、書き込み、実行権限を与える。
$ ls -l argv_printer2.py
-rwx------@ 1 tamada staff 252 9 9 08:55 argv_printer2.py一般的には、実行権限が不要であれば、-rw-r--r--、
実行権限が必要であれば、-rwxr-xr-x といった権限が与えられることが多いです。
