本文档翻译自官方文档pyenv/pyenv: Simple Python version management,英文水平有限,若有错漏之出,还望指正。

简单的Python版本管理:pyenv

pyenv让您轻松的切换多个版本的Python。它很简单、不显眼,并遵循UNIX的传统,使用单一用途的工具来完成一件事情。

这个项目从rbenvruby-build分叉(fork),并修改为Python。

20180203-pyenv

pyenv能…

  • 让你在每个用户的基础上修改全局Python版本
  • 每个项目的Pyhton版本提供支持。
  • 允许你使用环境变量覆盖Python版本
  • 一次从多个Python版本搜索命令。这可能对使用tox跨Python版本进行测试有帮助。

与pythonbrew和pythonz相反,pyenv不..

  • 取决于Python自身。pyenv由纯shell脚本编写的。没有Python的引导问题。
  • 需要加载到你的shell。相反,pyenv的shim方法通过在$PATH添加一个目录来工作。
  • 管理virtualenv。当然,你可以自己创建virtualenv,或pyenv-virtualenv来自动化这个进程。

目录

  • 如何工作
    • 认识PATH
    • 认识Shims
    • 选择Python版本
    • 定位Python安装
  • 安装
    • 基本的Github查看
      • 升级
      • Homebrew在MAC OS X上
      • 高级配置
      • 卸载Python版本
  • 命令参考
  • 开发

它如何工作?

在高级别上,pyenv使用注入到PATH的shim可执行程序拦截Python命令,确定您的应用程序制定了哪个Python版本,并将您的命令传递给正确的Python安装。

认识PATH

当你运行像pythonpip的命令时,您的操作系统会搜索一个目录列表来查找具有该名称的可执行文件。这个目录位于名为PATH的环境变量中,列表中的每个目录都用冒号分隔:

 /usr/local/bin:/usr/bin:/bin

PATH中的目录是从左到右搜索的,因此在列表开头的目录中匹配的可执行文件优先于另一个目录。在这个例子中,首先搜搜/usr/local/bin目录,然后是/usr/bin,再然后是/bin

认识Shims

pyenv通过在PATH前面插入一个shims目录来工作:

$(pyenv root)/shims:/usr/local/bin:usr/bin:/bin

通过一个称为rehashing的过程,pyenv在该目录中维护shims,以匹配每个已安装版本的Python中的每个Python命令-pyenvpip等等。

Shims是轻量级的可执行文件,只需将您的命令传递到pyenv。所以在安装pyenv的时候,当你运行的时候,比如说,pip,你的操作系统将会执行如下操作:

  • PATH中搜索名为pip的可执行文件。
  • 在你的PATH开始处找到名为pip的pyenv shim。
  • 运行名为pip的shim,它依次将命令传递给pyenv。

选择Python版本

当你执行一个shim时,pyenv通过从以下源读取它来确定使用哪个Python版本,顺序如下:

1、PYENV_VERSION环境变量(如果指定)。你可以使用pyenv shell命令在当前shell会话中设置此环境变量。 2.在当前目录中的特定于应用程序的.python-version(如果存在)。你可以使用pyenv local修改当前目录的.python-version文件。 3.通过搜索每个父目录,找到第一个.python-version文件(如果有),直到到达你的文件系统的根目录。 4.全局的$(pyenv root)/version文件。你可以使用pyenv global命令修改这个文件。如果全局版本文件不存在,pyenv假设你想要使用”system”的 Python。(换句话说,如果pyenv不在你的PATH中,任何版本都可以运行)。

