【Computer Vision学习】二、使用pyenv管理多个Python版本(基于Ubuntu16.04)

常用命令快速查阅

命令功能
python -V查看当前系统默认的Python版本
pyenv --version查看pyenv版本
pyenv update更新pyenv版本
pyenv version查看当前pyenv使用的python版本
pyenv versions查看当前pyenv安装了哪些python版本
pyenv install -v xxx安装某个版本的python
pyenv install --list查看可以安装的python版本
pyenv shelll <python版本>配置当前shell的python版本,退出shell则失效
pyenv local <python版本>配置所在项目(目录)的python版本
pyenv global <python版本>配置当前用户的系统使用的python版本
pyenv global system切回到系统默认的python版本
pyenv virtualenv <python版本> <虚拟环境名>创建虚拟环境
pyenv activate <虚拟环境名>激活虚拟环境
pyenv deactivate退出虚拟环境
pyenv virtualenvs查看python虚拟环境
pyenv virtualenv-delete <虚拟环境名>删除虚拟环境(会让输入y进行确认)
~/.pyenv/versions/3.6.1/python 3.8.6解释器安装路径
~/.pyenv/versions/3.6.1/lib/python3.6/site-packages对应该版本插件的安装路径(pip包)
pip list列出该版本已安装插件
pip install --upgrade xxxx更新该版本某个插件

前言

你是否曾经想过为支持多个Python版本的项目做出贡献,但是不确定如何轻松测试所有版本?你是否对Python的最新和最佳版本感到好奇?也许你想尝试这些新功能,但不想担心会弄乱你的开发环境。幸运的是,如果你使用pyenv,则不必管理多个版本的Python。

本文将为你提供有关如何最大程度地花在项目上的时间以及如何最大程度地减少尝试使用正确版本的Python的时间的概述。

在本文中,你将学习如何:

  • 1、安装多个版本的Python
  • 2、安装最新的Python开发版本
  • 3、在安装的版本之间切换
  • 4、在pyenv中使用虚拟环境
  • 5、自动激活不同的Python版本和虚拟环境

1、为什么要使用pyenv?

“System Python” 是操作系统上安装的Python。如果你使用的是Mac或Linux,则默认情况下,当你在终端中键入python时,会得到一个不错的Python REPL(交互式窗口)。

那么,为什么不使用它呢?一种看待它的方式是该Python确实属于操作系统。毕竟,它是随操作系统一起安装的。当你执行以下操作时,这甚至可以反映出来:

$ which python
/usr/bin/python

在这里,python可供所有用户使用,其位置/usr/bin/python证明了这一点。问题是,这不是你想要的Python版本:

$ python -V
Pyhton 2.7.12

要将软件包安装到系统Python中,必须运行sudo pip install。需要注意的是,这样是在全局范围内安装Python软件包,如果另一个用户出现并想安装该软件包的稍旧版本,这将是一个真正的问题。

同一软件包的多个版本的问题往往会困扰到你,并在你最不期望的时候缠住你。经过数小时的故障排除和谷歌搜索,你可能会发现安装了错误版本的依赖项,这毁了你的一天。

即使你的Python版本安装在/usr/local/bin/python3中,你仍然不安全。你将遇到上述相同的权限和灵活性问题。

另外,你实际上对操作系统上安装的Python版本没有太多控制权。例如,如果你想使用Python中的最新功能,而你正在使用Ubuntu,那么你可能就不走运了。默认版本可能太旧,这意味着你只需要等待新的操作系统问世即可。

最后,某些操作系统实际上使用打包的Python进行操作。以yum为例,它大量使用Python来完成其工作。如果你安装了新版本的Python,并且不小心将其安装到用户空间中,则可能会严重损害你使用操作系统的能力。

1.1、包管理器呢?

下一个合乎逻辑的地方是程序包管理器,如apt,yum,brew或port等。毕竟,这就是将大多数软件包安装到系统的方式。不幸的是,使用包管理器会发现一些相同的问题。

默认情况下,程序包管理器倾向于将其程序包安装到全局系统空间而不是用户空间中。同样,这些系统级程序包会污染你的开发环境,并使其很难与他人共享工作区。

