私は通常、次のように古いバージョン(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/bin
PATH
python3.12
/usr/local/bin/
python3
答え1
Pythonを使用しているので、Pythonのデフォルトバージョンはenv python3
変数の最初のバージョンによって決まります。したがって、変数を適切に設定して使用するバージョンを選択できます。システムのデフォルトが必要な場合は、別のディレクトリの前に表示するようにして、独自のPythonをビルドしたい場合は、そのバージョンを含むディレクトリが表示されていることを確認してください。前に。python3
PATH
PATH
/usr/bin
python3
python3
/usr/bin
あなたが提案するソリューションは、現在適用可能な最悪のソリューションの1つです。スクリーンショットに表示されている内容を見ると、システムはまだ破損していません。#!/usr/bin/python3
shebangで指定されたシステム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
予想される他のスクリプトが中断される可能性があります。python3
python3
答え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
詳細やその他のオプションについては、リソースを参照してください。