注意:你可以同时激活多个版本,包括多个版本的Python2或Python3。这允许并行使用Python2和Python3,并且需要像tox这样的工具。例如,要设置你的路径,首先使用你的system的Python和Python3(在这个例子中设置为2.7.9和3.4.2),但是在您的PATH中也有Python3.3.4、3.2和2.5,你可以先pyenv install丢失的版本,然后设置yenv global system 3.3.6 3.2 2.5。在这一点上,应该能够使用pyenv which来找到每一个的完整可执行路径,例如pyenv which python2.5(应该显示$(pyenv root)/versions/2.5/bin/python2.5),或pyenv which python3.4(应显示系统Python3的路径)。你可以在一个.python-version文件中指定多个版本,通过换行符或任何空格分割。

定位Python安装

一旦pyenv已经确定了你的应用程序已经指定哪个版本的Python,它会将该命令一起传递给相应的Python安装。

每个Python版本都安装在$(pyenv root)/versions下的自己的目录中。

例如,你可能已经安装了这些版本:

  • $(pyenv root)/versions/2.7.8/
  • $(pyenv root)/versions/3.4.2/
  • $(pyenv root)/versions/pypy-2.4.0/

就pyenv而言,版本名称只是$(pyenv root)/versions中的目录。

管理虚拟环境

有一个名为pyenv-virtualenv的pyenv插件,它提供了各种功能来帮助pyenv用户管理由virtualenv或Anaconda创建的虚拟环境。由于这些虚拟环境的activate脚本依赖于用户交互式shell的可变$PATH变量,它将截取pyenv的shim式命令执行钩子。如果你有打算使用这些虚拟环境的计划,我们建议安装pyenv-virtual。

安装

若果你在Mac OS X,考虑installing with Homebrew

自动化安装程序

参考我的其他项目:https://github.com/pyenv/pyenv-installer

基本的Github查看

这将使你得到最新版本的pyenv,并很容易地fork和贡献任何改变回上游。

1.检查你想要安装的pyenv的位置*。一个好的选择是$HOME/.pyenv(但你可以把它安装在别的地方)。

$ git clone https://github.com/pyenv/pyenv.git ~/.pyenv

2.定义环境变量PYENV_ROOT以指向pyenv仓库被克隆的路径,并将$PYENV_ROOT/bin添加到您的$PATH以访问pyenv命令行的实用程序。

3.将pyenv init添加到您的shell以启用shims和autocompletion。请确保eval "$(pyenv init -)"放置在shell配置文件的末尾,因为它在初始化期间操作PATH

$ echo -e 'if command -v pyenv 1>/dev/null 2>&1; then\n  eval "$(pyenv init -)"\nfi' >> ~/.bash_profile

Zsh注意:修改你的~/.zshenv文件而不是~/.bash_profileUbuntu和Fedora注意:修改你的~/.bashrc文件而不是~/.bash_profile

一般警告:有一些系统BASH_ENV变量配置为指向.bashrc。在这样的系统,你几乎可以肯定地把上面提到的行eval "$(pyenv init -)"放到.bash_profile中,而不是放在.bashrc中。否则你可能会观察到奇怪的行为,如pyenv进入了无限循环。详情请参阅#264

4.重启你的shell来使路径的改变生效。你现在可以开始使用pyenv了。

$ exec "$SHELL"

5.将Python版本安装到$(pyenv root)/versions。例如,要下载并安装Python2.7.8,请运行:

$ pyenv install 2.7.8

注意:如果你需要通过配置选项来构建,请使用CONFIGURE_OPTS环境变量。 注意:如果你想使用代理(proxy)来下载,请使用http_proxyhttps_proxy环境变量。 注意:如果你在安装pyhton版本时遇到问题,请访问wiki页面Common Build Problems

升级

如果你已经按照上面的说明安装了pyenv,你可以随时用git升级你的安装。

要升级到pyenv的最新的开发版本,请使用git pull

$ cd $(pyenv root)
$ git pull

要升级到一个特定版本的pyenv,请查看相应的标签:

$ cd $(pyenv root)
$ git fetch
$ git tag
v0.1.0
$ git checkout v0.1.0

卸载pyenv

pyenv的简单性使很容易暂时禁用它,或者从系统中卸载。

