↓ メインコンテンツへスキップ
  1. 補講/
  2. 補講01講 応用 Python プログラム/

Python スクリプトファイル

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

この出力結果のそれぞれの意味は以下の画像を確認してください(画像を押すと画像が更新されます)。

lsの実行結果のそれぞれの意味

このとき、先頭の -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 といった権限が与えられることが多いです。