メインコンテンツへスキップ
  1. 補講 応用 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 と実行することもできます. このとき,シェバンは無視され,python3script.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 といった権限が与えられることが多いです.