1.要禁用pyenv管理您的Python版本,只需要从您的shell启动配置中移除pyenv init行。这将从PATH中移除pyenv shims目录,像python之类的未来的调用将执行系统的Python版本,如之前的pyenv。

pyenv仍可通过命令行访问,但是你的Python应用不会受到版本切换的影响。

2.要完全卸载pyenv,执行步骤(1),然后移除它的根目录。这将删除安装在$(pyenv root)/versions/目录下的所有Python版本:

  rm -rf $(pyenv root)

如果你已经使用安装包管理器安装了pyenv,作为最后一步执行pyenv安装包的移除。例如,对于Homebrew:

  brew uninstall pyenv

Homebrew在MAC OS X上

你也可以使用MAC OS X的Homebrew安装包管理器来安装pyenv。

$ brew update
$ brew install pyenv

在未来要升级pyenv,使用upgrede而不是install

然后按照上面Basic GitHub Checkout之后的其他安装步骤,从#3开始(“将pyenv init添加到你的shell中以启用shims和autocompletion”)。

高级配置

跳过这一节,除非你必须知道你的shell配置文件中每一行都在做什么。pyenv init是跨越加载额外命令到你的shell中的唯一命令。来自rvm,你们中的一些人可能会反对这个想法。这里pyenv init实际上做的事情:

  • 1.设置你的shims是路径。这是pyenv正常工作的唯一要求。你可以通过预先将$(pyenv root)/shims到你的$PATH来手动执行此操作。
  • 2.安装autocompletion。这完全是可选的,但是非常有用。源$(pyenv root)/completions/pyenv.bash将设置。Zsh的用户也有一个$(pyenv root)/completions/pyenv.zsh
  • 3.重新调整shims。有时你需要重建你的shim文件。在init中这样确保一切都是最新的。你总是可以手动运行pyenv rehash
  • 4.安装sh调度程序。这一点也是可选的,但是允许pyenv和插件改变当前shell的变量,使得像pyenv shell这样的命令称为可能。sh调度程序不做任何像修改cd或破坏你的shell提示符那样疯狂的事儿,但如果由于某种原因,你需要pyenv成为一个真正的脚本而不是shell函数,你可以安全地跳过它。

要确切地看到到底发生了什么,运行pyenv init -

卸载Python版本

随着时间的推移,你将在您的$(pyenv root)/versions目录中积累Python版本。

要移除旧的Python版本,请使用pyenv uninstall命令自动化移除过程。

或者,只需rm -rf你想要移除的版本的目录。你可以使用pyenv prefix命令找到特定Python版本的目录,例如pyenv prefix 2.6.8

命令参考

COMMANDS.md

环境变量

您可以通过以下设置来影响pyenv的运行方式:

名称 默认 描述
PYENV_VERSION   指定要使用的Python版本,另请参阅pyenv shell
PYENV_ROOT ~/.pyenv 定义Python版本和shims所在的目录。也可以参见
pyenv root    
PYENV_DEBUG   输出调试信息,如: pyenv --debug <subcommand>
PYENV_HOOK_PATH 见wiki 用冒号分隔的路径搜索pyenv钩子。
PYENV_DIR $PWD 目录开始搜索 .python-version 文件。
PYTHON_BUILD_ARIA2_OPTS   用于将其他参数传递给aria2.如果 aria2c 二进制在PATH上可用, pyenv使用aria2c而不是curlwget 来下载Python源代码。如果您的网络连接不稳定,您可以使用此变量来指示aria2加速下载。在大多数情况下,你只需要使用-x 10 -k 1M作为PYTHON_BUILD_ARIA2_OPTS环境变量的值。

开发

pyenv源代码托管在GitHub商行。它干净、模块化,易于理解,即使你不是一个shell黑客。

测试使用Bats执行:

$ bats test
$ bats/test/<file>.bats

请随时在issue跟踪器上提交pull请求和文件bug。 。