有一天,我决定让 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, \
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"
更换
[bash:~] $ sudo update-alternatives --install /usr/bin/python python \
/usr/bin/python2.7 2
[bash:~] $ sudo update-alternatives --install /usr/bin/python python \
/usr/bin/python3.5 3
与
[bash:~] $ sudo update-alternatives --install /usr/local/bin/python python \
/usr/bin/python2.7 2
[bash:~] $ sudo update-alternatives --install /usr/local/bin/python python \
/usr/bin/python3.5 3
例如安装到
/usr/local/bin
而不是 /usr/bin
。
并确保 PATH 中
/usr/local/bin
位于 /usr/bin
之前。
即
[bash:~] $ echo $PATH
/usr/local/bin:/usr/bin:/bin
通过添加来确保始终如此
export PATH=/usr/local/bin:$PATH
到
~/.bashrc
文件的末尾。通常建议在 PATH
环境变量前添加自定义 bin 文件夹(例如 /usr/local/bin
或 /opt/<some install>/bin
),以确保在默认系统之前找到自定义项。
根据 Debian 政策,
python
指的是 Python 2,python3
指的是 Python 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
或类似内容。
对于 2021 年或之后发现此问题的任何人来说,几乎所有早期答案都已过时。
/usr/bin/python
指向Python 3是完全正常的,也是现在所期望的。Python 2没有通过安全修复进行更新,因此任何仍在使用它的系统都应该升级为使用Python 3作为系统Python。任何现代发行版都应该已经解决了将系统 Python 升级到 Python 3 时潜在的不兼容性问题。
因为我不想破坏任何东西,所以我这样做是为了能够使用比 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*
不知何故,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.
我已经用
编辑了/home/user/.bashrcalias 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。
作为上面完整说明的补充,这里有一个小脚本来添加所有 python 版本,以便您可以复制粘贴它。
i=0 ; for p in /usr/bin/python*.* ; do
update-alternatives --install /usr/bin/python python $p $((5 + i))
i=$((i+1))
done
update-alternatives --config python