同样,你仍然无法控制可以安装哪个版本的Python。的确,有些存储库为您提供了更多选择,但是默认情况下,您正在查看特定供应商在特定日期所使用的Python版本。

即使你确实从程序包管理器安装Python,也要考虑如果编写程序包并希望在Python 3.4-3.7上进行支持和测试会发生什么。

当你键入python3时,系统上会发生什么?你如何在不同版本之间快速切换?你当然可以做到,但是这很繁琐并且容易出错。没关系,如果你想要PyPy,Jython或Miniconda,那么你的包管理器可能就不走运了。

考虑到这些限制,让我们回顾一下可以轻松灵活地安装和管理Python版本的条件:

  • 1、在用户空间中安装Python
  • 2、安装多个版本的Python
  • 3、指定所需的确切Python版本
  • 4、在安装的版本之间切换

pyenv可以让你做所有这些事情,甚至更多。

2、安装pyenv

在安装pyenv本身之前,你将需要一些特定于操作系统的依赖项。这些依赖关系大部分是用C编写的开发实用程序,是必需的,因为pyenv通过从源代码构建来安装Python。有关构建依赖项的详细分类和解释,请查看官方文档。在本教程中,你将看到安装这些依赖项的最常用方法。

注意:pyenv最初不支持Windows。但是,最近活跃的pyenv-win项目似乎提供了一些基本支持。如果你使用Windows,请随时进行查阅。

2.1、构建依赖项

pyenv从源代码构建Python,这意味着你需要构建依赖项才能实际使用pyenv。构建依赖关系因平台而异。如果你使用的是Ubuntu / Debian,并且要安装构建依赖项,则可以使用以下命令:

$ sudo apt-get install -y make build-essential libssl-dev zlib1g-dev \
libbz2-dev libreadline-dev libsqlite3-dev wget curl llvm libncurses5-dev \
libncursesw5-dev xz-utils tk-dev libffi-dev liblzma-dev python-openssl

这将使用Apt安装所有构建依赖项。运行此命令,你就可以开始使用Debian系统了。

2.2、使用pyenv-installer

安装了构建依赖项后,即可准备安装pyenv本身。建议使用pyenv-installer项目

$ curl https://pyenv.run | bash

若使用的shell是zsh,则应该使用curl https://pyenv.run | zsh命令!

这将安装pyenv以及一些有用的插件:

  • 1、pyenv:实际的pyenv应用程序
  • 2、pyenv-virtualenv:pyenv和虚拟环境插件
  • 3、pyenv-update:更新pyenv插件
  • 4、pyenv-doctor:用于验证是否已安装pyenv和构建依赖项的插件
  • 5、pyenv-which-ext:自动查找系统命令插件

注意:上面的命令与下载pyenv-installer脚本并在本地运行它等效。因此,如果你想确切查看运行的内容,则可以自己查看文件。另外,如果你确实不想运行脚本,则可以查看手动安装说明

运行结束时,你应该会看到类似以下内容:

WARNING: seems you still have not added 'pyenv' to the load path.

# Load pyenv automatically by adding
# the following to ~/.bashrc:

export PATH="$HOME/.pyenv/bin:$PATH"
eval "$(pyenv init -)"
eval "$(pyenv virtualenv-init -)"

相应地,shell是zsh时,输出内容如下所示:

在这里插入代码片

你应该按照上述说明将pyenv添加到你的~/.bashrc(或~/.zshrc)路径并初始化pyenv/pyenv-virtualenv自动完成功能。

完成此操作后,在终端输入如下命令使环境变量生效

source ~/.bashrc
or
source ~/.zshrc

接着需要输入以下命令重新加载Shell:【当然了重启终端也是可以的!】

$ exec "$SHELL" # Or just restart your terminal

现在,你已经完成了安装pyenv和四个有用的插件。可以输入以下命令查看pyenv的版本以及更新pyenv

pyenv --version #查看pyenv版本
pyenv update    #更新pyenv

3、使用pyenv安装Python

现在你已经安装了pyenv,下一步就是安装Python。你有许多版本的Python可供选择。如果要查看所有可用的CPython 3.6至3.8,可以执行以下操作:

$ pyenv install --list | grep " 3\.[678]"
  3.6.0
  3.6-dev
  3.6.1
  3.6.2
  3.6.3
  3.6.4
  3.6.5
  3.6.6
  3.6.7
  3.6.8
  3.7.0
  3.7-dev
  3.7.1
  3.7.2
  3.8-dev

