如何在不破坏 apt 的情况下将替代方案更新至 Python 3?

2024-10-25 08:42:00
admin
原创
217
摘要:问题描述:有一天,我决定让命令 python 默认启动 python3 而不是 python2。所以我这样做了:$ sudo update-alternatives --install /usr/bin/python python /usr/bin/python2.7 2 $ sudo update-alt...

问题描述:

有一天,我决定让命令 python 默认启动 python3 而不是 python2。

所以我这样做了:

$ sudo update-alternatives --install /usr/bin/python python /usr/bin/python2.7 2

$ sudo update-alternatives --install /usr/bin/python python /usr/bin/python3.5 3

$ sudo update-alternatives --config python

$ sudo update-alternatives --config python
There are 2 choices for the alternative python (providing /usr/bin/python).

  Selection    Path                Priority   Status
------------------------------------------------------------
* 0            /usr/bin/python3.5   3         auto mode
  1            /usr/bin/python2.7   2         manual mode
  2            /usr/bin/python3.5   3         manual mode

Press <enter> to keep the current choice[*], or type selection number: 0

一切顺利。太棒了!:)

$ python -V
Python 3.5.2

但不久之后,我意识到在安装和删除 python 包时,我破坏了 apt/aptitude,因为 apt 期望的是 python2。

事情是这样的。

$ sudo apt remove  python-samba
Reading package lists... Done
Building dependency tree       
Reading state information... Done
The following package was automatically installed and is no longer required:
  samba-libs
Use 'sudo apt autoremove' to remove it.
The following packages will be REMOVED:
  python-samba
0 upgraded, 0 newly installed, 1 to remove and 0 not upgraded.
After this operation, 5,790 kB disk space will be freed.
Do you want to continue? [Y/n] 
(Reading database ... 187285 files and directories currently installed.)
Removing python-samba (2:4.3.11+dfsg-0ubuntu0.16.04.5) ...
  File "/usr/bin/pyclean", line 63
    except (IOError, OSError), e:
                             ^
SyntaxError: invalid syntax
dpkg: error processing package python-samba (--remove):
 subprocess installed pre-removal script returned error exit status 1
Traceback (most recent call last):
  File "/usr/bin/pycompile", line 35, in <module>
    from debpython.version import SUPPORTED, debsorted, vrepr, \n  File "/usr/share/python/debpython/version.py", line 24, in <module>
    from ConfigParser import SafeConfigParser
ImportError: No module named 'ConfigParser'
dpkg: error while cleaning up:
 subprocess installed post-installation script returned error exit status 1
Errors were encountered while processing:
 python-samba
E: Sub-process /usr/bin/dpkg returned an error code (1)

最终我猜测它希望将 python2 作为默认值,因此我撤消了我的更改,如下所示:

$ sudo update-alternatives --config python
There are 2 choices for the alternative python (providing /usr/bin/python).

  Selection    Path                Priority   Status
------------------------------------------------------------
* 0            /usr/bin/python3.5   3         auto mode
  1            /usr/bin/python2.7   2         manual mode
  2            /usr/bin/python3.5   3         manual mode

Press <enter> to keep the current choice[*], or type selection number: 1

$ python -V
Python 2.7.12

然后 apt 又可以工作了

$ sudo apt remove  python-samba
Reading package lists... Done
Building dependency tree       
Reading state information... Done
The following package was automatically installed and is no longer required:
  samba-libs
Use 'sudo apt autoremove' to remove it.
The following packages will be REMOVED:
  python-samba
0 upgraded, 0 newly installed, 1 to remove and 0 not upgraded.
1 not fully installed or removed.
After this operation, 5,790 kB disk space will be freed.
Do you want to continue? [Y/n] 
(Reading database ... 187285 files and directories currently installed.)
Removing python-samba (2:4.3.11+dfsg-0ubuntu0.16.04.5) ...

因此我不得不将其默认为 python 2,但我使用 python 3 进行开发,因此希望当我运行 python 并处于空闲状态时,我的系统默认为 python 3。

有人能告诉我怎样才能在不破坏 apt 的情况下实现这一点吗?

我的系统是运行 Ubuntu 的 Raspberry Pi 3B:

Linux mymachine 4.4.38-v7+ #938 SMP Thu Dec 15 15:22:21 GMT 2016 armv7l armv7l armv7l GNU/Linux

(它实际上是一个 arm v8)

$ cat /etc/lsb-release 
DISTRIB_ID=Ubuntu
DISTRIB_RELEASE=16.04
DISTRIB_CODENAME=xenial
DISTRIB_DESCRIPTION="Ubuntu 16.04.2 LTS"

