Python スクリプトな shebang、またの名を「実行可能な Python スクリプト」 (一応)

書いた気もするし書いてない気もするし。

最近無造作な Python スクリプトを初心者向け説明を省いて載っけてるんで、一度くらいは書いた方がいいのかなと思って。

「python hoge.py」とせずに実行したい(「/path/to/hoge.py」みたいに)場合にどうすりゃいいの、な話。実行可能形式検索パス(PATH)に含まれる場所に置いたら動いて欲しいのよ、てことね。

ワタシ個人としては、このブログにあげたあとは「そうしてる」(実行可能にしてる)けれど、「常識っしょ」と普段は思うので、イチイチ毎度 shebang 付けて紹介してない。

最もシンプルな説明は公式ドキュメントにもある

公式ドキュメントの言う「BSD 風の Unix システムでは」が真実だったのは実際は今から20年近く前までの話。昔々、Unix が「AT&T Unix」と「BSD Unix」の(ほぼ)2つだった頃、確かに shebang は、BSD Unix の特権だった。ので「AT&T Unix でも動作するシェルスクリプト」なんてのを書くには色々工夫が必要だった。実際アタシもやってたんだけど完全に失念。ほんとに20年前だからね。確か「:」コマンド、「exec」コマンドを駆使してたような…。

そんな昔話はともかくとして、今は、99% の「Unix ライク」な環境で shebang が使えると思っておいて大丈夫。なぜなら「言うても Linux も BSD の直接の子供(コードベースは一切共通してないとしても)」だから。:

1 #! /bin/sh
2 echo "$@"

移植性に関して、「#!」の後にワタシが必ず空白を入れるのは実は「XENIX」対策だったりする。癖でね、抜けんのよ。つーか Microsoft が Unix 互換 OS 作ってたなんて、今となっては知らん人の方が多いんだろうな…。

ほかにも移植性問題は本当はとっても多くてね、この shebang。WikiPedia に割と書かれてるね。個人的に使う場合はだいたいこう書いてます:

1 #! /bin/env python
2 # this is a python script.
3 import os
4 print(os.listdir("."))

細かな説明は Unix コマンド(env)の解説が必要なんで割愛するけれど、「/usr/bin/env」でなく「/bin/env」なのにも理由があって、/usr/bin/env がないシステムを知ってるから。(もっと言えば、フルパス指定しない「#! env python」がダメなシステムがあるのも知っている。)

ただこの書き方も、distutils がスクリプトをインストールする際に「自動で書き換えてしまう」ので、人に配布するものを開発してるなら、気にしないのが身のため。実際は Windows の場合例えばこんな風に書き換えられたものがインストールされる:

 1 #!c:\Python35\python.exe
 2 #
 3 # The Python Imaging Library
 4 # $Id$
 5 #
 6 # this demo script creates four windows containing an image and a slider.
 7 # drag the slider to modify the image.
 8 #
 9 
10 import sys
11 
12 if sys.version_info[0] > 2:
13     import tkinter
14 else:
15     import Tkinter as tkinter
16 
17 from PIL import Image, ImageTk, ImageEnhance
18 # ...snip...

ヒドいよね、とは思うけれど、「適切な Python バージョンを明示する」必要がある都合、ひとまずは最善、なのね、これが。

当然のことながら、この shebang の魔法が有効なのは「Unix もどき」環境だけの特権。世界一美しい OS のDOMESTOSMSDOS には効かない。多くの OSS が Windows 版では生の python スクリプトでなく EXE をインストールしようとするのは無論これが理由。そうする方法は色んな OSS 、例えばこれがやってる。真似すればすぐに出来るはず。

ワタシは日常的に MSYS (もしくは MSYS2)使いなので、「自分用」のものがイチイチ EXE になってても別に嬉しかない。初心者には誤解されやすいんだけれど、EXE になったら速い、てことはなくて、「BOGUSMS DOS から実行出来るようにするためだけに」EXE の形に「包んでいる」だけなので、実際は Python インタプリタが丸ごと動く。つまり全く速くならない。

なんにせよ本当は「初心者ほど」MSYS (もしくは MSYS2)あるいは cygwin を入れといた方がいいと思うよ、修行僧じゃないんだから。(経験上初心者ほど「新しいものに恐れ戦いて自ら首を絞め」がちで、何度言い聞かせても「Python 学習だけでいっぱいいっぱいな上に Unix なんか難し過ぎて、ハマるのわかってるんで自ら選んで DOS ってるんです!」と頑なに DOS に執着し続ける。あぁあ、DOS が難し過ぎるとは考えないんだ…。

ともあれ「Unix もどき」さえ使えるなら、shebang を記述したスクリプトを、「見える場所」に、例えば Windows の CPython 2.7 だと c:/Python27/Scripts に置くのがラクチン。そうしとけば、そこに置いた hoge.py はコマンドラインから、どこにいても:

1 me@host: ~$ hoge.py

と実行出来る。

実際は「BAT ファイルに包む」ことで「実行可能なスクリプト」を実現出来たりする。そして半数の OSS はそれを選んでいる。けれどこれはひっじょーに迷惑なので、正直やめて欲しい。これをやられると MSYS から起動するのがとーーーーーってつもなく不愉快になる。つまり「CMD.EXE」をわざわざ介在させる必要がある。てわけで説明しないし、「ええもん」として紹介するのは是非ともやめていただきたい。(どうしても必要なことはそりゃあるのであって、もしそうなら「苦渋」感満載で書くべし。)