上面显示了pyenv知道的所有与正则表达式匹配的Python版本。在这种情况下,这是所有可用的CPython版本3.6到3.8。

如果要查看所有软件的所有版本,可以执行以下操作:

$ pyenv install --list
...
# There are a lot

找到所需版本后,可以使用单个命令进行安装:

$ pyenv install -v 3.7.2
/tmp/python-build.20190208022403.30568 ~
Downloading Python-3.7.2.tar.xz...
-> https://www.python.org/ftp/python/3.7.2/Python-3.7.2.tar.xz
Installing Python-3.7.2...
/tmp/python-build.20190208022403.30568/Python-3.7.2 /tmp/python-build.20190208022403.30568 ~
[...]
Installing collected packages: setuptools, pip
Successfully installed pip-18.1 setuptools-40.6.2
Installed Python-3.7.2 to /home/realpython/.pyenv/versions/3.7.2

pyenv文档具有出色的安装说明以及有用的常见问题以及常见的构建问题

这将需要一段时间,因为pyenv是从源代码构建Python,但是一旦完成,你将在本地计算机上使用Python 3.7.2。如果你不想查看所有输出,只需删除-v标志。甚至可以安装CPython的开发版本:

$ pyenv install 3.8-dev

提示:如果你使用pyenv已有一段时间,但没有找到所需的版本,则可能需要运行pyenv update来更新该工具,并确保可以访问最新版本。

在本教程的其余部分中,示例假定你已经安装了3.6.8和2.7.15,但是你可以随意将这些值替换为实际安装的Python版本。还要注意,示例中的系统Python版本是2.7.12。

3.1、安装位置

如前所述,pyenv通过从源代码构建Python来工作。你安装的每个版本都位于pyenv根目录中:

$ ls ~/.pyenv/versions/
2.7.15  3.6.8  3.8-dev

你所有的版本都将位于此处。这很方便,因为删除这些版本很简单:

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

当然,pyenv还提供了用于卸载特定Python版本的命令:

$ pyenv uninstall 2.7.15

3.2、使用新的Python

现在,你已经安装了两个不同的Python版本,下面让我们看一些使用它们的基础知识。首先,检查可用的Python版本:

$ pyenv versions
* system (set by /home/realpython/.pyenv/version)
  2.7.15
  3.6.8
  3.8-dev

*表示系统Python版本当前处于活动状态。你还会注意到,这是由pyenv根目录中的文件设置的。这意味着,默认情况下,你仍在使用系统Python:

$ python -V
Python 2.7.12

如果你尝试使用哪个来确认,你将看到:

$ which python
/home/realpython/.pyenv/shims/python

这可能令人惊讶,但这就是pyenv的工作方式。 pyenv会将其自身插入PATH,从操作系统的角度来看,这是被调用的可执行文件。如果要查看实际路径,可以运行以下命令:

$ pyenv which python
/usr/bin/python

例如,如果你想使用版本2.7.15,则可以使用global命令:

$ pyenv global 2.7.15
$ python -V
Python 2.7.15

$ pyenv versions
  system
* 2.7.15 (set by /home/realpython/.pyenv/version)
  3.6.8
  3.8-dev

提示:让你放心,刚安装的Python版本正常运行的一种好方法是运行内置的测试套件:

$ pyenv global 3.8-dev
$ python -m test

这将启动许多内部Python测试,这些测试将验证你的安装。你可以放心观看测试通过,测试完成后有如下提示信息。

...
== Tests result: SUCCESS ==

390 tests OK.

24 tests skipped:
    test_asdl_parser test_clinic test_curses test_dbm_gnu
    test_dbm_ndbm test_devpoll test_gdb test_kqueue test_msilib
    test_ossaudiodev test_smtpnet test_socketserver test_startfile
    test_timeout test_tix test_tk test_ttk_guionly test_urllib2net
    test_urllibnet test_winconsoleio test_winreg test_winsound
    test_xmlrpc_net test_zipfile64

2 tests run no tests:
    test_dtrace test_future4

Total duration: 17 min 56 sec
Tests result: SUCCESS
...

