about 1 results (0.02 seconds)

Python版本管理之pyenv

by LauCyun Jul 22,2016 07:53:33 8,673 views

经常遇到这样的情况:

  • 系统自带的 Python 是 2.6,自己需要 Python 2.7 中的某些特性;
  • 系统自带的 Python 是 2.x,自己需要 Python 3.x;

此时需要在系统中安装多个 Python,但又不能影响系统自带的 Python,即需要实现 Python 的多版本共存。pyenv 就是这样一个 Python 版本管理器。

0x0 准备

pyenv将尽力下载和编译所需的Python版本,但由于未满足的系统依赖关系,编译失败,或者编译成功,但新的Python版本在运行时显示出奇怪的错误。以下说明是我们针对正确构建环境的建议。

  • Mac OS X:

    需要安装Xcode命令行工具和Homebrew

    • Xcode命令行工具安装命令:

       xcode-select --install
    • Homebrew安装命令:

      /usr/bin/ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"

    然后:

    #可选,但推荐:
    brew install openssl readline xz
  • Ubuntu/Debian/Mint:

    sudo apt-get install -y git make build-essential libssl-dev zlib1g-dev libbz2-dev libreadline-dev libsqlite3-dev wget curl llvm libncurses5-dev xz-utils tk-dev
  • CentOS/Fedora 21 and below:

    FIXME:您可能需要安装xz来构建一些CPython版本

    sudo yum install -y git gcc zlib-devel bzip2 bzip2-devel readline-devel sqlite sqlite-devel openssl-devel tk-devel

其它系统环境的问题,在https://github.com/pyenv/pyenv/wiki查找即可。

0x1 安装 pyenv

第1步:下载pyenv到$HOME/.pyenv目录下,也可以选择其它目录。

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

或者使用pyenv-installer

$ curl -L https://raw.githubusercontent.com/pyenv/pyenv-installer/master/bin/pyenv-installer | bash

第2步:定义环境变量PYENV_ROOT以指向pyenv的路径,并将$PYENV_ROOT/bin添加到$PATH以访问pyenv命令行实用程序。

$ echo 'export PYENV_ROOT="$HOME/.pyenv"' >> ~/.bash_profile
$ echo 'export PATH="$PYENV_ROOT/bin:$PATH"' >> ~/.bash_profile
  • Zsh注意:

    把上面命令中的~/.bash_profile修改为~/.zshrc或者~/.zshenv,建议使用zshrc(zsh默认启动会执行该脚本)。

  • UbuntuFedora注意:

    把上面命令中的~/.bash_profile修改为~/.bashrc

  • OSX注意:

    一般会用bash终端和zsh终端,如何查询自己用了哪个终端,在终端中输入命令:

    $ echo $SHELL
    /bin/bash

第3步:将pyenv init添加到shell中。 请确保将eval "$(pyenv init -)"放置在shell配置文件的末尾,因为它在初始化期间操作PATH 。

$ echo 'eval "$(pyenv init -)"' >> ~/.bash_profile
  • Zsh注意:

    把上面命令中的~/.bash_profile修改为~/.zshenv或者~/.zshrc

  • UbuntuFedora注意:

    把上面命令中的~/.bash_profile修改为~/.bashrc

第4步:重新启动shell,以使路径更改生效。

$ exec $SHELL


图1 安装pyenv

0x2 安装python

1 查看可安装的版本

$ pyenv install --list

该命令会列出可以用 pyenv 安装的 Python 版本。列表很长,仅列举其中几个:

$ pyenv install --list
Available versions:
  2.1.3
  2.2.3
  ...
  2.7.11
  2.7.12
  2.7.13
  ...
  3.4.6
  ...
  3.5.3
  3.6.0
  ...
  3.6.2
  ...
  anaconda2-4.4.0
  ...
  anaconda3-4.4.0
  ...
  stackless-3.4.2

其中 2.7.13 和 3.5.3 这种只有版本号的是 Python 官方版本,其他的形如 anaconda2-4.4.0这种既有名称又有版本后的属于“衍生版” 或发行版。

如果在MacOS High Sierra 10.13.6中出现如图2所示的错误:


图2 MacOS High Sierra 10.13.6中安装失败

请参考https://stackoverflow.com/questions/51551557/pyenv-build-failed-installing-python-on-macos中的方法。

2 安装指定版本

用户可以使用 pyenv install 安装指定版本的 python。

$ pyenv install 3.5.3  // 安装python3.5.3


图3 安装python3.5.3

0x3 查看安装的Python

安装完之后,需要更新一下才能看到已经安装的版本

$ pyenv rehash
$ pyenv versions //查看已经安装好的版本,带*号的为当前使用的版本

0x4 选择python版本

$ pyenv global 3.5.3 // 设置全局版本,即系统使用的将是此版本
$ pyenv local 3.5.3  // 当前目录下的使用版本,有点类似virtualenv


图4 使用Python3.5.3

0x5 更新pyenv

有时pyenv很久之前安装的,而新的Python版本不可选择,所以需要更新pyenv,命令如下:

$ pyenv update

至于其它命令可在https://github.com/pyenv/pyenv/blob/master/COMMANDS.md查阅。

0x6 Issues

1 .pyenv/libexec/pyenv line 43: cd: xxx.py: Not a directory

$ cat test1.py
#!/usr/bin/env python
print("hello")

$ chmod +x test1.py
$ ln -s test1.py test2
$ ./test2
/home/laucyun/.pyenv/libexec/pyenv: line 43: cd: test1.py: Not a directory
hello

在pyenv的src目录中运行./configure && make ,将生成libexec/pyenv-realpath.dylib并解决该问题。

0x7 更新历史

Jul 22,2016:第一版本;

Jul 23,2017:例子中Python版本号修改为Python3.5.3,添加 pyenv-installer 安装;

Jul 1,2018:添加pyenv命令;

Aug 11, 2018:添加在MacOS High Sierra 10.13.6中安装失败的解决方法;

Nov 30,2018:添加Issues。

...

Tags Read More..