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
といった権限が与えられることが多いです.