解决方案 1:

代替

[bash:~] $ sudo update-alternatives --install /usr/bin/python python \n/usr/bin/python2.7 2

[bash:~] $ sudo update-alternatives --install /usr/bin/python python \n/usr/bin/python3.5 3

[bash:~] $ sudo update-alternatives --install /usr/local/bin/python python \n/usr/bin/python2.7 2

[bash:~] $ sudo update-alternatives --install /usr/local/bin/python python \n/usr/bin/python3.5 3

例如安装到/usr/local/bin而不是/usr/bin

并确保在 PATH/usr/local/bin之前/usr/bin

IE

[bash:~] $ echo $PATH
/usr/local/bin:/usr/bin:/bin

通过添加以下代码确保始终如此

export PATH=/usr/local/bin:$PATH

到文件末尾。通常建议使用自定义 bin 文件夹(例如或)作为环境变量的~/.bashrc前缀,以确保在默认系统变量之前找到自定义变量。PATH`/usr/local/bin`/opt/<some install>/bin

解决方案 2:

根据 Debian 政策,python指的是 Python 2 和python3Python 3。不要尝试在整个系统范围内更改这一点,否则您将陷入已经发现的那种麻烦。

虚拟环境允许您运行独立的 Python 安装,其中包含您需要的任何版本的 Python 和任何库,而不会干扰系统 Python 安装。

对于最新的 Python 3,venv它是标准库的一部分;对于旧版本,您可能需要安装python3-venv或类似的包。

$HOME~$ python --version
Python 2.7.11

$HOME~$ python3 -m venv myenv
... stuff happens ...

$HOME~$ . ./myenv/bin/activate

(myenv) $HOME~$ type python   # "type" is preferred over which; see POSIX
python is /home/you/myenv/bin/python

(myenv) $HOME~$ python --version
Python 3.5.1

无论如何,一种常见的做法是为您从事的每个项目提供一个单独的环境;但如果您希望它看起来像是您自己的登录的系统范围的有效环境,您可以将激活节添加到您的.profile或类似的环境中。

解决方案 3:

对于 2021 年或以后发现这个问题的人来说,几乎所有早期的答案都已过时。

现在指向 Python 3 是完全没问题的,而且也是预料之中的。Python /usr/bin/python2 尚未更新安全修复程序,因此任何仍在使用它的系统都应升级为使用 Python 3 作为系统 Python。任何现代发行版都应该已经解决了将系统 Python 升级到 Python 3 时可能出现的不兼容性问题。

解决方案 4:

因为我不想破坏任何东西,所以我这样做是为了能够使用比 Python v3.4 更新的 Python3 版本:

$ sudo update-alternatives --install /usr/local/bin/python3 python3 /usr/bin/python3.6 1
update-alternatives: using /usr/bin/python3.6 to provide /usr/local/bin/python3 (python3) in auto mode
$ sudo update-alternatives --install /usr/local/bin/python3 python3 /usr/bin/python3.7 2
update-alternatives: using /usr/bin/python3.7 to provide /usr/local/bin/python3 (python3) in auto mode
$ update-alternatives --list python3
/usr/bin/python3.6
/usr/bin/python3.7
$ sudo update-alternatives --config python3
There are 2 choices for the alternative python3 (providing /usr/local/bin/python3).

  Selection    Path                Priority   Status
------------------------------------------------------------
* 0            /usr/bin/python3.7   2         auto mode
  1            /usr/bin/python3.6   1         manual mode
  2            /usr/bin/python3.7   2         manual mode

Press enter to keep the current choice[*], or type selection number: 1
update-alternatives: using /usr/bin/python3.6 to provide /usr/local/bin/python3 (python3) in manual mode
$ ls -l /usr/local/bin/python3 /etc/alternatives/python3 
lrwxrwxrwx 1 root root 18 2019-05-03 02:59:03 /etc/alternatives/python3 -> /usr/bin/python3.6*
lrwxrwxrwx 1 root root 25 2019-05-03 02:58:53 /usr/local/bin/python3 -> /etc/alternatives/python3*

解决方案 5:

不知何故,python 3 又回来了(经过一些更新之后?)并导致了 apt 更新出现大问题,所以我决定从替代方案中完全删除 python 3:

root:~# python -V
Python 3.5.2

root:~# update-alternatives --config python
There are 2 choices for the alternative python (providing /usr/bin/python).

  Selection    Path                Priority   Status
------------------------------------------------------------
* 0            /usr/bin/python3.5   3         auto mode
  1            /usr/bin/python2.7   2         manual mode
  2            /usr/bin/python3.5   3         manual mode