如果你想返回默认的Python系统版本,则可以运行以下命令:

$ pyenv global system
$ python -V
Python 2.7.12

现在,你可以轻松地在不同版本的Python之间切换。这仅仅是开始。如果要切换的版本很多,那么连续键入这些命令将很麻烦。本节介绍了基础知识,但在多个环境中使用时,描述了更好的工作流程。

3.3、探索pyenv命令

pyenv提供了许多命令。你可以使用以下命令查看所有可用命令的完整列表:

$ pyenv commands
activate
commands
completions
deactivate
...
virtualenvs
whence
which

这将输出所有命令名称。每个命令都有一个--help标志,它将为你提供更多详细信息。例如,如果你想查看有关shims命令的更多信息,则可以运行以下命令:

$ pyenv shims --help
Usage: pyenv shims [--short]

List existing pyenv shims

帮助消息描述了该命令的用途以及可以与该命令结合使用的所有选项。在以下各节中,你将快速,概括地了解最常用的命令。

3.3.1、install

你已经在上面看到了install命令。该命令可用于安装特定版本的Python。例如,如果你想安装3.6.8,则可以使用以下命令:

$ pyenv install 3.6.8

输出显示了pyenv下载和安装Python。你可能要使用的一些常见标志如下:

标志描述
-l/–list列出所有可用的Python版本以进行安装
-g/–debug构建Python的调试版本
-v/–verbose详细模式:将编译状态打印到标准输出

3.3.2、versions

versions命令显示当前所有已安装的Python版本:

$ pyenv versions
* system (set by /home/realpython/.pyenv/version)
  2.7.15
  3.6.8
  3.8-dev

此输出不仅显示2.7.15、3.6.8、3.8-dev和system Python已安装,而且还显示system Python已处于活动状态。如果只关心当前的活动版本,则可以使用以下命令:

$ pyenv which pip
/home/realpython/.pyenv/versions/3.6.8/bin/pip

输出显示pip的完整系统路径。当你安装了命令行应用程序时,这将很有帮助。

3.3.3、global

global命令设置全局Python版本。可以用其他命令覆盖它,但是对于确保默认情况下使用特定的Python版本很有用。如果要默认使用3.6.8,则可以运行以下命令:

$ pyenv global 3.6.8

此命令将 ~/.pyenv/version 设置为3.6.8

3.3.4、local

local命令通常用于设置特定于应用程序的Python版本。你可以使用它将版本设置为2.7.15:

$ pyenv local 2.7.15

此命令在当前目录中创建一个.python-version文件。如果你的环境中有pyenv处于活动状态,则此文件将自动为你激活该版本。

3.3.5、shell

shell命令用于设置特定于外壳的Python版本。例如,如果要测试3.8-dev版本的Python,可以执行以下操作:

$ pyenv shell 3.8-dev

该命令激活通过设置PYENV_VERSION环境变量指定的版本。此命令将覆盖你可能拥有的所有应用程序或全局设置。如果要停用版本,可以使用--unset标志。

pyenv shell --unset

4、指定你的Python版本

pyenv最令人困惑的部分之一是python命令如何被准确解析以及可以使用哪些命令对其进行修改。如命令中所述,有3种方法可以修改你使用的python版本。那么所有这些命令如何相互交互?解析顺序看起来像这样:

在这里插入图片描述

该金字塔应从上至下阅读。 pyenv可以找到的第一个选项是它将使用的选项。让我们来看一个简单的例子:

$ pyenv global 3.6.8
$ pyenv versions
  system
  2.7.15
* 3.6.8 (set by /home/realpython/.pyenv/version)
  3.8-dev

你可以看到pyenv现在希望使用3.6.8作为我们的Python版本。它甚至指示找到的文件的位置。该文件确实存在,你可以列出其内容:

$ cat ~/.pyenv/version
3.6.8

现在,我们使用本地创建一个.python-version文件:

$ pyenv local 2.7.15
$ pyenv versions
  system
* 2.7.15 (set by /home/realpython/.python-version)
  3.6.8
  3.8-dev
$ ls -a
.  ..  .python-version
$ cat .python-version
2.7.15

再次,pyenv指出了它将如何解析我们的python命令。这次来自〜/.python-version。请注意,搜索.python-version是递归的:

