搭建多个互不干扰的python开发环境 virtualenv virtualenvwrapper 及pyenv 大汇总

我们有的时候会发现,一个电脑上有多个项目,一个依赖 Django 2.2,另一个比较旧的项目又要用 Django 1.11,这时候怎么办呢?

我们需要一个依赖包管理的工具来处理不同的环境。

如果不想搭建这个环境,只想用某一个版本的 Django 也可以,但是推荐学习此内容!

4.1 虚拟环境依赖安装

开发会用 virtualenv 来管理多个开发环境

Linux/MacOS 下

virtualenvwrapper 使得virtualenv变得更好用,所以我们一起安装了

1
2
# 安装:
(sudo) pip install virtualenv virtualenvwrapper

修改~/.bash_profile或其它环境变量相关文件(如 .bashrc 或用 ZSH 之后的 .zshrc),添加以下语句

1
2
3
export WORKON_HOME=$HOME/.virtualenvs
export PROJECT_HOME=$HOME/workspace
source /usr/local/bin/virtualenvwrapper.sh

修改后使之立即生效(也可以重启终端使之生效):

1
source ~/.bash_profile

 

Windows 下:

1
pip install virtualenv virtualenvwrapper-win

【可选】Windows下默认虚拟环境是放在用户名下面的Envs中的,与桌面,我的文档,下载等文件夹在一块的。更改方法:计算机,属性,高级系统设置,环境变量,添加WORKON_HOME,如图(windows 10 环境变量设置截图):

workon_home.png

4.2 虚拟环境使用方法:

mkvirtualenv zqxt:创建运行环境zqxt

workon zqxt: 工作在 zqxt 环境 或 从其它环境切换到 zqxt 环境

deactivate: 退出终端环境

 

其它的:

rmvirtualenv ENV:删除运行环境ENV

mkproject mic:创建mic项目和运行环境mic

mktmpenv:创建临时运行环境

lsvirtualenv: 列出可用的运行环境

lssitepackages: 列出当前环境安装了的包

创建的环境是独立的,互不干扰,无需sudo权限即可使用 pip 来进行包的管理。

 

1.创建虚拟环境
mkvirtualenv env-name
mkvirtualenv -p python3.4 env-name # 指定python的版本号
mkvirtualenv env-name --system-site-packages # 可以使用虚拟环境的外部的模块
2.进入虚拟环境
workon env-name
3.离开虚拟环境
deactivate
4.删除虚拟环境
rmvirtualenv env-name
5.列出虚拟环境
lsvirtualenv
6.进入到虚拟环境所在的目录
cdvirtualenv

 

=======================================================

前言

我觉得如果使用 python 开发的话,还是在 unix/linux 的环境下吧,shell 工具的效率比 windows 高得多,尽管 windows 下也有 cmder 这种神器,而且现在 windows store 也很好的开发出了 linux 子系统,但是瑕疵非常多,unix/linux 才是完美的环境。本文用到的是 archlinux ,另外 debian/ubuntu、centos 也完全适用。mac 用户也可以参考,不过 homebrew 也提供了非常方便的安装方法,但是建议使用文本做法。

背景

python 版本比较多,2 和 3 相差非常大,很多项目需要跑在同一台服务器上,我们可以选择直接运行,也可以选择使用 docker。如果用 docker 那就不需要隔离环境了,如果要直接运行在服务器上,那就必须有隔离环境。比如有的项目使用 python 3.5,有的项目使用 python 3.7,此时我们可以借助 pyenv 帮助我们完美的隔离环境,让多个版本的 python 没有任何冲突,完美共存。

任务

使用 pyenv 和 pyenv-virtualenv ,在 linux 下完美隔离 python 各个版本

第 1 章:使用环境

请注意,接下来所有的操作都在 archlinux 下进行,本文不涉及 windows

清单

  1. git
  2. zsh 或者 bash
  3. pyenv
  4. pyenv-virtualenv

1、安装 git

在各大 linux 的发行版下安装 git 都非常简单,此处只展示部分示例

archlinux

sudo pacman -S git

debian/ubuntu

