我想在 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 维基):
在 中
/etc/portage/make.conf
,添加或更新PYTHON_TARGETS
和PYTHON_SINGLE_TARGET
到我想要使用的 Python 版本(例如PYTHON_TARGETS="python3_9 python3_8"
和PYTHON_SINGLE_TARGET="python3_9"
)。请注意,Gentoo wiki 建议在 中执行此操作package.use
: 两者都应该有效,因为这是全局更改。运行
emerge -puvDN --with-bdeps=y @world
以验证没有包对更改不满意。USE
添加或更新各个包的Python标志。
我强烈建议不要使用emerge -C
除非你是绝对地确保没有包正在使用该包!特别是在 Python 的情况下,你可以让它emerge
根本不起作用。