問題の2番目の部分が優先順位が高いのはなぜですか?

問題の2番目の部分が優先順位が高いのはなぜですか?

pythonデフォルトの実行可能ファイルとは異なる実行可能ファイルで実行されるPythonスクリプトがあります。

/usr/bin/mydir/mybins

私が実行すると、次のようになります。

$which python
/usr/bin/python

実行中の場合run.py

# cat run.py
#!/usr/bin/env /mydir/mybins/python

import os
import sys

print(u"Python executable: %s" % sys.executable)
print(u"From within Python PATH=%s" % os.environ[u"PATH"])

わかりました。

# ./run.py
Python executable: /mydir/mybins/python
From within Python PATH=/usr/bin:... (and no /mydir/mybins)

なぜ?これは意図的に設計されていますか?/usr/bin/pythonコードを変更せずにどのように使用できますか?

答え1

ユーティリティenvはその引数をコマンドとして実行します。

パラメータいいえのようなパスが与えられると、env pythonコマンドは を探します$PATH。これは通常、envスクリプトの-line内で使用するときに必要なものです。#!

引数の場合はいパスが与えられたら、そのパスでコマンドを実行します。

- ラインでは、#!特定のPythonインタプリタを実行します。絶対に$PATH検索されません。あなたもそのようなことがあったでしょう。

#!/mydir/mybins/python

なぜなら、そのenvビットは実際に何もしないからです。

効果が$PATH機能するには、次のようにします。

#!/usr/bin/env python

pythonこれで見つかった最初の実行可能ファイルが使用されます。$PATH

#!別のアプローチは、コマンドラインで明示的なインタプリタを使用してスクリプトを実行して -line を完全にバイパスすることです。

$ python run.py

または、

$ /usr/bin/python run.py

答え2

Kusalanandaが言ったように、特別に他のPythonを指すようにコードを変更せずにそれを使用する/mydir/mybins/python方法を知りたいですか?/usr/bin/python

その場所にシンボリックリンクを削除して作成するだけ/mydir/mybins/pythonです。/usr/bin/python強くこれはお勧めできませんが、スクリプトでハッシュバンを変更することをお勧めします。

関連情報