由于 /usr/local/bin 优先级,update-alternatives 不起作用

Den*_*tov 3 environment-variables update-alternatives 18.04

我遇到了一个问题,当我搜索正确版本的python 时,我每次都发现python 3.7

python3 --version
    Python 3.7.0
Run Code Online (Sandbox Code Playgroud)

然后我检查了update-alternatives配置:

sudo update-alternatives --config python3
There are 3 choices for the alternative python3 (providing /usr/bin/python3).

  Selection    Path                                        Priority   Status
------------------------------------------------------------
  0            /usr/local/bin/python3.7                     2         auto mode
  1            /<HOME_DIR>/Software/anaconda3/bin/python3   1         manual mode
* 2            /usr/bin/python3.6                           1         manual mode
  3            /usr/local/bin/python3.7                     2         manual mode
Run Code Online (Sandbox Code Playgroud)

然后我检查了python3的位置:

which python3
/usr/local/bin/python3
Run Code Online (Sandbox Code Playgroud)

然后我检查了PATH

echo $PATH
/usr/lib/x86_64-linux-gnu/dbus-1.0/include:/usr/local/lib/boost/include:/<HOME_DIR>/bin:/<HOME_DIR>/.local/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games:/snap/bin:/<HOME_DIR>/.dotnet/tools
Run Code Online (Sandbox Code Playgroud)

原来在 /usr/bin 中搜索之前,python3已经在 /usr/local/bin 中找到了

为什么update-alternatives没有在 /usr/local/bin 中创建链接以维护正确搜索应用程序?

我不想从 /usr/local/bin 中删除python3,但在这种情况下,update-alternatives变得无用

如何解决 update-alternatives 也在 /usr/local/bin 中创建链接的问题?

Tho*_*mas 5

回答你的第一个问题

为什么 update-alternatives 没有在 /usr/local/bin 中创建链接以维护正确搜索应用程序?

这仅仅是因为alternativesforpython3被配置为在/usr/bin 中创建符号链接。从上面的输出:

sudo update-alternatives --config python3
There are 3 choices for the alternative python3 (providing /usr/bin/python3).
...
Run Code Online (Sandbox Code Playgroud)

对于任何 Linux 发行版来说,在/usr /bin之前搜索/usr/local/bin查找可执行文件是很正常的,因为这使您可以自由地将任何二进制文件和库放入/usr/local 中,而不会干扰 dpkg 包。

对于你的具体问题,从sudo update-alternatives --config python3我猜/usr/local/bin/python3 的输出是到/usr/local/bin/python3.7的符号链接

root@host:~# ls -l /usr/local/bin/python3
lrwxrwxrwx 1 root root 25 Sep 22 15:36 /usr/local/bin/python3 -> /usr/local/bin/python3.7
Run Code Online (Sandbox Code Playgroud)

如果是这样的话,只是删除符号链接的/ usr / local / bin目录/ python3,你应该罚款,打电话时因为python3只有在/ usr / bin中/ python3被发现,这应该指向的/ etc /方案/ python3这turn 应该指向所选的二进制文件。
如果/usr/local/bin/python3不是符号链接,请将其重命名并进行update-alternatives适当配置。

虽然这可能暂时拯救您,但下一次更新可能会使您的配置再次变得无用。符号链接/usr/bin/python3随包一起提供python3-minimal,通过使用update-alternatives符号链接管理此链接,从python3-minimal包的角度来看会被破坏。这个包的下一次更新可以解决这个问题,但是从update-alternatives.

要解决这两个问题,最好配置update-alternatives为使用/usr/local/bin/python3作为提供所选版本的符号链接。
为此,以下步骤应该可以解决问题,包括修复/usr/bin/python3链接。

sudo update-alternatives --install /usr/local/bin/python3 python3 /usr/bin/python3.6 2
apt-get install --reinstall python3-minimal
Run Code Online (Sandbox Code Playgroud)