$ mkdir subdirectory
$ cd subdirectory
$ ls -la # Notice no .python-version file
. ..
$ pyenv versions
  system
* 2.7.15 (set by /home/realpython/.python-version)
  3.6.8
  3.8-dev

即使子目录中没有.python-version,该版本仍设置为2.7.15,因为父目录中存在.python-version。那如何取消呢?

答案就是删除父目录的.python-version文件

rm -rf .python-version

最后,你可以使用shell设置Python版本:

$ pyenv shell 3.8-dev
$ pyenv versions
  system
  2.7.15
  3.6.8
* 3.8-dev (set by PYENV_VERSION environment variable)

所有这些都设置了$PYENV_VERSION环境变量:

$ echo $PYENV_VERSION
3.8-dev

注意shell设置的只对当前终端有效,当前终端关闭后,即失效!

如果你对这些选项感到不知所措,则下述有关《使用多个环境》的部分将介绍一个专心管理这些文件的过程,主要是使用local方法。

还有一点需要特别注意的,优先级顺序:shell > local > global,高优先级可以覆盖低优先级,但是低优先级不能覆盖高优先级!

5、虚拟环境和pyenv

虚拟环境是管理Python安装和应用程序的重要组成部分。如果你以前从未听说过虚拟环境,则可以查看《 Python虚拟环境:入门》。

虚拟环境和pyenv是天作之合。 pyenv有一个很棒的插件pyenv-virtualenv,使用多个Python版本和多个虚拟环境变得轻而易举。如果你想知道pyenvpyenv-virtualenvvirtualenvvenv之类的工具之间有什么区别,请不要担心。你不是一个人。

这是你需要了解的内容:

  • pyenv:管理Python本身的多个版本。
  • virtualenv/venv:管理特定Python版本的虚拟环境。
  • pyenv-virtualenv:管理跨不同版本的Python的虚拟环境。

如果你是顽固的virtualenv或venv用户,请不要担心:pyenv可以很好地与任何一个配合使用。实际上,你可以根据需要保留相同的工作流程,尽管我认为pyenv-virtualenv在需要使用不同Python版本的多个环境之间切换时会带来更好的体验。

好消息是,由于你使用pyenv-installer脚本安装pyenv,因此你已经安装了pyenv-virtualenv并可以使用。

5.1、创建虚拟环境

创建虚拟环境是一个命令:

$ pyenv virtualenv <python_version> <environment_name>

从技术上讲,<python_version>是可选的,但是你应该考虑始终指定它,以便确定所使用的Python版本。

<environment_name>只是一个名称,可帮助你将环境分开。好的做法是为你的环境命名与项目相同的名称。例如,如果你正在开发myproject并想针对Python 3.6.8进行开发,则可以运行以下命令:

$ pyenv virtualenv 3.6.8 myproject

输出中包含显示一些额外的Python软件包安装信息的消息,即wheelpipsetuptools。严格来说,这是为了方便起见,只是为你的每个虚拟环境设置了一个功能更全的环境。

5.2、激活虚拟环境

现在你已经创建了虚拟环境,下一步就是使用它。通常,你应该通过运行以下命令来激活环境:

pyenv local myproject

你之前已经看过pyenv local命令,但是这次,你没有指定Python版本,而是指定了环境。这将在当前工作目录中创建一个.python-version文件,并且由于你在环境中运行了$(pyenv virtualenv-init -),该环境将被自动激活。

你可以通过运行以下命令进行验证:

$ pyenv which python
/home/realpython/.pyenv/versions/myproject/bin/python

你可以看到已经创建了一个名为myproject的新版本,并且python可执行文件指向该版本。如果查看此环境提供的任何可执行文件,你将看到相同的内容。以pip为例:

$ pyenv which pip
/home/realpython/.pyenv/versions/myproject/bin/pip

如果你没有配置eval "$(pyenv virtualenv-init -)"在shell中运行,则可以使用以下方法手动激活/停用Python版本:

$ pyenv activate <environment_name>
$ pyenv deactivate

上面是pyenv-virtualenv进入或退出带有.python-version文件的目录时的操作。

注:在激活虚拟环境的时候,会有这样一句提示

