博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

python高效率 pyenv, virtualenv, pyenv-virtualenv

Posted on 2018-06-11 21:39  bw_0927  阅读(1150)  评论(0)    收藏  举报

https://juejin.im/entry/577ce6322e958a00549c7cab

安装:

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

# Load pyenv automatically by adding
# the following to ~/.bash_profile:           #~/.bash_profile不行,得放到~/.bashrc里

export PATH="/root/.pyenv/bin:$PATH"
eval "$(pyenv init -)"
eval "$(pyenv virtualenv-init -)"

 

source ~/.bash_profile的时候报错:

/root/.pyenv/bin/pyenv: line 1: ../libexec/pyenv: No such file or directory

解决办法:

rm -rf ~/.pyenv/bin/pyenv   
$ ln -s ~/.pyenv/libexec/pyenv ~/.pyenv/bin/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 常用命令

python配置

$ pyenv versions – 查看系统当前安装的python列表

$ pyenv install -v 3.5.1 – 安装python

$ pyenv uninstall 2.7.3 – 卸载python

$ pyenv rehash – 创建垫片路径(为所有已安装的可执行文件 (如:~/.pyenv/versions//bin/) 创建 shims,因此,每当你增删了 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 结合:

[root@linux3311 ~]# cd .pyenv/plugins/
[root@linux3311 plugins]# ll
insgesamt 24
drwxr-xr-x. 4 root root 4096 19. Jun 05:17 pyenv-doctor
drwxr-xr-x. 5 root root 4096 19. Jun 05:18 pyenv-installer
drwxr-xr-x. 4 root root 4096 19. Jun 05:18 pyenv-update
drwxr-xr-x. 7 root root 4096 19. Jun 05:18 pyenv-virtualenv
drwxr-xr-x. 4 root root 4096 19. Jun 05:18 pyenv-which-ext
drwxr-xr-x. 5 root root 4096 19. Jun 05:17 python-build

使用

$ pyenv virtualenv 2.7.10 my-virtual-env-2.7.10

若不指定python 版本,会汇报认使用当前环境python版本。

pyenv virtualenvs

pyenv activate my-virtual-env-2.7.10

pyenv deactivate

pyenv uninstall my-virtual-env

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

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

 

2. pyenv-virtualenv使用指南

pyenv-virtualenv是用来创建一个干净的虚拟Python环境的命令,通常在创建干净的新项目时候使用。使用方法如下:

1.创建虚拟环境--pyenv virtualenv 版本号 虚拟环境名

$ pyenv virtualenv 3.5.1 venv-3.5.1
  1. 创建项目,让项目使用干净的Python3.5.1的虚拟环境:
$ mkdir myproject
$ cd myproject
$ pyenv local venv-3.5.1

pyenv-virtualenv: deactivate
pyenv-virtualenv: activate venv-3.5.1

此后,我们就会发现:只要我们进入myproject目录,就会自动激活virtualenv,退出myproject目录,就会关闭virtualenv。

如果要关闭自动激活,可以运行命令pyenv deactivate,要重新启用的话,运行pyenv activate 虚拟环境名


pyenv local --unset
 
  • 设置python版本
# 对所有的Shell全局有效,会把版本号写入到~/.pyenv/version文件中
pyenv global 3.6.3

# 只对当前目录有效,会在当前目录创建.python-version文件
pyenv local 3.6.3

# 只在当前会话有效
pyenv shell 3.6.3

# 可通过配置PYENV_VERSION环境变量或编辑~/.python-version文件设置会话默认使用的python版本
echo "3.6.3" > ~/.python-version
# or
echo 'export PYENV_VERSION="3.6.3"' >> ~/.zshrc && source ~/.zshrc
 
 

只有 pyenv shell 和 pyenv local 命令有--unset参数

pyenv shell --unset
pyenv local --unset
  • 卸载版本
pyenv uninstall 3.6.3


----

虚拟环境插件pyenv-virtualenv

为不同项目创建不同虚拟环境,并且在进入项目时自动切换为特定的虚拟环境

基于指定版本创建虚拟环境

$ pyenv virtualenv 3.6.5 <virt_name>

进入目录后自动激活虚拟环境

--在创建了虚拟环境之后,进入该目录会自动切换到虚拟环境,退出目录会退出虚拟环境
$ pyenv local <virt_name>

取消虚拟环境的自动切换

$ pyenv local --unset

显示所有已创建的虚拟环境

一个虚拟环境会出现两条记录
$ pyenv virtualenvs

删除虚拟环境

$ pyenv virtualenv-delete <virt_name>
输入y即可删除

pyenv versions  查看所有版本
pyenv global system 恢复全局的默认python
pyenv install xxx.version
pyenv local xxx.version
这种,命令行提示符没改变

配合virtualenv,可改变提示符
pyenv virtualenv 3.5.1 venv-3.5.1  给3.5.1版本创建一个别名
pyenv active venv-3.5.1启用
pyenv deactive 禁用,但这种方式对其他目录也有影响。

或者不用virtualenv,直接用local的方式
pyenv local 3.5.1
pyenv local system
pyenv versions

或者进入目录启用,退出目录自动禁用
pyenv local my-3.5.1 切换到其他目录,自动退出
pyenv local --unset 禁用