web-dev-qa-db-ja.com

python Shebangにpython3を使用させる方法は?

Shebang _#!/usr/bin/env python_を使用するサードパーティスクリプトがあります。

pythonのドキュメントによると、これはPython v2とPython v3の両方に適したスクリプトの正しい形式です( https://docs.python.org/3/using/windows.html#Shebang-lines )。

私のUbuntu(WSL)にはPython 3のみがインストールされています:

_~❯ which python
~❯ which python3
/usr/bin/python3
_

これをパスに追加しました。これには、_~/.bashrc_に以下を追加し、それをソーシングします。

_export PATH=/usr/bin/python3:${PATH}
export PY_PYTHON=3  # also added this for good measure, but no joy
_
_~❯ . ~/.bashrc
~❯ env | grep PATH
PATH=/home/me/.local/bin:/home/me/bin:/usr/bin/python3:/opt/gradle/gradle-5.3.1/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games:/snap/bin
_

しかし、このスクリプトを実行すると、Pythonが見つからないというメッセージが表示されます。同じシバンとprint("Hello")を含む短いテストファイルfooを作成しました:

_~❯ ./foo
/usr/bin/env: ‘python’: No such file or directory
_

envにpython3を使用させるには、他に何ができますか?

PS:私はpython 2を持っていません。インストールもしたくありません。サードパーティのスクリプトのREADMEは、両方のサポートについて具体的に言及していますPython v2とv3、そしてPython docs自体によれば、前述のように、シバンはこれを示しています。

PPS:エイリアスを追加しても、ユーザーがプロンプトでpythonを呼び出すときのみ有効であり、bash自体がスクリプトを実行しているときではないため、エイリアスを追加しても効果がありません。同様の質問に対するこの回答は、明示的に引用しています。この動作: https://askubuntu.com/a/351380/3331

PPPS:他の質問から受け取られた知恵は、シンボリックリンクがenvの問題に対する正しい解決策ではないということです(ATMだけを手に入れるためのリンクはありません)。

3
Toby

OPはpython2をインストールせず、/ usr/bin/pythonをpython2として必要としないため、最も単純な解決策について誰も言及していなかったのではないかと思います。

あなたは単にシンボリックリンクpython to python3 to Sudo ln -s python3 /usr/bin/python、それは動作します。

または、コメントに記載されている代替案を設定します(WSLでUbuntu 18.04を使用している場合は3.6):

Sudo update-alternatives --install /usr/bin/python python /usr/bin/python3.6 100
3
Alvin Liang

envはpythonを見つけることができません。envは、シェルの組み込み、エイリアス、関数ではなく、PATHでpythonを検索しているためです。 pythonをEXPORTを使用するように定義したので、envはそれを見つけられないため、「PATH」を検索し、pythonを/ usr/bin/python(python2)に解決します。システムには存在しません)。

実行可能なpythonの利用可能なすべての場所を確認するには、bashで次のようにします。

type -a python

定義上、シバンでエイリアスを使用したい場合は不運です。シバンは、インタープリター実行可能ファイルへのフルパスである必要があります。/usr/bin/env pythonを使用する場合は、envがpythonに解決する必要があります。 python3を使用してスクリプトを解釈するには、Shebangを使用します。

#!/usr/bin/env python3
1
Tejas Lotlikar