暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

使用pyenv管理多个Python版本(Ubuntu)

WHICH工作室 2020-10-22
1044


本文有以下几个部分:

1、为什么要使用pyenv?

2、安装pyenv

3、使用pyenv安装Python

4、指定你的Python版本

5、虚拟环境和pyenv

6、使用多种环境

7、同时激活多个版本



1、为什么要使用pyenv



pyenv是管理多个Python版本的绝佳工具。即使您已经在系统上安装了Python,也值得安装pyenv以便您可以轻松地尝试新的语言功能或帮助为使用其他版本的Python的项目做出贡献。

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

那么,为什么不使用系统Python呢?一种看待它的方式是该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等。毕竟,这就是将大多数
      软件包(https://realpython.com/python-modules-packages/)安装到系统的方式。不幸的是,使用包管理器会发现一些相同的问题。

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

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

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

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


      pyenv可以帮助你完成以下工作:

      ·       1、在用户空间中安装Python

      ·       2、安装多个版本的Python

      ·       3、指定所需的确切Python版本

      ·       4、在安装的版本之间切换


      2、安装pyenv

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

      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

        2.2、使用pyenv-installer

        安装了构建依赖项后,即可准备安装pyenv本身。建议使用pyenv-installer项目(https://github.com/pyenv/pyenv-installer):

          $ curl https://pyenv.run | bash

          若使用的shellzsh,则应该使用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:自动查找系统命令插件


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

            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 -)"


            按照上述说明将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可供选择。如果要查看所有可用的CPython3.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文档(https://github.com/pyenv/pyenv)具有出色的安装说明(以及有用的常见问题(https://github.com/pyenv/pyenv/wiki)以及常见的构建问题(https://github.com/pyenv/pyenv/wiki/Common-build-problems)。

                        这将需要一段时间,因为pyenv是从源代码构建Python。如果你不想查看所有输出,只需删除-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

                                                 

                                                 

                                                 

                                                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和systemPython已安装,而且还显示systemPython已处于活动状态。如果只关心当前的活动版本,则可以使用以下命令:

                                                          $ 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虚拟环境:入门》(https://realpython.com/python-virtual-environments-a-primer/)。

                                                                              虚拟环境和pyenv是天作之合。pyenv有一个很棒的插件pyenv-virtualenv,使用多个Python版本和多个虚拟环境变得轻而易举。

                                                                              关于pyenv,pyenv-virtualenv和virtualenv或venv之类的工具之间的区别:

                                                                              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软件包安装信息的消息,即wheel,pip和setuptools。严格来说,这是为了方便起见,只是为你的每个虚拟环境设置了一个功能更全的环境。

                                                                                  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文件的目录时的操作。

                                                                                           

                                                                                          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 virtualenv3.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 -VPython 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 Pythonversions:
                                                                                                      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.8project2-tmp
                                                                                                            $ pyenv local project2-tmp


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

                                                                                                              $ pyenv local project2 3.6.8



                                                                                                              参考

                                                                                                              Managing Multiple Python Versions With pyenv(https://realpython.com/intro-to-pyenv/)




                                                                                                              文章转载自WHICH工作室,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

                                                                                                              评论