root:~# update-alternatives --remove python /usr/bin/python3.5

root:~# update-alternatives --config python
There is 1 choice for the alternative python (providing /usr/bin/python).

    Selection    Path                Priority   Status
------------------------------------------------------------
  0            /usr/bin/python2.7   2         auto mode
* 1            /usr/bin/python2.7   2         manual mode

Press <enter> to keep the current choice[*], or type selection number: 0


root:~# python -V
Python 2.7.12

root:~# update-alternatives --config python
There is only one alternative in link group python (providing /usr/bin/python): /usr/bin/python2.7
Nothing to configure.

解决方案 6:

作为对上述完整说明的补充,这里有一个小脚本可以添加所有 Python 版本,以便您只需复制粘贴它即可。

i=0 ; for p in /usr/bin/python*.[0-9]* ; do
  if [[ "$p" == *exe ]] || [[ "$p" == *[0-9] ]] ; then
    update-alternatives --install /usr/bin/python python "$p" $((5 + i))
    i=$((i+1))
  fi
done
update-alternatives --config python

解决方案 7:

我已经编辑了 /home/user/.bashrc

alias python27=/usr/bin/python2.7
alias python31=/usr/bin/python3.10

在 linux ubuntu 20.xx 上。我已将其添加到文档的最末尾。

这会将 python27 绑定到您想要的版本。

python27 pythonscrypt.py

测试样品

python27 --version

但我想知道 python 和 python3 是否应该指向 /usr/local/python3.9?

我认为习惯上将 2.7-2.8 作为 python,将 3.9.x 作为 python3。

更新上述帖子中的替代方案对我来说有点奇怪,因此必须通过将默认值设置为正常来回溯一些。还尝试了 anaconda,有些部分在 python 和 anaconda 版本之间有点令人困惑。

但我认为编辑 .bashrc 然后退出终端并重新登录是 2021 年最好的解决方案。

不要忘记在保存更改后退出终端并重新登录!

另一种技术是在 python3 中使用 envs。

相关推荐
  政府信创国产化的10大政策解读一、信创国产化的背景与意义信创国产化,即信息技术应用创新国产化,是当前中国信息技术领域的一个重要发展方向。其核心在于通过自主研发和创新,实现信息技术应用的自主可控,减少对外部技术的依赖,并规避潜在的技术制裁和风险。随着全球信息技术竞争的加剧,以及某些国家对中国在科技领域的打压,信创国产化显...
工程项目管理   1565  
  为什么项目管理通常仍然耗时且低效?您是否还在反复更新电子表格、淹没在便利贴中并参加每周更新会议?这确实是耗费时间和精力。借助软件工具的帮助,您可以一目了然地全面了解您的项目。如今,国内外有足够多优秀的项目管理软件可以帮助您掌控每个项目。什么是项目管理软件?项目管理软件是广泛行业用于项目规划、资源分配和调度的软件。它使项...
项目管理软件   1354  
  信创国产芯片作为信息技术创新的核心领域,对于推动国家自主可控生态建设具有至关重要的意义。在全球科技竞争日益激烈的背景下,实现信息技术的自主可控,摆脱对国外技术的依赖,已成为保障国家信息安全和产业可持续发展的关键。国产芯片作为信创产业的基石,其发展水平直接影响着整个信创生态的构建与完善。通过不断提升国产芯片的技术实力、产...
国产信创系统   21  
  信创生态建设旨在实现信息技术领域的自主创新和安全可控,涵盖了从硬件到软件的全产业链。随着数字化转型的加速,信创生态建设的重要性日益凸显,它不仅关乎国家的信息安全,更是推动产业升级和经济高质量发展的关键力量。然而,在推进信创生态建设的过程中,面临着诸多复杂且严峻的挑战,需要深入剖析并寻找切实可行的解决方案。技术创新难题技...
信创操作系统   27  
  信创产业作为国家信息技术创新发展的重要领域,对于保障国家信息安全、推动产业升级具有关键意义。而国产芯片作为信创产业的核心基石,其研发进展备受关注。在信创国产芯片的研发征程中,面临着诸多复杂且艰巨的难点,这些难点犹如一道道关卡,阻碍着国产芯片的快速发展。然而,科研人员和相关企业并未退缩,积极探索并提出了一系列切实可行的解...
国产化替代产品目录   28  
热门文章
项目管理软件有哪些?
云禅道AD
禅道项目管理软件

云端的项目管理软件

尊享禅道项目软件收费版功能

无需维护,随时随地协同办公

内置subversion和git源码管理

每天备份,随时转为私有部署

免费试用