前言
不同的脚本,项目需要用的Python版本不一定是相同的。那怎么让多个版本共存,并且可以任意切换呢?
下面介绍了两种方法,Ubuntu
应该是两种都适用的,MacOS
实测适用方法二。
方法一:update-alternatives
update-alternatives
命令用于处理 Linux 系统中软件版本的切换,使其多版本共存。(update-alternatives可以管理很多软件的版本切换,这里介绍下以python为例)
使用这种方法管理python版本需要和apt一起使用。
首先系统自带的python版本是3.6.9,现在需要一个>=3.7
的版本。
安装
sudo apt update
sudo apt install python3.7
此时python3.7已经安装,但默认命令python3指向的还是3.6.9,下面切换python的默认指向。
切换默认指向
使用update-alternatives,给python版本编号。
要先安装update-alternatives,先添加两个指向。
sudo update-alternatives --install /usr/bin/python3 python3 /usr/bin/python3.6 1
sudo update-alternatives --install /usr/bin/python3 python3 /usr/bin/python3.7 2
然后确定默认指向,执行以下命令后选择2即可(后面可以随时输入这条命令切换版本)。
sudo update-alternatives --config python3
这样就完成了python的版本切换。
总结一下
- 优点:安装比较方便,比较适合对python版本要求不是很严格的用户。
- 缺点:apt支持的python版本有限,特别新的版本一般是没有的。
方法二:Pyenv
pyenv做什么…
- 允许您基于每个用户更改全局 Python 版本。
- 为每个项目的 Python 版本提供支持。
- 允许您使用环境变量覆盖 Python 版本。
- 一次搜索来自多个 Python 版本的命令。
简单来说就是一个简单的Python版本管理器,可以轻松地在各个Python版本之间进行切换。
Github 30.8k Star,有点东西。。
安装(推荐手动安装):
自动安装(需要梯子):
curl https://pyenv.run | bash
手动安装:
# clone,编译
git clone https://github.com/pyenv/pyenv.git ~/.pyenv
cd ~/.pyenv && src/configure && make -C src
# 配置环境变量
echo 'export PYENV_ROOT="$HOME/.pyenv"' >> ~/.bashrc
echo 'command -v pyenv >/dev/null || export PATH="$PYENV_ROOT/bin:$PATH"' >> ~/.bashrc
echo 'eval "$(pyenv init -)"' >> ~/.bashrc
source ~/.bashrc
然后测试一下,打印出版本就是安装成功了。
$ pyenv -v
$ pyenv 2.3.17-5-ga57e0b50
使用介绍:
$ pyenv
pyenv 2.3.17-5-ga57e0b50
Usage: pyenv <command> [<args>]
Some useful pyenv commands are:
--version Display the version of pyenv
commands List all available pyenv commands
exec Run an executable with the selected Python version
global Set or show the global Python version(s)
help Display help for a command
hooks List hook scripts for a given pyenv command
init Configure the shell environment for pyenv
install Install a Python version using python-build
latest Print the latest installed or known version with the given prefix
local Set or show the local application-specific Python version(s)
prefix Display prefixes for Python versions
rehash Rehash pyenv shims (run this after installing executables)
root Display the root directory where versions and shims are kept
shell Set or show the shell-specific Python version
shims List existing pyenv shims
uninstall Uninstall Python versions
version Show the current Python version(s) and its origin
version-file Detect the file that sets the current pyenv version
version-name Show the current Python version
version-origin Explain how the current Python version is set
versions List all Python versions available to pyenv
whence List all Python versions that contain the given executable
which Display the full path to an executable
See `pyenv help <command>' for information on a specific command.
虽然它有一大堆命令,但实际使用频率高的命令并不多,主要有以下几个:
指令 | 说明 |
---|---|
pyenv versions |
列出系统当前所有的python版本 |
pyenv version |
打印系统当前python版本 |
pyenv install |
安装指定版本 |
pyenv global |
设置python版本 |
pyenv uninstall |
卸载指定版本 |
查找需要安装的Python版本:
$ pyenv install -l
...
...
3.8.2
3.8.3
3.8.4
3.8.5
3.8.6
...
...
3.9.1
3.9.2
3.9.4
...
...
安装:
找到自己需要的版本,pyenv默认从python官网下载tar包,国内访问速度很慢,timeout也正常。可以考虑换国内镜像,方法放在后面。
$ pyenv install 3.x.x
这样就算安装完成了。
切换版本:
$ pyenv versions
* system
3.8.5 (set by /root/.pyenv/version)
$ pyenv global 3.8.5
$ pyenv version
3.8.5 (set by /root/.pyenv/version)
(注意切换回系统自带版本的时候, pyenv global system
)
换源:
这里我使用的是淘宝的源 https://npm.taobao.org/mirrors/python/
pyenv 没有配置源地址的地方,不过我们可以变通一下。
它安装 Python 的流程就是先将把包下载到 ~/.pyenv/cache
目录,然后在进行安装,慢也就慢在下载的这个过程。
先手动将包下载到指定目录,再执行 pyenv install 即可。
可以精简为一个shll命令:
v=3.8.5; curl -L https://npm.taobao.org/mirrors/python/$v/Python-$v.tar.xz -o ~/.pyenv/cache/Python-$v.tar.xz; pyenv install $v
或者
一劳永逸:
可以写在~/.bashrc
function pyinstall() {
v=$1
echo '准备安装 Python' $v
curl -L https://npm.taobao.org/mirrors/python/$v/Python-$v.tar.xz -o ~/.pyenv/cache/Python-$v.tar.xz
pyenv install $v
}
写在~/.bashrc
保存,使改动生效source ~/.bashrc
。
对了,第一次运行的话,需要在pyenv下创建一下缓存目录:
$ mkdir ~/.pyenv/cache
使用换源的安装命令:
$ pyinstall 3.9.16
准备安装 Python 3.9.16
% Total % Received % Xferd Average Speed Time Time Time Current
Dload Upload Total Spent Left Speed
100 145 100 145 0 0 184 0 --:--:-- --:--:-- --:--:-- 184
100 18.8M 100 18.8M 0 0 1933k 0 0:00:09 0:00:09 --:--:-- 2361k
Installing Python-3.9.16...
Installed Python-3.9.16 to /root/.pyenv/versions/3.9.16
其他指令还是和原来一样的。