読者です 読者をやめる 読者になる 読者になる

座敷牢日誌

都落ちした元SEがソフトウェアやネット関連のことを書いています

「#!/usr/bin/python」と「#!/usr/bin/env python」の違い

python

公開されているコードで、先頭にインタプリタの指定があった場合、だいたい次のどっちかだ。

見た感じでなんとなく想像はつくけど、どう違うのか調べてみた。pythonのメーリングリストのやり取りで、こんな解説を見つけた。

> 1)
> #!!/usr/bin/python
> 2)
> #!/usr/bin/env python
> など、2つのpythonの呼び出しがあるようですが
> 何か違うのでしょうか?

Unix 系のプラットフォームでは、ファイルの1行目に
#!/usr/bin/python
と書くと、2行目以降の内容が /usr/bin/python への入力として取り扱われます。

#!/usr/bin/env python
と書くと、/usr/bin/env python を実行したときに起動するプログラムへの入力
として取り扱われます。

#! 以降には、絶対パスを指定する必要があり、(1) の方法では
/usr/bin/python がないとエラーが出ます。(2) の方法では PATH のどこかに
python があれば動きます。多くのプラットフォームでは /usr/bin/env がある
ので (2) のほうが可搬性があります。

これは Python に限らず、perl でも、awk でも、標準入力から読み込む自作の
プログラムでも同じです。詳しくは Unix 関連の情報源をあたってみてください。

[Python-ml-jp 2466] /usr/bin/python と /usr/bin/env python (はじめまして&質問)

「#!/usr/bin/python」とした場合は、フルパスで指定されているpythonインタプリタを使って実行する。「#!/usr/bin/env python」では環境変数 PATHのなかに含まれているpythonを探して実行する、ということだ。

例えば、試しに環境変数PATHをクリアした状態で「env python」とすると、実行できなくなってしまう。

$ export PATH=
$ echo $PATH

$ env python
bash: env: そのようなファイルやディレクトリはありません
$ 

漠然とそんな感じだろうなとは思ってた。なぜ調べる気になったかというと、vimで「!#/usr/bin/env python」みたいなインタプリタ指定したファイルを開くと、ファイルタイプが「conf」に誤認識されてしまうことがたまにあったから。今やってみると、shでもbashでもpythonでも特に誤認識されるようなことはなかった。

広告を非表示にする