---#N: 2022/10/11 #U: future #S: writing #T: home #---

pyenv

Managing Multiple Python Versions With pyenv – Real Python.html

知识点有点多。

基本概念

  1. 系统自带 python,否则先安装最初的 python

  2. 安装 pyenv

  3. 安装 python 主版本

  4. 安装 virtualenv 版本

  5. 为工程或 shell 设置 version

本篇只记录 3~5。其中第2步安装安装 pyenv 最为麻烦,不过只需要安装一次。笔记见 see: install pyenv on ubuntu

安装 Python 主版本

这里安装的版本是 python 的主版本,不是虚拟版本。

查看可安装的 python 版本列表:

pyenv install --list
pyenv install --list | grep " 3\.[678]"
pyenv install --list | grep "jython"

install python 3.8.15:

pyenv install -v 3.8.15
  • 安装在了哪个目录呢? .pyenv/versions

  • 版本选择:需要精确指定 python 的版本。

  • 如果因为网络的原因安装不了,看: pyenv install offline

注意

在安装 Python 主版本的时候,很可能会受限于网络,会造成安装失败。方法是通过先下载安装包,再运行安装命令。见文末 _pyenv-install-offline

主版本和虚拟版本

一个主版本占约 200M, 可以生成很多个相同版本的虑拟版本。这些虚拟版本每个虚拟版本共享了相同的主版本,单独占磁盘约 20M 。然后可以分别为不同的虚拟版本安装不同的 package。这样就实现了不同 app 应用开发的环境的隔离与最小化。在生成 requirements.txt 时,可以生成最小的依赖。

Installation Location

ls ~/.pyenv/versions/

Remove

$ rm -rf ~/.pyenv/versions/2.7.15

# or
pyenv uninstall 2.7.15

Using Your New Python

查看所有版本/正在工作的版本:

pyenv versions
python -V
which python

注意,命令 pyenv --version 看到的不是 python 的版本,而是 pyenv 的版本号。

切换版本:

pyenv global 2.7.15
pyenv versions

pyenv global system

注: 第1个安装的版本名字叫 system

这是将全局 global 版本设置为 system 版本吗?

Exploring pyenv Commands

$ pyenv commands
$ pyenv install
$ pyenv versions
$ pyenv which pip
$ pyenv global 3.6.8
pyenv local 2.7.15
pyenv shell 3.8-dev

set specific python version:

$ pyenv local 2.7.15

Virtual Environments

前面处理的是主要版本,这里才到虚拟版本。

Managing Multiple Python Versions With pyenv – Real Python

  • pyenv manages multiple versions of Python itself.

  • virtualenv/venv manages virtual environments for a specific Python version.

  • pyenv-virtualenv manages virtual environments for across varying versions of Python.

Creating Virtual Environments

Managing Multiple Python Versions With pyenv – Real Python

Creating Virtual Environments:

$ pyenv virtualenv <python_version> <environment_name>

Example:

$ pyenv virtualenv 3.6.8 myproject

A good practice is to name your environments the same name as your project.

Activating Your Versions:

pyenv local myproject
pyenv which python

$ pyenv activate <environment_name>
$ pyenv deactivate

上面的两行代码写在 .python-version 中? 进入或退入该目当时,会自动执行? 可以验证。

问题

  • 3.6.8 是不是首先必须得存在呢? 和 myproject 所代表的 python 版本有何异同? 在磁盘上的表现有何区别?

  • 为什么我在使用的过程中没有用到 activate/deactivate?

版本管理

金字塔模型,4个层级,它们的优先级是: shell > local > global > system。

img/pyenv_version_pyramid.png

计算机上有3个位上可以记录环境变量的设定:

~/.pyenv/version
/home/application/.python-version
$ PYENV_VERSION

global

第1个 ~/.pyenv/version 是全局设置,在 ~/.pyenv/version 文件中记录的环境变量名字,会自动应用到全局。例如,当你在任意目妹下打开一个新的 shell,它的初始python版本默认是由全局设置确定的。

全局环境变要以通过 直接修改该文件 [pyenv_global_file] 的内容实现,也可以通过命令实现:

$ cat pyenv global

$ pyenv global another-python-venv

$ cat pyenv global

此后,你所打开的 shell 默认就是 another-python-venv 环境了。

不过,global 环境的优先级很低,可被 pyenv shell 或 local 变量的值取代。

[pyenv_global_file]

打开 ~/.pyenv/version 文件,修改其中的名字,保存。

local

每个 application (project) 设置和 global 不同的 python 版本:

$ pyenv local 3.8-dev

它会在当前项目目录下生成一个 .python-version 文件,例如:

$ /home/application/.python-version

它记录了当前目录及以下的子目录对应的 python 环境。这是一个局部永久性设置,优先级高于全局设置 (global)。

shell

如果只想临时切换 shell 中的 python 环境,可以这样:

$ pyenv shell another-version

此时的版本会记录在 PYENV_VERSION environment variable 中,而不会影响全局设置。如果重新开一个 shell,python 环境还是由 global 或 local 环境决定的。如果希望永久改变 shell 的设置,还是应该用前两个设置文件。

安装问题

pyenv install 的 python 下载太慢问题

或下载不下来,能离线安装吗?

pyenv install offline

  1. (用镜像)下载所需压缩包,并放入 ~/.pyven/cache/ 目录

  2. pyenv install version-number

原理: install 之前会重新检查缓存中是否已有下载好的文件

BLOG

镜像备份

CNPM Binaries Mirror

使用问题

Error: Pyenv deactivate not working (deactivate Bug)

Error: Pyenv deactivate not working · Issue #32

这是一个 bug,危险的解决方法:

$ sudo su

这样会退出虚拟环境,退回了系统原生自带的环境。

另外,用Pycharm 时,可以选择到系统自带的 Python 环境。