Pyenv & virtualenv

Pyenv

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

  • pyenv 原理

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

作者原文如下:

Understanding Shims

pyenv works by inserting a directory of shims at the front of your PATH:

$(pyenv root)/shims:/usr/local/bin:/usr/bin:/bin
Through a process called rehashing, pyenv maintains shims in that directory to match every Python command across every installed version of Python—python, pip, and so on.

Shims are lightweight executables that simply pass your command along to pyenv. So with pyenv installed, when you run, say, pip, your operating system will do the following:

Search your PATH for an executable file named pip
Find the pyenv shim named pip at the beginning of your PATH
Run the shim named pip, which in turn passes the command along to pyenv

具体的下载和使用教程请点击我!!!
具体的命令使用详解请点击我!!!

python切换

  1. pyenv global 3.4.0 — 设置全局的 Python 版本,通过将版本号写入 ~/.pyenv/version 文件的方式。

  2. 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 设定的版本。

  1. pyenv shell –unset

  2. python优先级

shell > local > global

virtualenv

  • virtualenv 用处

处理python环境的多版本和模块依赖,以及相应的权限是一个很常见的问题。比如,你有个应用使用的是LibFoo V1.0,但另一个应用却要用到LibFoo V2.0。 如何处理呢?如果把所有模块都安装到 /usr/lib/python2.7/site-packages (或是你本机python默认的模块安装目录),那你极有可能无意中升级一些不该升级的模块。

  • 在Pyenv中有相应插件:pyenv-virtualenv 或者使用virtualenvwrapper,这是 virtualenv 的扩展工具,提供了一系列命令行命令

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

中文参考链接

关于环境变量

OS X系统的环境变量,加载顺序为:

/etc/profile
/etc/paths
~/.bash_profile
~/.bash_login
~/.profile
~/.bashrc
/etc/profile和/etc/paths是系统级别的,系统启动就会加载,
后面几个是当前用户级的环境变量。

~/.bash_profile,~/.bash_login,~/.profile按照从前往后的顺序读取,
如果~/.bash_profile文件存在,则后面的几个文件就会被忽略不读了,
如果~/.bash_profile文件不存在,才会以此类推读取后面的文件。

~/.bashrc没有上述规则,它是bash shell打开的时候载入的。

修改完后记得source一下让其快速生效