pyenv-virtualenv: prompt changing will be removed from future release. configure `export PYENV_VIRTUALENV_DISABLE_PROMPT=1' to simulate the behavior.

6、使用多种环境

将你学到的所有知识放在一起,即可在多种环境中有效工作。假设你安装了以下版本:

$ pyenv versions
* system (set by /home/realpython/.pyenv/version)
  2.7.15
  3.6.8
  3.8-dev

现在,你要处理两个不同的,恰当地命名的项目:

  • 1、project1 supports Python 2.7 and 3.6.
  • 2、project2 supports Python 3.6 and experiments with 3.8-dev.

你可以看到,默认情况下,你使用的是系统Python,在pyenv版本输出中由*表示。首先,为第一个项目创建一个虚拟环境:

$ cd project1/
$ pyenv which python
/usr/bin/python
$ pyenv virtualenv 3.6.8 project1
...
$ pyenv local project1
$ python -V
/home/realpython/.pyenv/versions/project1/bin/python

最后,请注意,当你从目录中cd离开时,你将默认返回系统Python:

$ cd $HOME
$ pyenv which python
/usr/bin/python

你可以按照上述步骤为project2创建虚拟环境:

$ cd project2/
$ pyenv which python
/usr/bin/python
$ pyenv virtualenv 3.8-dev project2
...
$ pyenv local 3.8-dev
$ pyenv which python
/home/realpython/.pyenv/versions/3.8-dev/bin/python

这些是你项目的一个步骤。现在,当你在项目之间进行cd时,你的环境将自动激活:

$ cd project2/
$ python -V
Python 3.8.0a0
$ cd ../project1
$ python -V
Python 3.6.8

无需再记住要激活的环境:你可以在所有项目之间进行切换,而pyenv将负责自动激活正确的Python版本和正确的虚拟环境。

7、同时激活多个版本

如上面的示例中所述,project2使用3.8中的实验功能。假设你想确保你的代码仍可在Python 3.6上运行。如果你尝试运行python3.6,则会得到以下信息:

$ cd project2/
$ python3.6 -V
pyenv: python3.6: command not found

The `python3.6' command exists in these Python versions:
  3.6.8
  3.6.8/envs/project1
  project1

pyenv通知你,尽管Python 3.6在当前活动环境中不可用,但在其他环境中可用。 pyenv提供了一种使用熟悉的命令一次激活多个环境的方法:

$ pyenv local project2 3.6.8

这向pyenv表示你要使用虚拟环境project2作为第一个选项。因此,如果在两个环境中都可以解析命令(例如python),它将在3.6.8之前选择project2。让我们看看运行此命令会发生什么:

$ python3.6 -V
Python 3.6.8

在这里,pyenv尝试查找python3.6命令,并且由于它是在活动的环境中找到的,因此它允许命令执行。这对于诸如tox之类的工具非常有用,该工具要求PATH上必须有多个Python版本才能执行。

提示:如果你使用的是tox和pyenv,则应检出tox-pyenv软件包。

假设在上面的示例中,你发现了库的兼容性问题,并且希望进行一些本地测试。该测试要求你安装所有依赖项。你应该按照以下步骤创建新环境:

$ pyenv virtualenv 3.6.8 project2-tmp
$ pyenv local project2-tmp

对本地测试感到满意后,你可以轻松切换回默认环境:

$ pyenv local project2 3.6.8

8、总结

现在,你可以更轻松地为想要支持多个环境的项目做出贡献。你还可以使用一个出色的工具pyenv来更轻松地测试最新和最好的Python版本,而不必担心搞乱你的开发机器。

你已经了解了pyenv如何为你提供帮助:

  • 安装多个版本的Python
  • 在安装的版本之间切换
  • 在pyenv中使用虚拟环境
  • 自动激活不同的Python版本和虚拟环境

参考

ReCclay CSDN认证博客专家 视觉/OpenCV 图像处理 深度学习
生活不能等待别人来安排,要自己去争取和奋斗;而不论其结果是喜是悲,但可以慰藉的是,你总不枉在这世界上活了一场。有了这样的认识,你就会珍重生活,而不会玩世不恭;同时,也会给人自身注入一种强大的内在力量。
©️2020 CSDN 皮肤主题: 数字20 设计师:CSDN官方博客 返回首页