V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
推荐学习书目
Learn Python the Hard Way
Python Sites
PyPI - Python Package Index
http://diveintopython.org/toc/index.html
Pocoo
值得关注的项目
PyPy
Celery
Jinja2
Read the Docs
gevent
pyenv
virtualenv
Stackless Python
Beautiful Soup
结巴中文分词
Green Unicorn
Sentry
Shovel
Pyflakes
pytest
Python 编程
pep8 Checker
Styles
PEP 8
Google Python Style Guide
Code Style from The Hitchhiker's Guide
Livid
V2EX  ›  Python

pyenv 入门介绍

  •  7
     
  •   Livid · 2018-01-05 09:05:05 +08:00 · 24124 次点击
    这是一个创建于 2543 天前的主题,其中的信息可能已经有所发展或是发生改变。

    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\n  eval "$(pyenv init -)"\nfi' >> ~/.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

    52 条回复    2020-04-08 16:30:13 +08:00
    HFcbyqP0iVO5KM05
        1
    HFcbyqP0iVO5KM05  
       2018-01-05 09:16:21 +08:00 via Android
    已经是我 Python 开发环境下必用的工具
    XIVN1987
        2
    XIVN1987  
       2018-01-05 09:23:15 +08:00
    virtualenv、pyenv、pipenv,,工具太多,都搞糊涂了,,还是继续用古老的 virtualenv 吧先(╥╯^╰╥)
    qq976739120
        3
    qq976739120  
       2018-01-05 09:25:32 +08:00
    推荐 anaconda,简直懒人必备
    mimzy
        4
    mimzy  
       2018-01-05 09:32:44 +08:00
    配合 https://github.com/pyenv/pyenv-virtualenv 风味更佳

    解决阿里云 pyenv 无法下载的问题 /t/256328

    @qq976739120 #3 pyenv install anaconda3-5.0.1
    est
        5
    est  
       2018-01-05 09:33:50 +08:00
    推荐直接 miniconda3
    quinoa42
        6
    quinoa42  
       2018-01-05 09:36:07 +08:00
    再安利下 neovim 调用 pyenv: https://github.com/zchee/deoplete-jedi/wiki/Setting-up-Python-for-Neovim
    我的相关配置:
    ```
    if has("nvim")
    let g:python_host_prog = $HOME . "/.pyenv/versions/neovim2/bin/python"
    let g:python3_host_prog = $HOME . "/.pyenv/versions/neovim3/bin/python"
    endif
    ```

    ```
    " use flake8 installed at the virtualenv for neovim
    let g:ale_python_flake8_executable = $HOME . "/.pyenv/versions/neovim3/bin/flake8"
    let g:ale_python_flake8_use_global = 1
    " use yapf installed at the virtualenv for neovim
    let g:ale_python_yapf_executable = $HOME . "/.pyenv/versions/neovim3/bin/yapf"
    let g:ale_python_yapf_use_global = 1
    " use isort installed at the virtualenv for neovim
    let g:ale_python_isort_executable = $HOME . "/.pyenv/versions/neovim3/bin/isort"
    let g:ale_python_isort_use_global = 1
    ```
    Livid
        7
    Livid  
    MOD
    OP
       2018-01-05 09:37:19 +08:00   ❤️ 4
    @quinoa42 抱歉目前回复里暂时还不能渲染 Markdown。这个我们会尽快支持的。

    不过相信这里很多人都已经有人脑渲染 MD 的能力了。
    onlyice
        8
    onlyice  
       2018-01-05 09:39:42 +08:00
    推荐 anaconda +1,pyenv 是自己下源码编,某些情况下可能不如 anaconda 直接编好的二进制分发
    sikariba
        9
    sikariba  
       2018-01-05 09:40:26 +08:00
    还是 anaconda 爽
    rogwan
        10
    rogwan  
       2018-01-05 09:48:38 +08:00 via Android
    新版 pycharm 里面可以自动设置 pyenv 吗?(默认支持的是 virtualenv )
    javlib
        11
    javlib  
       2018-01-05 09:53:04 +08:00   ❤️ 1
    分享一个安装方面的技巧:
    pyenv install 命令会先去 python 官网下载对应的版本包,然后编译安装。因为网络缘故,在国内下载非常慢,有时候甚至被墙,这时候可以把以前下载的 python 安装包(后缀是'tar.xz')放在$PYENV_ROOT/cache 下,可以跳过下载。
    bomb77
        12
    bomb77  
       2018-01-05 09:58:47 +08:00   ❤️ 1
    @rogwan PERFERENCE 里的 project interpreter 设置成 pyenv 里安装的 python 环境就可以,包括 pyenv virtualenv 也可以
    一般类似~/.pyenv/versions/3.6.3/bin/python 这样子
    rogwan
        13
    rogwan  
       2018-01-05 10:07:41 +08:00 via Android
    @bomb77 好的,谢谢
    rogwan
        14
    rogwan  
       2018-01-05 10:10:43 +08:00 via Android
    @javlib 这个很重要啊,用 pip 安装都是选国内清华或豆瓣的源,否则大点的包根本安装不上
    korvin
        15
    korvin  
       2018-01-05 10:17:18 +08:00   ❤️ 1
    @javlib 直接用国内的源,速度快的一批,自用科大,我记得 v2 好像也有源
    中国科学技术大学: https://mirrors.tuna.tsinghua.edu.cn/pypi/web/simple/
    清华大学 TUNA: https://pypi.tuna.tsinghua.edu.cn/simple
    豆瓣: https://pypi.douban.com/simple
    rogwan
        16
    rogwan  
       2018-01-05 10:19:13 +08:00 via Android
    @korvin 科大的地址是不是粘错了?
    korvin
        17
    korvin  
       2018-01-05 10:19:48 +08:00
    @korvin
    @javlib 貌似回复错了,你说的是 pyenv install,我回了个 pip install
    korvin
        18
    korvin  
       2018-01-05 10:20:42 +08:00
    @rogwan 没有错,我自己在用,而且点击打开的页面也没错
    forever139
        19
    forever139  
       2018-01-05 10:27:26 +08:00
    一直在生产上的 python2 用 pyenv + virtualenv 的插件,这样可以用一个 pyenv 既可以管理不同 python 版本,又可以管理不同虚拟环境。
    不知道现在有人在生产上用 python3 的 venv 来管理的吗?也不知道最佳实践是怎样的。
    所以我现在生产上的 python3 还是用 pyenv 来管理
    qsnow6
        20
    qsnow6  
       2018-01-05 10:37:05 +08:00
    习惯用 pyenv 吧,自带的 venv 没有太多资料,用不习惯
    raysonx
        22
    raysonx  
       2018-01-05 10:48:41 +08:00
    pyenv virtualenv 万年不支持路径中带空格
    mulog
        23
    mulog  
       2018-01-05 10:52:53 +08:00
    pyenv + virtualenv 插件的确好用 已经成为我的必备工具了
    发现有不少好东西都是从 ruby 那边过来的 比如 pyenv <- rbenv
    wellsc
        24
    wellsc  
       2018-01-05 10:53:15 +08:00
    virtualenv 足够了
    usenix
        25
    usenix  
       2018-01-05 10:54:43 +08:00
    刚把 pyenv 卸载了,用上了 pipenv。。。
    flowfire
        26
    flowfire  
       2018-01-05 11:27:52 +08:00
    python 用的不多,是不是类似于 python 版的 nvm。。。
    yanchao7511461
        27
    yanchao7511461  
       2018-01-05 11:31:25 +08:00
    我用 conda
    duoglas
        28
    duoglas  
       2018-01-05 11:35:12 +08:00
    @Livid 咋知道我们已经有人脑渲染的能力了 这么隐秘的事情竟然被你发现了
    SuperMild
        29
    SuperMild  
       2018-01-05 11:38:10 +08:00
    能用 conda 的解决就尽量用 conda,conda 环境隔离得很彻底,安装库也方便
    okampfer
        30
    okampfer  
       2018-01-05 11:39:17 +08:00
    @Livid 我来一波人脑渲染

    `**env`系的工具有:
    * [rbenv]( https://github.com/rbenv/rbenv)
    * [nodenv]( https://github.com/nodenv/nodenv)
    * [goenv]( https://github.com/syndbg/goenv), github 上名字叫 goenv 的好几个 (推荐使用[gvm]( https://github.com/moovweb/gvm)代替)
    * [jenv]( https://github.com/gcuisinier/jenv) (个人感觉还是用 homebrew/linuxbrew 安装后设定 JAVA_HOME 更方便直接)

    个人感觉`**env`系的比`**vm`系的更好用。
    gclove
        31
    gclove  
       2018-01-05 11:39:38 +08:00
    能用 anaconda 就用 anaconda = = 只会用 conda 和 virtualenv
    okampfer
        32
    okampfer  
       2018-01-05 11:43:24 +08:00
    @usenix pipenv 是跟 pipfile 配合使用而且目的跟 pyenv 不一样,前者管理 python 项目依赖,后者管理 python 版本。


    @SuperMild anaconda 体积太大。。。公司电脑 SSD 太小伤不起,miniconda 感觉也不小啊。。。
    Muninn
        33
    Muninn  
       2018-01-05 11:53:06 +08:00
    python3.3 后就自带 pyvenv 了 从那以后我就懒得额外安装 virtualenv 了
    alber1986
        34
    alber1986  
       2018-01-05 11:54:10 +08:00
    python 系列视频教程,学习的来看看
    http://www.sucaihuo.com/video/172-0-0
    ClutchBear
        35
    ClutchBear  
       2018-01-05 12:13:00 +08:00
    pyenv 安装 anaconda 速度慢的话,
    可以去官网下载.sh 的安装脚本,
    安装完后, 把 anaconda 目录拷贝到 .pyenv/versions 里面
    在终端执行一次, pyenv rehash
    emdoe
        36
    emdoe  
       2018-01-05 12:30:36 +08:00 via Android
    @Livid 有没有推荐的插件可以帮助人脑渲染增加 highlight 功能的说 :-D
    jowuIM
        37
    jowuIM  
       2018-01-05 12:30:41 +08:00
    用过 pyenv 的基本功能,感觉并没有很优秀。
    但是有的,用起来就如官方说的命令比较接近 node,也就是习惯 node 的人会比较喜欢
    Anybfans
        38
    Anybfans  
       2018-01-05 13:16:09 +08:00
    推荐使用 pipenv 感觉不错~
    yexiaoxing
        39
    yexiaoxing  
       2018-01-05 13:17:40 +08:00 via iPhone
    @korvin 你贴的科大的地址是清华 TUNA 的。科大是这个 http://mirrors.ustc.edu.cn/pypi/
    korvin
        40
    korvin  
       2018-01-05 14:03:06 +08:00
    @yexiaoxing 用了这么久我竟然没发现写错了
    不过科大的最终 pip 可用地址应该是 https://mirrors.ustc.edu.cn/pypi/web/simple/
    fewtime
        41
    fewtime  
       2018-01-05 18:44:15 +08:00
    现在不是流行用 pipenv 吗
    yexiaoxing
        42
    yexiaoxing  
       2018-01-05 21:10:39 +08:00 via iPhone
    @korvin 反正 tuna 和 ustclug 是一对好基友(
    korvin
        43
    korvin  
       2018-01-05 21:20:48 +08:00
    vivisidea
        44
    vivisidea  
       2018-01-05 21:39:14 +08:00
    不是直接 docker 走起么:D
    tcitry
        45
    tcitry  
       2018-01-05 22:39:08 +08:00
    还用 virtualenv 的原因是可以直接在项目里打开三方库查看源码。。
    ChangHaoWei
        46
    ChangHaoWei  
       2018-01-06 07:27:51 +08:00
    pyenv , pyenv virtualenv,这不是可以一起用?
    @tcitry
    sunwei0325
        47
    sunwei0325  
       2018-01-06 21:41:53 +08:00
    我推荐 pipenv 和 virtualenvwrapper
    moogle
        48
    moogle  
       2018-01-07 09:48:57 +08:00 via iPhone
    pyenv , pyenv virtualenv 我一直搞不明白这两个区别在哪里,什么情况下用哪个?
    Seymer
        49
    Seymer  
       2018-01-09 16:01:27 +08:00
    Mac OS 下安装可能会报错:zipimport.ZipImportError: can't decompress data; zlib not available

    目前找到的解决方案是:

    CFLAGS="-I$(brew --prefix openssl)/include -I$(xcrun --show-sdk-path)/usr/include" \
    LDFLAGS="-L$(brew --prefix openssl)/lib" \
    pyenv install -v 3.5.0

    但是并没有实质性解决问题,安装其他版本仍需上面第一二行,不知道有没有其他方案?

    参考链接:
    https://github.com/pyenv/pyenv/issues/451
    https://github.com/pyenv/pyenv/issues/448
    nlimpid
        50
    nlimpid  
       2018-01-11 10:05:12 +08:00
    pyenv 我的理解是个 python 版本管理器,它的目的更多的是为了方便测试,比如代码在 2 和 3 的环境运行的结果。而后者其实独立多个项目的 python 环境的作用,每一个新的项目的环境(除了版本,更多的是依赖包)都是独立,并且现在应该都在推 pipenv。
    @moogle
    xrlin
        51
    xrlin  
       2018-02-27 16:05:21 +08:00 via iPhone   ❤️ 1
    anaconda +1
    Mark24
        52
    Mark24  
       2020-04-08 16:30:13 +08:00
    https://github.com/asdf-vm/asdf

    管理所有语言的版本管理。( python 还是用了 pyenv )收窄了入口,也不用担心污染自己的 zshrc
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   841 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 28ms · UTC 20:59 · PVG 04:59 · LAX 12:59 · JFK 15:59
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.