Linux管理Python版本


前言

不同的脚本,项目需要用的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

其他指令还是和原来一样的。


文章作者: Wyx
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 Wyx !
  目录