sudo apt-get install git

centos

sudo yum install git

2、开启终端

本文使用 zsh

3、安装 pyenv

说明:本文的所有安装都严格遵守官方文档,与官方文档完全保持一致。

git 地址:https://github.com/pyenv/pyenv

在你的终端中执行如下命令,安全无毒,请放心食用:

首先把项目克隆下来,放在家目录下的隐藏文件夹中:.pyenv

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

然后配置环境变量

如果你使用 bash,就依次执行如下命令:

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

如果你使用 zsh,就依次执行如下命令:

echo 'export PYENV_ROOT="$HOME/.pyenv"' >> ~/.zshrc

echo 'export PATH="$PYENV_ROOT/bin:$PATH"' >> ~/.zshrc

echo -e 'if command -v pyenv 1>/dev/null 2>&1; then\n eval "$(pyenv init -)"\nfi' >> ~/.zshrc

echo 命令的含义是:将引号中内容写入某文件中
请注意,以上的三条 echo 命令的最后一条长长的命令,请你保证它引号中的内容处于 ~/.bashrc 或者 ~/.zshrc 的最底部。
因为在 pyenv 初始化期间会操作 path 环境变量,导致不可预测的行为。
查看文件的底部内容,可以使用 tail 命令,用法:tail ~/.bashrc 或者 tail ~/.zshrc,编辑文件可以使用 vim 或者 vscode

最后,在使用 pyenv 之前,重新初始化 shell 环境,执行如下命令

exec $SHELL

不执行该命令也是完全可以的,你可以关闭当前的终端窗口,重新启动一个就可以了。

此时,你已经完成了 pyenv 的安装了,你使用可以它的全部命令了,但是我建议你先别急着用,一口气装完 pyenv 的一个插件,那就是 pyenv-virtualenv

4、安装 pyenv-virtualenv

git 地址:https://github.com/pyenv/pyenv-virtualenv

把插件克隆在刚才已经安装完毕的 pyenv 的 plugins 文件夹中

git clone https://github.com/pyenv/pyenv-virtualenv.git $(pyenv root)/plugins/pyenv-virtualenv

然后配置环境变量

如果你使用 bash,就执行如下命令:

echo 'eval "$(pyenv virtualenv-init -)"' >> ~/.bashrc

如果你使用 zsh,就执行如下命令:

echo 'eval "$(pyenv virtualenv-init -)"' >> ~/.zshrc

最后,在使用 pyenv 之前,重新初始化 shell 环境,执行如下命令

exec $SHELL

不执行该命令也是完全可以的,你可以关闭当前的终端窗口,重新启动一个就可以了。

到此,我们的所有重要安装已经全部完成了,可以开始体验了。

第 2 章:使用 pyenv

此处仅仅展示 pyenv 和 virtualenv 的日常用法

检查安装是否正确

检查 pyenv 的版本

pyenv version

查看 pyenv 已经托管了哪些 python 版本

pyenv versions

如果你看到了正常的版本信息,就说明可以了,如果看到了类似于 command not found 之类的,就说明安装失败了。

安装 3.6.6 版本的 python

pyenv install 3.6.6

这里有个问题,某些情况下会安装失败,报错就告诉你 Build failed

这个时候,pyenv 已经在它的 github wiki 里面为我们准备了一篇错误应对方案,原文地址 https://github.com/pyenv/pyenv/wiki

大意如下,只需要执行对应的命令即可:

archlinux 用户

sudo pacman -S base-devel openssl zlib

mac 用户

brew install openssl readline sqlite3 xz zlib

Ubuntu/Debian/Mint 用户

sudo apt-get install -y make build-essential libssl-dev zlib1g-dev libbz2-dev libreadline-dev libsqlite3-dev wget curl llvm libncurses5-dev xz-utils tk-dev libxml2-dev libxmlsec1-dev libffi-dev

CentOS/Fedora <= 21 用户,请你保证已经安装了 xz 工具

sudo yum install gcc zlib-devel bzip2 bzip2-devel readline-devel sqlite sqlite-devel openssl-devel tk-devel libffi-devel

