Gentoo でパッケージに Python バージョンを強制的に使用させるにはどうすればよいでしょうか?

Gentoo でパッケージに Python バージョンを強制的に使用させるにはどうすればよいでしょうか?

Gentoo システムのすべてのパッケージに Python3 の 1 つのバージョンのみを使用したいと考えています。そこで、インストールされているバージョンを検索したところ、3.6、3.7、3.8 の 3 つのバージョンがインストールされていることがわかりました。すべてのパッケージを 3.8 に変換し、以前のバージョンを削除したいと思います。

私の計画:

  • Python 3.6 と 3.7 をマージ解除します。
  • USEPython を使用するパッケージのフラグを に設定しますpython3_8 -python3_7 -python3_6
  • これらのパッケージを再構築して、emerge --update --newusePython 3.8 を使用できるようにします。

したがって、Python 3.6 を削除した後、次の操作を実行します。

emerge --ask -C dev-lang/python:3.6

私はその行を追加しました

virtual/python-ipaddress python3_8 -python3_7 -python3_6

/etc/portage/package.use走る

emerge --ask --update --newuse --deep virtual/python-ipaddress

そして私は

These are the packages that would be merged, in order:

Calculating dependencies... done!
[ebuild  NS    ] dev-lang/python-3.6.11-r2 [2.7.18-r1, 3.7.8-r2, 3.8.4-r1] USE="(threads%*)"

Would you like to merge these packages? [Yes/No]

この動作が理解できません。なぜemergeは を使用する必要があるpython-3.6と指定しているのにをインストールしようとするのでしょうか?また、 変数にPythonの仕様が含まれていないのはなぜでしょうか? 変数よりも優先度が高く、 を再定義する別の設定ファイルがあるのでしょうか?私が読んで理解していることから/etc/portage/package.use3.8USE/etc/portage/package.useUSEドキュメント、これは起こるべきではありません。


答え1

ちなみに、PythonはGentooの通常のパッケージではありません。(主にポーテージそれ自体は Python に依存します。) => 他の変数も設定することが重要です。そして、一貫性が必要です。USE フラグの背後にある考え方は、ユーザー設定を設定するために予約されているということです。設定は、最悪の場合、1 つのパッケージを機能させなくなる可能性がありますが、システム全体を壊すことはありません。

Pythonバージョンは間違いなくないユーザーの好み。いいえ! ユーザーは、ただ起きて「Phython XYZ だけが欲しい!」と決めることはできません。ええ、はい、ユーザーは自分の費用でそうすることができます。


あなたの目標を達成するためには、(私が理解している限りでは)私は絶対に(非常に危険*) あなたが従った方法。

詳細な手順に従うほうがよかったこの段落の下バージョンアップグレード。

ところで:また、選択するあれ。

言うまでもなく、興味深いことに...結局のところ...一体なぜそんなことを望むのでしょうか?

Tux ~ $ equery size python-2.7.18-r1
dev-lang/python-2.7.18-r1
          Total files : 4177
          Total size  : 63.28 MiB
Tux ~ $ equery size python-3.7.8-r2
dev-lang/python-3.7.8-r2
          Total files : 6616
          Total size  : 98.74 MiB

合計 200 MB 未満の回復には、さまざまな興味深いものを壊す潜在的な費用がかかりますか?

注意してください!:実際には決して変換する使用フラグをいじって、プログラムをある言語バージョンから別の言語バージョンに移植します。プログラムをいくつかの異なるライブラリにリンクするだけなので、プログラムがそれらのライブラリと互換性がない場合は、すべてが壊れてしまいます。


非常に危険です (*) : インストールされたパッケージが厳密に依存していないことを確認する前に、パッケージのマージ解除を試みることは絶対にありません。たとえば、python 2 から python 3 に移植されていないプログラムなどです。(個人的には、python-2.7.18-r1 がシステムに存在することを確実に正当化するものをいくつか入手しました)

3.6 と 3.7 を正常に削除した場合、少なくとも glib (2.62.6)、wireshark、git などが壊れていることはほぼ間違いありません。私が見る限り、これらの最新の安定バージョンはまだ 3.8 と互換性がありません...

言うまでもなく、Portage 自体が壊れて、作成を避けたバックアップのせいで、回復のチャンスがまったくなくなる可能性もあります...

答え2

以前の回答で既に述べたように、パッケージを削除してから、不要になるように設定を変更するのは安全ではありません。安全な方法はその逆です。つまり、システム自体がパッケージが不要であると認識するように設定を変更し (USE フラグの調整、バージョンのマスク解除)、システムによってパッケージが自動的に削除されます (いくつかのパッケージの再インストールが必要になる場合があります) emerge --depclean

元の質問に関しては、Python が強制的に削除された場合は、--treeemerge update コマンドにオプションを追加するだけです。インストールされるパッケージだけでなく、それらをツリーにもたらしたものも一覧表示されます。

おそらく、 にまだ依存しているパッケージが存在しますpython:3.6

答え3

Pythonをアップグレードするときに私が行う手順は次のとおりです(Gentoo ウィキ):

  1. で、と を使用したい Python バージョンに/etc/portage/make.conf追加または更新しますPYTHON_TARGETS(例:と)。Gentoo wiki では、これを で行うことを推奨していることに注意してください。これはグローバルな変更なので、どちらでも機能するはずです。PYTHON_SINGLE_TARGETPYTHON_TARGETS="python3_9 python3_8"PYTHON_SINGLE_TARGET="python3_9"package.use

  2. 実行してemerge -puvDN --with-bdeps=y @world、変更に不満のあるパッケージがないことを確認します。

  3. USE個々のパッケージのPython フラグを追加または更新します。

使用emerge -Cしないことを強くお勧めします。絶対にそのパッケージを使用しているパッケージがないことを確認してください。特に Python の場合は、emergeまったく動作しないように設定することもできます。

関連情報