如何强制包在 Gentoo 中使用 Python 版本?

如何强制包在 Gentoo 中使用 Python 版本?

我想在 Gentoo 系统中为我的所有包只使用一个 Python3 版本。于是我查找了安装的版本,发现安装了三个版本:3.6、3.7和3.8。我想将所有软件包转换为 3.8 并删除以前的版本。

我的计划:

  • 取消合并 Python 3.6 和 3.7。
  • USE将使用 Python 的包的标志设置为python3_8 -python3_7 -python3_6.
  • 重建这些包,emerge --update --newuse让它们使用 Python 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]

我不明白这种行为:python-3.6如果/etc/portage/package.use指定它应该使用,为什么emerge要安装3.8?为什么该USE变量不包含任何 Python 规范?是否有另一个配置文件比该变量具有更高的优先级/etc/portage/package.use并重新定义该USE变量?据我读到的理解文档,这不应该发生。


答案1

顺便说一句,python 在 Gentoo 中并不是一个普通的包。 (主要是因为搬运本身取决于 python。) => 设置其他变量也很重要。并且需要连贯一致。 USE 标志背后的想法是它是为设置用户首选项而保留的。最糟糕的是,偏好设置可能会导致某个软件包无法正常工作,但无论如何都不会破坏整个系统。

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

恢复总计少于 200MB 的数据可能会破坏其他有趣的事情?

注意! : 你永远不会真正转变,通过调整使用标志将程序从一种语言版本移植到另一种语言版本。您只需将其链接到一些不同的库,如果程序尚未兼容,这些库就会破坏一切。


高风险(*):在验证没有已安装的软件包严格依赖于它这一事实之前,我永远不会尝试取消合并任何软件包。我指的是尚未从 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被强行删除,只需将--tree选项放在emerge update命令中即可。然后,它不仅会列出要安装的软件包,还会列出将它们带入树中的内容。

很可能有一个包仍然依赖于python:3.6.

答案3

当我升级 Python 时,以下是我执行的步骤(部分基于Gentoo 维基):

  1. 在 中/etc/portage/make.conf,添加或更新PYTHON_TARGETSPYTHON_SINGLE_TARGET到我想要使用的 Python 版本(例如PYTHON_TARGETS="python3_9 python3_8"PYTHON_SINGLE_TARGET="python3_9")。请注意,Gentoo wiki 建议在 中执行此操作package.use: 两者都应该有效,因为这是全局更改。

  2. 运行emerge -puvDN --with-bdeps=y @world以验证没有包对更改不满意。

  3. USE添加或更新各个包的Python标志。

我强烈建议不要使用emerge -C除非你是绝对地确保没有包正在使用该包!特别是在 Python 的情况下,你可以让它emerge根本不起作用。

相关内容