Fedora >= 22 用户,请你保证已经安装了 xz 工具

sudo dnf install -y gcc zlib-devel bzip2 bzip2-devel readline-devel sqlite sqlite-devel openssl-devel tk-devel

openSUSE 用户

zypper install gcc automake openssl-devel ncurses-devel readline-devel zlib-devel tk-devel

Solus 用户

sudo eopkg it -c system.devel

sudo eopkg install git gcc make zlib-devel bzip2-devel readline-devel sqlite3-devel openssl-devel tk-devel

Linuxbrew 用户

brew install bzip2 openssl readline sqlite xz

安装完这些补充的工具之后,再次执行:

pyenv install 3.6.6

就可以成功了,你可以不断的使用

pyenv versions

来查看被 pyenv 托管的 python 版本

而且你想装什么版本就装什么版本,想装几个装几个,都是完美共存,完美隔离,你可以在终端里输入

pyenv install

然后按下 tab 键,就可以看到所有可选的安装版本了

使用刚才安装的 python 3.6.6

首先我们需要明确一个概念,pyenv 和 pyenv-virtualenv 他们是如何协作的,你可以这么认为:

pyenv 托管 python 版本,virtualenv 使用 python 版本

好了,之前已经装好了版本,那么现在就来使用吧

第 1 步:创建虚拟环境

首先需要创建一个虚拟环境,执行命令:

pyenv virtualenv 3.6.6 my-env

它的格式就是这样固定的,最后一个是你自己想要的环境的名字,可以随便取。稍等片刻,你将会看到:

Looking in links: /tmp/tmp0eywgc7v
Requirement already satisfied: setuptools in /home/joit/.pyenv/versions/3.6.6/envs/my-env/lib/python3.6/site-packages (39.0.1)
Requirement already satisfied: pip in /home/joit/.pyenv/versions/3.6.6/envs/my-env/lib/python3.6/site-packages (10.0.1)

类似于这样的回显信息,说明环境已经创建成功了,它还告诉了你,该虚拟环境的绝对路径,如果你进去看了,你就会发现,所谓的虚拟环境,就是把 python 装在 pyenv 的安装目录的某个文件夹中,以供它自己调用。

第 2 步:激活虚拟环境

在任意目录下,执行命令:

pyenv activate my-env

你会发现,在你的终端里面,多了一个类似于 (my-env) 这样的一个东西,这时候你如果执行:

python --version

那就是 python 3.6.6 了

如果你执行:

pip --version

它会告诉你 pip 包安装的绝对路径,也是 pyenv 安装目录下的某个文件夹

如果你关掉了终端,那么下次启动你又得重新激活一次了,你可以使用如下命令:

首先 cd 到某一个目录,比如 ~/test

cd ~/test

然后在该目录下执行:

pyenv local my-env

你会发现已经被激活了,那么 local 命令和刚才有啥不同呢。如果你执行:

ls -al

你就会发现,在 ~/test 目录下,有个隐藏文件 .python-version,你可以看到这个文件里面,只写了一句话 my-env

这样你只要进入 ~/test 目录,就会自动激活虚拟环境

在虚拟环境下,你如果直接执行

python

就会进入到 python 的交互环境

如果你写了一个文件,名字叫做 app.py ,里面的内容只有一句代码:print(1)

然后执行:

python app.py

这时候,系统就会调用虚拟环境中的 python 解释器来执行这些代码了

第 3 章:更新 pyenv

由于我们是 git 克隆的,所以更新非常简单

cd ~/.pyenv 或者 cd $(pyenv root)
git pull

第 4 章:卸载 pyenv

由于 pyenv 把一切都放在 ~/.pyenv 下了,所以卸载很方便,两个步骤就行了

首先你需要删除环境变量

然后你需要执行:

rm -rf ~/.pyenv 或者 rm -rf $(pyenv root)


========================================================
pyenv是做什么的

pyenv是用来更方便的管理/切换python版本的.
github上通过homebrew安装介绍的非常简单.主要是对相关知识点不熟悉造成很多问题.
首先必须明白的是:

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

通过homebrew安装:

