查看原文
其他

mac下利用pyenv管理多个版本的python

雇个城管打天下 01二进制 2019-05-25

前言

经常遇到这样的情况:

  • 系统自带的Python是2.x,自己需要Python 3.x;

  • 某些机器学习的框架(如PaddlePaddle/Tensorflow)需要的版本是python3.5,但是你的系统支持的python版本较高,且无法删除(因为某些软件会和python产生依赖)

此时需要在系统中安装多个Python,但又不能影响系统自带的Python,即需要实现Python的多版本共存。pyenv就是这样一个Python版本管理器。pyenv可以进行全局的 Python 版本切换,也可以给单个项目提供对应的 Python 版本。用了 「pyenv」以后,就可以很容易的安装不同的 Python 版本,不同版本之间的切换也变得 so easy。

注意

Pyenv只会管理通过Pyenv安装的Python版本,你自己在Python官网上下载的直接安装的Pyenv 并不能被管理!!!同样除了系统自带的python包外, 其他直接安装的python包是 识别不出来的,即使使用的brew安装的也识别不出来.

pyenv的安装

  1. 安装工具:brew

  2. 系统环境: 

通过homebrew安装

  1. brew install pyenv

但是github提示了一句话

After installation, you'll need to addeval"$(pyenv init -)"to your profile (as stated in the caveats displayed by Homebrew — to display them again, usebrew info pyenv). You only need to add that to your profile once.

意思就是说我们需要在profile文件里面添加一句

  1. eval "$(pyenv init -)"

博主亲测,如果没有这一步,后面执行 pyenvglobal[version]是不会成功的

编辑.bash_profile文件

在终端中输入如下命令,进入当前用户的Home目录

  1. cd ~

输入如下命令,打开.bash_profile文件

  1. open .bash_profile

如不存在,则输入如下命令,创建文件

  1. touch .bash_profile

编辑文件

  1. open -e .bash_profile

在弹出的.bash_profile文件中新增

  1. eval "$(pyenv init -)"

command + s 保存文件,然后在终端中输入如下命令,刷新之前配置的.bash_profile文件.

  1. source .bash_profile

验证pyenv是否安装成功

执行如下命令:

  1. pyenv --help

上面命令行的意思是获取 prenv 的帮助信息。

pyenv的常用命令

上图是官方文档中的例子,以下是整理的一些pyenv的常用命令,如果想要查看完整命令列表,可以点击查看pyenv命令列表

  • 查看pyenv支持哪些Python版本

  1. pyenv install --list

  • 查看已经安装的python版本

  1. pyenv versions

  • 查看当前使用的python版本

  1. pyenv version

  • 安装一个python版本如3.5.6

  1. pyenv install 3.5.6

  • 安装完成之后需要对数据库进行更新:

  1. pyenv rehash

  • 卸载一个python版本如3.5.6

  1. pyenv uninstall  3.5.6

  • 设置全局python版本如3.5.6

  1. pyenv global 3.5.6

  2. //很多人不推荐这么做,说是mac操作系统的文件也会调用原生的2.7的python版本

  3. //这种说法感觉有点:恐惧来自未知的感觉.持保留意见

  • 这个时候确认一下当前python的版本

发现已经更改为3.5.6了

  • 设置目录级python版本如3.5.6

  1. pyenv local 3.5.6

  • 为当前shell会话设置python版本如3.5.6

  1. pyenv shell 3.5.6

常见问题解决

  • pyenv install[version]下载太慢 只需要在python的官网下载你需要的python版本的 tar.xz文件然后放到 /User/.pyenv/cache中然后再执行 pyenv install[version]就可以了 

在这里提一下: /.pyenv 在mac中是隐藏文件夹,mac显示隐藏文件夹的快捷键是: shift+command+.

  • 出现 zipimport.ZipImportError:can't decompress data; zlib not available 的问题

  1. ~ pyenv install 3.5-dev

  2. Cloning https://hg.python.org/cpython...

  3. Installing Python-3.5-dev...

  4. BUILD FAILED (OS X 10.11.6 using python-build 20150818)

  5. Inspect or clean up the working tree at /var/folders/23/4kbs9t712jv1mvmw6cpjwr2m0000gn/T/python-build.20160815000934.22185

  6. Results logged to /var/folders/23/4kbs9t712jv1mvmw6cpjwr2m0000gn/T/python-build.20160815000934.22185.log

  7. Last 10 log lines:

  8.  File "/private/var/folders/23/4kbs9t712jv1mvmw6cpjwr2m0000gn/T/python-build.20160815000934.22185/Python-3.5-dev/Lib/ensurepip/__main__.py", line 4, in <module>

  9.    ensurepip._main()

  10.  File "/private/var/folders/23/4kbs9t712jv1mvmw6cpjwr2m0000gn/T/python-build.20160815000934.22185/Python-3.5-dev/Lib/ensurepip/__init__.py", line 209, in _main

  11.    default_pip=args.default_pip,

  12.  File "/private/var/folders/23/4kbs9t712jv1mvmw6cpjwr2m0000gn/T/python-build.20160815000934.22185/Python-3.5-dev/Lib/ensurepip/__init__.py", line 116, in bootstrap

  13.    _run_pip(args + [p[0] for p in _PROJECTS], additional_paths)

  14.  File "/private/var/folders/23/4kbs9t712jv1mvmw6cpjwr2m0000gn/T/python-build.20160815000934.22185/Python-3.5-dev/Lib/ensurepip/__init__.py", line 40, in _run_pip

  15.    import pip

  16. zipimport.ZipImportError: can't decompress data; zlib not available

  17. make: *** [install] Error 1

解决方案参考#451用如下命令就可以解决了:

  1. ~ CFLAGS="-I$(brew --prefix openssl)/include -I$(xcrun --show-sdk-path)/usr/include" \

  2.  LDFLAGS="-L$(brew --prefix openssl)/lib" \

  3.  pyenv install -v 3.5-dev

  • pyenvglobal[verion]命令失效 这个问题我已经在上面说过了,需要在 bash_profile文件里面添加一句

  1. eval "$(pyenv init -)"

添加方式上面已经详细介绍过了。

最后

本文参考:

  1. Simple Python Version Management: pyenv

  2. Mac下 Pyenv 的安装使用


    您可能也对以下帖子感兴趣

    文章有问题?点此查看未经处理的缓存