• pyenv 入门介绍


    pyenv

    pyenv 可以帮助你在开发或者生产环境里安装和管理多个 Python 版本。这对于 Python 开发者而言非常有用。

    比如在 Ubuntu 12.04 上(这个版本的 Ubuntu 曾经非常流行,至今仍然驱动了很多重要系统),系统自带的 Python 版本是 2.7.6。而这个版本的 Python 缺乏对一个重要的 SSL 功能的支持—— Server Name Indication,简称 SNI。这样当你在使用如 requests 这样的 HTTP 库访问一些 HTTPS API 时,就会遇到证书错误。

    对 SNI 的支持是在 Python 2.7.9 时从 Python 3 里 backport 过来的。而借助 pyenv,我们就可以在一些非常古老或者不方便升级 Python 版本的系统里用上最新版本的 Python,同时完全不会影响到系统自带的 Python 版本。

    这是在 Ubuntu Linux 上使用 pyenv 安装 Python 2.7.14 (本文写作时 Python 2 的最新版本)的步骤:

    首先安装一些必要的工具和支持库:

    sudo apt-get install git build-essential libreadline-dev libsqlite3-dev libbz2-dev libssl-dev zlib1g-dev
    

    然后获得 pyenv 的最新版本:

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

    然后在 .bashrc 中添加三行指令,让系统可以找到 pyenv 安装的 Python:

    echo 'export PYENV_ROOT="$HOME/.pyenv"' >> ~/.bashrc
    echo 'export PATH="$PYENV_ROOT/bin:$PATH"' >> ~/.bashrc
    echo -e 'if command -v pyenv 1>/dev/null 2>&1; then
      eval "$(pyenv init -)"
    fi' >> ~/.bashrc
    

    之后你需要重启你的 shell 来让上面添加的 3 条指令生效。你可以登出再登录,或者简单的执行下面这个指令:

    exec $SHELL
    

    然后就可以用 pyenv 安装你需要的任何 Python 版本了,比如 2.7.14:

    pyenv install 2.7.14
    

    安装完成之后,你可以通过这条指令查看目前系统里所有的 Python 版本:

    pyenv versions
    

    你可以把某个版本设置为全局使用:

    pyenv global 2.7.14
    

    或是只对当前所在目录生效:

    pyenv local 2.7.14
    

    如果是设置为只对当前目录有效,那么在当前目录下会产生一个名为 .python-version 的文件,其中的内容是版本号。pyenv 就是根据这个文件的内容来确定当前目录应该使用哪个版本的 Python。

    关于 pyenv 的完整文档你可以在这里看到:

    https://github.com/pyenv/pyenv

    在工作开发中,一直使用 virtualenv 来管理python的包环境。很好的解决了不同项目使用不同python包的需求。对于多python版本的问题如何解决一直无解,虽然可以安装多个

    版本的python,靠绝对路径或靠创建虚拟环境的时候指定python(virtualenv -p)版本来解决,但总感觉不是那么的优雅。同事推荐了 pyenv ,一直没用过,特从网上找了些资料试着配置了下,记录如下。

    pyenv vs virtualenv

    pyenv 是针对 python 版本的管理,通过修改环境变量的方式实现;

    virtualenv 是针对python的包的多版本管理,通过将python包安装到一个模块来作为python的包虚拟环境,通过切换目录来实现不同包环境间的切换。

    pyenv 原理

    pyenv 的美好之处在于,它并没有使用将不同的 $PATH 植入不同的 shell 这种高耦合的工作方式,而是简单地在 $PATH 的最前面插入了一个垫片路径(shims):~/.pyenv/shims:/usr/local/bin:/usr/bin:/bin。所有对 Python 可执行文件的查找都会首先被这个 shims 路径截获,从而架空了后面的系统路径。

    pyenv 安装使用

    自动安装

    pyenv 提供了自动安装的工具,执行命令安装即可:

    需保证系统有 git ,否则需要新安装git工具。

    手动安装

    将 pyenv 检出到你想安装的目录。建议路径为:$HOME/.pyenv

    添加环境变量。PYENV_ROOT 指向 pyenv 检出的根目录,并向 $PATH 添加 $PYENV_ROOT/bin 以提供访问 pyenv 这条命令的路径

    这里的 shell 配置文件(~/.bash_profile)依不同 Linux 而需作修改——Zsh:~/.zshenv;Ubuntu:~/.bashrc

    向 shell 添加 pyenv init 以启用 shims 和命令补完功能

    配置文件的位置同上一条一样需要修改

    重启 shell(因为修改了 $PATH)

    pyenv 常用命令

    python配置

    • $ pyenv versions — 查看系统当前安装的python列表
    • $ pyenv install -v 3.5.1 — 安装python
    • $ pyenv uninstall 2.7.3 — 卸载python
    • $ pyenv rehash — 创建垫片路径(为所有已安装的可执行文件创建 shims,如:~/.pyenv/versions/*/bin/*,因此,每当你增删了 Python 版本或带有可执行文件的包(如 pip)以后,都应该执行一次本命令)

    python切换

    • $ pyenv global 3.4.0 — 设置全局的 Python 版本,通过将版本号写入 ~/.pyenv/version 文件的方式。
    • $ pyenv local 2.7.3 — 设置面向程序的本地版本,通过将版本号写入当前目录下的 .python-version 文件的方式。通过这种方式设置的 Python 版本优先级较 global 高。
      pyenv 会从当前目录开始向上逐级查找 .python-version 文件,直到根目录为止。若找不到,就用 global 版本。
    • $ pyenv shell pypy-2.2.1 — 设置面向 shell 的 Python 版本,通过设置当前 shell 的 PYENV_VERSION 环境变量的方式。这个版本的优先级比 local 和 global 都要高。–unset 参数可以用于取消当前 shell 设定的版本。
    • $ pyenv shell --unset

    python优先级

    shell > local > global

    pyenv 插件: pyenv-virtualenv

    安装

    使用自动安装pyenv 后,它会自动安装部分插件,通过pyenv-virtualenv 插件可以很好的和 virtualenv 结合:

    使用

    • 创建虚拟环境 $ pyenv virtualenv 2.7.10 my-virtual-env-2.7.10
      若不指定python 版本,会汇报认使用当前环境python版本。
    • 列出当前虚拟环境 pyenv virtualenvs
    • 激活虚拟环境 pyenv activate
    • 退出虚拟环境 pyenv deactivate
    • 删除虚拟环境 pyenv uninstall my-virtual-env

    使用pyenv 来管理python,使用 pyenv-virtualenv 插件来管理多版本 python包。

    此时,还需注意,当我们将项目运行的 env 环境部署到生产环境时,由于我们的python 包是依赖python 的,需要注意生产环境的python版本问题(详见 这里)。

    以上为个人拙见,欢迎小伙伴们留言交流。小伙伴们若有更好的python 多版本环境管理方案,希望留言不吝赐教,在此,先谢过了!

  • 相关阅读:
    econtrol窗体设计器
    脚本引擎注册将要使用的类,属性,方法,函数
    FastReport开发手册
    控制钱箱,客显,打印
    Laravel渴求式加载(比较容易理解理解load与with关系)
    50分钟学会Laravel 50个小技巧(基于laravel5.2,仅供参考)
    日期选择器date、week、time、datetime、datetimelocal类型
    input type=date时,时间数据回填,报错The specified value "2019040418" does not conform to the required format...
    Laravel技巧:使用load、with预加载 区别
    arcengine,C#实现分页打印预览
  • 原文地址:https://www.cnblogs.com/yizhixuepython/p/9252088.html
Copyright © 2020-2023  润新知