brew install pyenv

但是github提示了一句话

After installation, you'll need to add eval "$(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.

终端提示:

Caveats
To use Homebrew's directories rather than ~/.pyenv add to your profile:
export PYENV_ROOT=/usr/local/var/pyenv

To enable shims and autocompletion add to your profile:
if which pyenv > /dev/null; then eval "$(pyenv init -)"; fi

这个profile是哪个文件呢?

profile指的是.bash_profile, mac下的隐藏文件

编辑.bash_profile文件

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

$ cd ~ 

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

open .bash_profile

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

touch .bash_profile

编辑文件

open -e .bash_profile

在弹出的.bash_profile文件中新增

export PYENV_ROOT=/usr/local/var/pyenv
if which pyenv > /dev/null; then eval "$(pyenv init -)"; fi

command + s 保存文件

在终端中输入如下命令,刷新之前配置的.bash_profile文件.

source .bash_profile
pyenv的使用
  • 查看已经安装的python版本
$ pyenv versions
  • 查看当前使用的python版本
$ pyenv version
  • 安装一个python版本如3.5.2
$ pyenv install 3.5.2
  • 卸载一个python版本如3.5.2
$ pyenv uninstall  3.5.2
  • 设置全局python版本如3.5.2
$ pyenv global 3.5.2
//很多人不推荐这么做,说是mac操作系统的文件也会调用原生的2.7的python版本
//这种说法感觉有点:恐惧来自未知的感觉.持保留意见
  • 设置目录级python版本如3.5.2
$ pyenv local 3.5.2
  • 为当前shell会话设置python版本如3.5.2
$ pyenv shell 3.5.2

如果在指定的文件目录下限制特定的python版本需要以下操作:

$ cd + 文件路径
$ pyenv local 3.5.2 
  • 如何查看当前设定版本
 $ pyenv versions
 * system (set by /usr/local/var/pyenv/version)
    2.7.8
    2.7.10
  #当前设定版本前会有星号标识
  • 如何取消当前设定版本
$ pyenv local --unset 
  #其他两种命令同样参数

使用上述命令指定python版本后,该文件被删除后,即使在原路径重新同名文件,python版本仍旧是系统设定的global 版本.
pyenv 命令列表

2.Pycharm 如何切换 Pyenv 管理的安装包

当你使用pyenv切换了python版本时.Pycharm不会自动切换到对应的python. 需要自己手动的添加对应版本的绝对路径到Pycharm.
如图.在Add Loacl 中添加pyenv管理的绝对路径.


 
add-local.png
2.1 . pyenv 管理的安装包路径

目前有两种情况.

  1. 直接安装的pyenv,即pyenv在默认的目录:

        pyenv管理的python版本路径:  ~/.pyenv/versions/

  2. 通过 Homebrew 安装的 pyenv:

        pyenv管理的python版本路径:  /usr/local/var/pyenv/versions
        
  3. 如果上述两种方法都找不到:
      
        直接通过 pyenv 随意安装一个版本(2.7.9).终端会有如下提示:

        Downloading Python-2.7.9.tar.xz...
        -> https://www.python.org/ftp/python/2.7.9/Python-2.7.9.tar.xz
        Installing Python-2.7.9...
        patching file ./Lib/site.py
        patching file ./Lib/ssl.py
        Installed Python-2.7.9 to /usr/local/var/pyenv/versions/2.7.9
    
        你找的路径已经出来了--> /usr/local/var/pyenv/versions/


[pyenv 官方 错误查看地址][1-c]
[1-c]:https://github.com/yyuu/pyenv/wiki/Common-build-problems

3. pyenv 管理的版本安装包区别简介

当你在终端输入:

$ pyenv install --list

你会看到如下版本列表



Available versions:
  2.1.3
  ...
  2.7.12
  3.0.1
  3.5-dev 
  anaconda-1.4.0
  ...
  anaconda2-4.1.0
  anaconda3-4.1.0
  ironpython-dev
  ironpython-2.7.5
  jython-dev
 ...
  jython-2.7.1b3
  miniconda-2.2.2
  ...
  miniconda3-4.0.5
  pypy-c-jit-latest
  ...
  pypy3.3-5.2-alpha1
  stackless-dev
  ...
  stackless-3.4.1

