シバンを使用し#!/usr/bin/env python
てスクリプトを実行するとき、システムはどの方法python
を使用するかをどのように知るのですか 私が探している場合python
、環境変数にbinパス私は何を見つけることはありません。
env | grep -i python
シバンを使用し#!/usr/bin/env python
てスクリプトを実行するとき、システムはどの方法python
を使用するかをどのように知るのですか 私が探している場合python
、環境変数にbinパス私は何を見つけることはありません。
env | grep -i python
回答:
(「シャープバン」からの)シバンライン#!
は、カーネルによって処理されます。カーネルは、などの環境変数について知りたくありませんPATH
。したがって、shebang行の名前は、実行可能ファイルへの絶対パスである必要があります。また、スクリプト名の前にその実行可能ファイルに渡す追加の引数を指定することもできます(システムに依存する制限付きでここでは説明しません)。たとえば、Pythonスクリプトの場合、指定できます
#!/usr/bin/python
最初の行で、スクリプトを実行すると、カーネルが実際に実行され/usr/bin/python /path/to/script
ます。しかし、それは便利ではありません。コマンドのフルパスを指定する必要があります。あなたは何を持っている場合python
では/usr/bin
いくつかのマシン上や/usr/local/bin
他の人に?それとも、自分の設定したいPATH
との/home/joe/opt/python-2.5/bin
パイソンの特定のバージョンを使用するように?カーネルはPATH
ルックアップを行わないため、カーネルでコマンドを実行し、次のコマンドで目的のインタープリターを検索しますPATH
。
#!/fixed/path/to/path-lookup-command python
それpath-lookup-command
は引数として実行可能ファイルの名前を取り、それを調べてPATH
実行する必要があります:カーネルが実行されます/fixed/path/to/path-lookup-command python /path/to/script
。それが起こると、env
コマンドはまさにそれを行います。その主な目的は、異なる環境でコマンドを実行することですが、でコマンド名を検索する$PATH
ため、ここでの目的には最適です。
これは公式には保証されていませんが、で提供さenv
れている歴史的なUnixシステム/usr/bin
と最新のシステムは、の広範な使用のために正確にその場所を保持してい#!/usr/bin/env
ます。したがって、実際には、ユーザーのお気に入りのPythonインタープリターがスクリプトを実行する必要があることを指定する方法は次のとおりです。
#!/usr/bin/env python
env
とwhich
?PATH環境から最も適格な実行可能ファイルも取得します。
which
は実行可能ファイルを見つけ、そのパスを出力します。env
最初の引数で指定されたプログラムを見つけて実行し、残りの引数を渡します。
env
評価版ですwhich
。
そう、実行:
env | grep PATH
$ PATHはディレクトリのリストです。Unixは、「python」が見つかるまで、ディレクトリのリストを順番に調べます。
「which」コマンドを使用して、検出されたディレクトリを確認できます。
which python
sys.path
有効化されたenv $ env python3
(['', '/home/user/test', '/usr/lib/python3.4', '/usr/lib/python3.4/plat-x86_64-linux-gnu', '/usr/lib/python3.4/lib-dynload', '/home/user/.local/lib/python3.4/site-packages', '/usr/lib/python3.4/site-packages', '/usr/local/lib/python3.4/dist-packages', '/usr/lib/python3/dist-packages']
)と./env/bin/python3
(['', '/home/user/test', '/usr/lib/python3.4', '/usr/lib/python3.4/plat-x86_64-linux-gnu', '/usr/lib/python3.4/lib-dynload', '/home/user/test/env3/lib/python3.4/site-packages']
)の間でPythonに違いが見られます。