マイコンピュータに2つのバージョンのPython3(3.11.2や3.12など)がインストールされている場合、Pythonスクリプトを実行するときに使用するデフォルトバージョンをどのように設定しますか?

マイコンピュータに2つのバージョンのPython3(3.11.2や3.12など)がインストールされている場合、Pythonスクリプトを実行するときに使用するデフォルトバージョンをどのように設定しますか?

私は通常、次のように古いバージョン(3.11.2)をインストールしました。簡単パッケージマネージャの異常(3.12)はソースで手動で実行されます。次のようにPythonスクリプトを実行するとき:

./python_script.py

スクリプトは、最新バージョンではなく古いバージョンを使用します。移植性の理由から、スクリプトの先頭#!/usr/bin/env python3にデフォルトのshebang行を残したいと思います。

以下はサンプルテストスクリプトです。

#!/usr/bin/env python3

import sys

def main():
  print(sys.version)

main()

ここに画像の説明を入力してください。

編集:上記の設定では、現時点で最速の解決策は(将来の結果が最善ではない可能性があります。詳細については、以下のコミュニティの回答とコメントを参照してください)python3シンボリックリンクのターゲットを変更することです。/etc/代替到着/usr/local/bin/python3.12私のpython3.12バイナリはどこに保存されていますか?

ここに画像の説明を入力してください。

編集2:2番目のスクリーンショットに示すように、./myscript.pyディレクトリが環境変数のディレクトリの前にあることを確認し、/usr/local/binバイナリ名を 。/usr/binPATHpython3.12/usr/local/bin/python3

答え1

Pythonを使用しているので、Pythonのデフォルトバージョンはenv python3変数の最初のバージョンによって決まります。したがって、変数を適切に設定して使用するバージョンを選択できます。システムのデフォルトが必要な場合は、別のディレクトリの前に表示するようにして、独自のPythonをビルドしたい場合は、そのバージョンを含むディレクトリが表示されていることを確認してください。前に。python3PATHPATH/usr/binpython3python3/usr/bin

あなたが提案するソリューションは、現在適用可能な最悪のソリューションの1つです。スクリーンショットに表示されている内容を見ると、システムはまだ破損していません。#!/usr/bin/python3shebangで指定されたシステムPythonスクリプトは、まだ期待されているモジュールを見つけることができます。 Python 3.12を指すように変更すると、/usr/bin/python3これらのスクリプトは特にシステムにインストールされている3.11モジュールにアクセスできなくなりますpython3-apt。これは不幸な結果につながる可能性があります。

あなたはそれを自分のスクリプトに割り当てるので#!/usr/bin/env python3それに頼ることができますがPATH、私はまだベースのPATHアプローチがあなたの場合に適していると思います。システムのPythonスクリプトを損なうことなく、最初のスクリプトを指すPATHようにどこでも変更できます。python3いいえPythonを使用してくださいPATH。)

答え2

補う@StephenKittの素晴らしい答え、Debianベースのシステムでは、複数のバージョンのPythonパッケージを同時にインストールできます。たとえば、Ubuntu 22.04では3.10と3.11をインストールしました。

$ aptitude search -F%p '~i ~n "^python[0-9.]*$"'
python3
python3.10
python3.11

パッケージpython3は依存python3.10し、python3実行可能ファイルはへのシンボリックリンクですpython3.10

$ zstat +link --  ${(v)commands[(I)python[0-9.]#]}
/usr/bin/python3 python3.10
/usr/bin/python3.10
/usr/bin/python3.11

欲しくないシンボリックリンクを手動で変更します。バージョン間にはしばしば非互換性があり、PythonモジュールはPythonバージョン間で共有されないため、python3シンボリックリンクを変更したりpython(または最近は通常シンボリックリンク)があり、python3が3.10になると予想して3.10にアクセスできるスクリプト中断されます。インストールされたPythonモジュール。#! /usr/bin/env python3#! /usr/bin/python3#! /bin/python3/bin/usr/bin

したがって、インストールされている他のPythonバージョンが必要なスクリプトを呼び出す必要があり、shebangをに変更できない場合は、次の#! /usr/bin/python3.12ように呼び出します。

python3.12 /path/to/that-file.py

または1つを作る:

mkdir ~/.python3-is-python3.12
ln -s /usr/bin/python3.12 ~/.python3-is-python3.12/python3

そしてそれを~/.python3-is-python3.12あなたの前に置きなさい。$PATH ただし、スクリプトを呼び出す場合にのみ、グローバルに設定すると、システムのデフォルトになると#! /usr/bin/env python3予想される他のスクリプトが中断される可能性があります。python3python3

答え3

私はこの質問がパッケージマネージャについてのみ尋ねることを知っており、apt他の答えはこの側面をよく扱っています。

ただし、異なるPythonバージョンおよび/または異なる依存関係を必要とする複数の異なるPythonプロジェクトで作業している場合は、仮想環境(仮想環境venv)を使用してプロジェクトのPythonバージョンと依存関係を管理することをお勧めします。

3.11 などのプロジェクトの仮想環境をインストールするには、次の手順を実行します。

python3.11 -m venv venv

venvこれにより、仮想環境を含むディレクトリが作成されます。

次に環境を使用するには、次のように入力します。

. venv/bin/activate

pythonその時点から、現在のシェルはバージョン番号なしで実行でき、pip正しい環境が使用されます。この環境を終了するには、と入力しますdeactivate

新しい環境ではpip依存関係のみがインストールされるため、プロジェクト間で依存関係の不一致は発生しません。依存関係がインストールされたら、プロジェクト用のrequirements.txtファイルを簡単に作成することもできます。pip freeze > requirements.txt

答え4

あなたはDebian(またはその派生物の1つ)を使用しているので、このupdate-alternativesユーティリティを使用することを検討することができます。

たとえば、デフォルト値を /usr/local/bin/ にあるバージョン 3.12 に設定するには、次のようにします。

sudo update-alternatives --install /usr/bin/python3 python3 /usr/local/bin/python3.12 10

応答は次のようにする必要があります(実際にはPython 3.12がインストールされていません)。

update-alternatives: using /usr/local/bin/python3.12 to provide /usr/bin/python3 (python3) in auto mode

man update-alternatives詳細やその他のオプションについては、リソースを参照してください。

関連情報