書いた気もするし書いてない気もするし。
最近無造作な 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」をわざわざ介在させる必要がある。てわけで説明しないし、「ええもん」として紹介するのは是非ともやめていただきたい。(どうしても必要なことはそりゃあるのであって、もしそうなら「苦渋」感満載で書くべし。)