解释如下:
1. 纯数字的(如2.1.3, 2.7.12)是官方发布版本,
2.anaconda 也是一个python版本,只是自带了很多用于科学计算的第三方包和管理这些第三方包的管理工具(类似于pip)
3.miniconda- 是anaconda的迷你版(仅仅包涵对应的python版本和第三方包管理工具,第三方包如果使用需要自己下载)
3.IronPython 是一种在 NET 和 Mono 上实现的 Python 语言.使用.net开发
4.JPython是完全用JPython实现的python,它支持用java扩展,
5.和CPythonPyPy的区别是使用了JIT(即时编译)技术

anaconda简介

具体参看他人简介
Conda的包管理(anaconda 带的管理工具)
这个工具有点特别可以下载其他版本的anaconda版本.自成一个工具(conda将conda、python等都视为package)
Conda的包管理就比较好理解了,这部分功能与pip类似。

// 安装scipy
conda install scipy
// conda会从从远程搜索scipy的相关信息和依赖项目,对于python 3.4,conda会同时安装numpy和mkl(运算加速的库)

// 查看已经安装的packages
conda list
# 最新版的conda是从site-packages文件夹中搜索已经安装的包,不依赖于pip,因此可以显示出通过各种方式安装的包

conda的一些常用操作如下

# 查看当前环境下已安装的包
conda list

// 查看某个指定环境的已安装包
conda list -n python34

// 查找package信息
conda search numpy

// 安装package
conda install -n python34 numpy
// 如果不用-n指定环境名称,则被安装在当前活跃环境
// 也可以通过-c指定通过某个channel安装

// 更新package
conda update -n python34 numpy

// 删除package
conda remove -n python34 numpy

conda将conda、python等都视为package,因此,完全可以使用conda来管理conda和python的版本,例如

// 更新conda,保持conda最新
conda update conda

// 更新anaconda
conda update anaconda

// 更新python
conda update python
// 假设当前环境是python 3.4, conda会将python升级为3.4.x系列的当前最新版本

更换国内源问题参看上面链接详情


安装

$ git clone git://github.com/yyuu/pyenv.git ~/.pyenv

后面的~/.pyenv是你想安装在硬盘的地址

配置

如果使用的是bash

$ echo 'export PYENV_ROOT="$HOME/.pyenv"' >> ~/.bashrc
$ echo 'export PATH="$PYENV_ROOT/bin:$PATH"' >> ~/.bashrc
$ echo 'eval "$(pyenv init -)"' >> ~/.bashrc

如果使用的是zsh

$ echo 'export PYENV_ROOT="$HOME/.pyenv"' >> ~/.zshrc
$ echo 'export PATH="$PYENV_ROOT/bin:$PATH"' >> ~/.zshrc
$ echo 'eval "$(pyenv init -)"' >> ~/.zshrc

之后,重新加载shell

$ exec $SHELL -l

使用

查看现在使用的python版本

$ pyenv version

查看可供pyenv使用的python版本

$ pyenv versions

安装python版本

$ pyenv install <python版本>

安装的版本会在~/.pyenv/versions目录下。

对于比较大的版本文件,例如anaconda,可以先到官网下载,然后将文件放在~/.pyenv/cache目录下,再执行安装命令时,pyenv不会重复下载。

此外,可以用--list参数查看所以可以安装的版本

$ pyenv install --list

卸载将install改为uninstall就行

$ pyenv uninstall <python版本>

设置全局python版本,一般不建议改变全局设置

$ pyenv global <python版本>

设置局部python版本

$ pyenv local <python版本>

设置之后可以在目录内外分别试下which pythonpython --version看看效果, 如果没变化的话可以$ python rehash之后再试试

更新pyenv

$ cd ~/.pyenv
$ git pull
 
 
 

posted @ 2020-04-22 22:04  热爱技术的小牛  阅读(542)  评论(0编辑  收藏  举报
热爱技术的小牛