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

@Satoh_D no blog

大分にUターンしたので記念に。調べたこととか作ったこととか食べたこととか

Pythonのファイルによく書かれている /usr/bin/env python について調べた

regular python

Sublime Textのプラグイン作りがきっかけで、Pythonの勉強を始めました。
書籍を片手に写経をする日々。
Python面白いよPython

書籍のコードを眺めていると、1行目に必ず #!/usr/bin/env python という記述が。
おまじないだと思ってスルーしていましたが、気になりすぎて調べましたのでメモ。

#!/usr/bin/env pythonの正体

調べてみると、Wiki)に載っていました。
シェバンというインタプリタのパスを記述するものらしいです。

記述方法は #!で開始し、インタプリタへのパスを絶対パスで記述しなければなりません。 これを記述することでシェバンによってPythonが起動し、Pythonにファイルの内容を渡し、処理される、とのことらしいです。

気になっていたものがシェバンということがわかりました。
意外とあっさりと終わったので、ついでシェバンに書かれているパスについても調べました。

/usr/bin/env は何を指すのか

/usr/bin まではわかるのですが、 /env が何を指すのかがわかりませんでした。
これについても調べたら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) のほうが可搬性があります。

これによると、/usr/bin/ のようにディレクトリを1つだけ指定するより、
PATHに記述されているディレクトリを見るほうがpythonが見つかる可能性が高いのでそう指定する、ということでしょうかね。

おまじない的にスルーしていましたが、結構大事なことが記述されていたんですね。
これからはちゃんと意味がわかった上で記述できますね。
分からない上で書くのと分かった上で書くのは全然違いますよね。

参考にしたサイト