Content

前言

Python 版本管理工具 pyenv与Python 虚拟环境virtualenv

解释一

Linux系统的有些组件是Python来写的,所以。我们不要随便去改变系统自带的Python版本,因为它是要为系统服务。我们随意去升级,这样系统环境就会被打乱。平时我们会开发多个项目,不同的项目需要不同Python。 所依赖的包的版本也是不一样的。 所以这个这个时候,我就得需要我们对我们的Python环境进行管理。这个时候我们就得使用一个工具pyenv。pyenv是一款特别好用的Python版本管理器,程序员可以建立不同的目录,在不同的目录里分别运行不同版本的Python, 并且互不影响,安装的包也互不影响。pyenv是个多版本python管理器,可以同时管理多个python版本共存。 经常遇到这样的情况: 系统自带的 Python 是 2.6,自己需要 Python 2.7 中的某些特性; 系统自带的 Python 是 2.x,自己需要 Python 3.x; 此时需要在系统中安装多个 Python,但又不能影响系统自带的 Python,即需要实现 Python 的多版本共存。pyenv 就是这样一个 Python 版本管理器。

解释二

解决多python环境下,python版本切换的工具–pyenv应运而生。同时,另外一个工具virtualenv则提供了一种功能, 就是将一个目录建立为一个虚拟的python环境, 这样的话, 用户可以建立多个虚拟环境, 每个环境里面的python版本可以是不同的, 也可以是相同的, 而且环境之间相互独立。下面简要介绍一下安装的过程:

pyenv的作用:管理Python版本,Python版本切换 virtualenv:管理Python虚拟环境(相当于一个独立的版本。)

解释三

作为主流开发语言, 用python 开发的程序越来越多。 方便的是大多linux系统里面都默认集成了python, 开发可以随时随地开始。 但有时候这也成为了一个短板, 比如说有时候我们需要开发和调试一些需要安装在默认python路径里的程序, 反复地修改和安装会使系统目录越来越乱,这对于一些有洁癖的程序员来说是不可接受的。 还有时候我们需要在不同的python版本上开发, 而系统一般只会自带一到两种python版本, 切换起来更是麻烦。

本文将介绍如何利用pyenv 和virtualenv 在单机上搭建多版本python 虚拟开发环境。

首先我们搞清楚pyenv 和virtualenv分别是干什么的。

1.pyenv可以帮助你在一台开发机上建立多个版本的python环境, 并提供方便的切换方法。


2.virtualenv则提供了一种功能, 就是将一个目录建立为一个虚拟的python环境, 这样的话, 用户可以建立多个虚拟环境, 每个环境里面python版本可以是不同的, 也可以是相同的, 而且环境之间相互独立。

如果解释得还不是很清楚的话,我们举例说明。

首先我们可以用pyenv 安装多个python 版本, 比如安装了2.7.11, 3.5.2版本。 用户可以随意切换当前默认的python版本。 但这时候, 每个版本的环境仍是唯一的, 如果我们想在环境中安装一些库的话, 还是会导致这个版本的环境被修改。 这个时候, 如果我们用virtual env去建立虚拟环境, 就可以完全保证系统路径的干净。无论你在虚拟环境中安装了什么程序, 都不会影响已安装版本的系统环境。说了这么多, 还是动手实践一下来得实在。本文的例子是在一台干净的Ubuntu机器上进行的

解决多python环境下,python版本切换的工具–pyenv应运而生。同时,另外一个工具virtualenv则提供了一种功能, 就是将一个目录建立为一个虚拟的python环境, 这样的话, 用户可以建立多个虚拟环境, 每个环境里面的python版本可以是不同的, 也可以是相同的, 而且环境之间相互独立。下面简要介绍一下安装的过程:

  • pyenv的地址:https://github.com/yyuu/pyenv
  • pyenv-installer的地址:https://github.com/yyuu/pyenv-installer
  • pyenv-installer:安装pyenv的

给普通用户安装pyenv

新建普通用户

sudo adduser pyone
ubuntu@VM-155-46-ubuntu:~$ su - pyone
Password: 

安装pyenv

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






	
pyone@VM-155-46-ubuntu:~$ curl -L https://raw.githubusercontent.com/yyuu/pyenv-installer/master/bin/pyenv-installer | bash
% Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                         Dload  Upload   Total   Spent    Left  Speed
100  2099  100  2099    0     0   2199      0 --:--:-- --:--:-- --:--:--  2200
部分省略

WARNING: seems you still have not added 'pyenv' to the load path.

# Load pyenv automatically by adding
# the following to ~/.bash_profile:

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

安装完成后,根据提示将如下语句加入到 ~/.bashrc 中:

export PYENV_ROOT="$HOME/.pyenv"
export PATH="$PYENV_ROOT/bin:$PATH"
eval "$(pyenv init -)"
eval "$(pyenv virtualenv-init -)"   # 这句可以不加


pyone@VM-155-46-ubuntu:~$ vim ~/.bash_profile
pyone@VM-155-46-ubuntu:~$ source ~/.bash_profile 

查看pyenv相关的

pyone@VM-155-46-ubuntu:~$ pyenv commands|less
pyone@VM-155-46-ubuntu:~$ pyenv versions
* system (set by /home/pyone/.pyenv/version)

查看可安装的Python版本

pyone@VM-155-46-ubuntu:~$ pyenv install --list|less
Available versions:
  2.1.3
   部分省略
  2.7.10
  2.7.11
  2.7.12
  3.5.2

执行该命令后,会从给定的网址中下载安装文件 Python-3.5.2.tar.xz和Python-2.7.11.tar.xz。但由于文件很大,通常下载需要很久。建议的做法是,先执行以上命令然后马上中断安装,这样就知道 pyenv 要下载的文件的链接。然后用户自己用其他更快的方式(比如wget、迅雷等等)从该链接中下载安装文件,并将安装文件移动到 ~/.pyenv/cache 目录下(该目录默认不存在,用户要自行新建)

wget -c https://www.python.org/ftp/python/2.7.11/Python-2.7.11.tar.xz -O ~/.pyenv/cache/Python-2.7.11.tar.xz
wget -c https://www.python.org/ftp/python/3.5.2/Python-3.5.2.tar.xz -O ~/.pyenv/cache/Python-3.5.2.tar.xz

需要安装的依赖包

sudo apt-get install gcc libbz2-dev libssl-dev libreadline6 libreadline6-dev libsqlite3-dev

用pyenv安装 Python2.7.11和 Python3.5.2

然后再执行安装

pyone@VM-155-46-ubuntu:~$ pyenv install 2.7.11
Installing Python-2.7.11...
Installed Python-2.7.11 to /home/pyone/.pyenv/versions/2.7.11

pyenv virtualenv 的使用

要想熟练的掌握pyenv virtualenv 的使用,请解决下面的4个问题。

装4个虚拟环境, 并且4个环境可以随时切换

  1. py2dj python2.7 搭配django1.11环境,

  2. py2es python2.7 搭配elasticsearch

  3. py3dj python3.5 搭配django1.11

  4. py4es python3.5 搭配 elasticsearch

pyenv 创建虚拟环境,并且指定Python版本

	pyenv virtualenv 2.7.11 py2dj -- 创建并且切换之后,我们可以看见python版本已经是2.7.11, 而且是在虚拟环境之中 (py2dj)

切换到虚拟环境

	pyenv activate py2dj          -- 切换到 py2dj

安装django1.11

(py2dj) pyone@VM-155-46-ubuntu:~$ pip install Django==1.11 -i https://pypi.douban.com/simple
 Collecting Django==1.11
 Downloading Django-1.11-py2.py3-none-any.whl (6.9MB)
 99% |############################### | 6.9MB 27kB/s eta 0:00:02Exception:
  部分省略
 flush_decoder = True
 File "/home/pyone/.pyenv/versions/2.7.11/lib/python2.7/contextlib.py", line 35, in __exit__
 self.gen.throw(type, value, traceback)
File "/home/pyone/.pyenv/versions/2.7.11/envs/py2dj/lib/python2.7/site-packages/pip/_vendor/requests/packages/urllib3/response.py", line 246, in _error_catcher
raise ReadTimeoutError(self._pool, None, 'Read timed out.')
ReadTimeoutError: HTTPSConnectionPool(host='pypi.python.org', port=443): Read timed out.
(py2dj) pyone@VM-155-46-ubuntu:~$ pip install Django==1.11
Collecting Django==1.11
Downloading Django-1.11-py2.py3-none-any.whl (6.9MB)
100% |################################| 6.9MB 41kB/s 
Collecting pytz (from Django==1.11)
Downloading pytz-2017.2-py2.py3-none-any.whl (484kB)
100% |################################| 491kB 52kB/s 
Installing collected packages: pytz, Django
Successfully installed Django-1.11 pytz-2017.2
(py2dj) pyone@VM-155-46-ubuntu:~$

切回系统环境

(py2dj) pyone@VM-155-46-ubuntu:~$ pyenv deactivate   -------切回系统环境
pyone@VM-155-46-ubuntu:~$
(py2dj) pyone@VM-155-46-ubuntu:~$ pyenv deactivate

python2.7 搭配elasticsearch

pyone@VM-155-46-ubuntu:~$ pyenv virtualenv 2.7.11 py2es
New python executable in /home/pyone/.pyenv/versions/2.7.11/envs/py2es/bin/python2.7
Also creating executable in /home/pyone/.pyenv/versions/2.7.11/envs/py2es/bin/python
Installing setuptools, pip, wheel...done.
Ignoring indexes: https://pypi.python.org/simple
Requirement already satisfied (use --upgrade to upgrade): setuptools in /home/pyone/.pyenv/versions/2.7.11/envs/py2es/lib/python2.7/site-packages
Requirement already satisfied (use --upgrade to upgrade): pip in /home/pyone/.pyenv/versions/2.7.11/envs/py2es/lib/python2.7/site-packages




pyone@VM-155-46-ubuntu:~$ pyenv activate py2es
pyenv-virtualenv: prompt changing will be removed from future release. configure `export PYENV_VIRTUALENV_DISABLE_PROMPT=1' to simulate the behavior.
(py2es) pyone@VM-155-46-ubuntu:~$ python
Python 2.7.11 (default, Jun 21 2017, 14:12:19) 
[GCC 5.4.0 20160609] on linux2
Type "help", "copyright", "credits" or "license" for more information.
Use quit() or Ctrl-D (i.e. EOF) to exit
  >>> quit()




(py2es) pyone@VM-155-46-ubuntu:~$ pip install elasticsearch
Collecting elasticsearch
Downloading elasticsearch-5.4.0-py2.py3-none-any.whl (58kB)
	    100% |################################| 61kB 106kB/s 
Collecting urllib3<2.0,>=1.8 (from elasticsearch)
	 Downloading urllib3-1.21.1-py2.py3-none-any.whl (131kB)
	    100% |################################| 133kB 73kB/s 
Installing collected packages: urllib3, elasticsearch
Successfully installed elasticsearch-5.4.0 urllib3-1.21.1
(py2es) pyone@VM-155-46-ubuntu:~$ echo $?
0

指定当前我们使用哪一个版本

pyenv local 版本号

zong@zong-virtual-machine:~$ mkdir me
zong@zong-virtual-machine:~$ cd me/
zong@zong-virtual-machine:~/me$ pyenv local 3.5.2
zong@zong-virtual-machine:~/me$ ll
ll: command not found
zong@zong-virtual-machine:~/me$ ls -la
total 12
drwxrwxr-x  2 zong zong 4096  9月  9 11:23 .
drwxr-xr-x 17 zong zong 4096  9月  9 11:21 ..
-rw-rw-r--  1 zong zong    6  9月  9 11:23 .python-version
zong@zong-virtual-machine:~/me$ vim .python-version 
zong@zong-virtual-machine:~/me$ python
Python 3.5.2 (default, Sep  9 2016, 10:54:29) 
[GCC 5.2.1 20151010] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> exit
Use exit() or Ctrl-D (i.e. EOF) to exit
>>> exit()
zong@zong-virtual-machine:~/me$ ll
ll: command not found
zong@zong-virtual-machine:~/me$ cd ../
zong@zong-virtual-machine:~$ python
Python 2.7.10 (default, Oct 14 2015, 16:09:02) 
[GCC 5.2.1 20151010] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> exit
Use exit() or Ctrl-D (i.e. EOF) to exit
>>> exit()


zong@zong-virtual-machine:~$ pyenv local  这个一般我们都不用。

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

zong@zong-virtual-machine:~/me$ pyenv virtualenv 3.5.2 zong_test
Ignoring indexes: https://pypi.python.org/simple
Requirement already satisfied (use --upgrade to upgrade): setuptools in /home/zong/.pyenv/versions/3.5.2/envs/zong_test/lib/python3.5/site-packages
Requirement already satisfied (use --upgrade to upgrade): pip in /home/zong/.pyenv/versions/3.5.2/envs/zong_test/lib/python3.5/site-packages
zong@zong-virtual-machine:~/me$ ls -la
total 12
drwxrwxr-x  2 zong zong 4096  9月  9 11:23 .
drwxr-xr-x 17 zong zong 4096  9月  9 11:24 ..
-rw-rw-r--  1 zong zong    6  9月  9 11:23 .python-version
zong@zong-virtual-machine:~/me$ pyenv versions
  system
* 3.5.2 (set by /home/zong/me/.python-version)
  3.5.2/envs/zong_test
  zong_test

创建虚拟环境 pyenv local 虚拟环境名

zong@zong-virtual-machine:~/me$ pyenv local zong_test 
(zong_test) zong@zong-virtual-machine:~/me$ pyenv versions
  system
  3.5.2
  3.5.2/envs/zong_test
* zong_test (set by /home/zong/me/.python-version)






(zong_test) zong@zong-virtual-machine:~/me$ cd ../zong/
zong@zong-virtual-machine:~/zong$ pyenv virtualenv 3.5.2 zong_000
Ignoring indexes: https://pypi.python.org/simple
Requirement already satisfied (use --upgrade to upgrade): setuptools in /home/zong/.pyenv/versions/3.5.2/envs/zong_000/lib/python3.5/site-packages
Requirement already satisfied (use --upgrade to upgrade): pip in /home/zong/.pyenv/versions/3.5.2/envs/zong_000/lib/python3.5/site-packages
zong@zong-virtual-machine:~/zong$ ls -la
total 8
drwxrwxr-x  2 zong zong 4096  9月  9 12:25 .
drwxr-xr-x 18 zong zong 4096  9月  9 12:25 ..
zong@zong-virtual-machine:~/zong$ pyenv versions
* system (set by /home/zong/.pyenv/version)
  3.5.2
  3.5.2/envs/zong_000
  3.5.2/envs/zong_test
  zong_000
  zong_test
zong@zong-virtual-machine:~/zong$ pyenv local zong_
zong_000   zong_test  
zong@zong-virtual-machine:~/zong$ pyenv local zong_000 
(zong_000) zong@zong-virtual-machine:~/zong$ pyenv versions
  system
  3.5.2
  3.5.2/envs/zong_000
  3.5.2/envs/zong_test
* zong_000 (set by /home/zong/zong/.python-version)
  zong_test
(zong_000) zong@zong-virtual-machine:~/zong$ pip -V
pip 8.1.1 from /home/zong/.pyenv/versions/3.5.2/envs/zong_000/lib/python3.5/site-packages (python 3.5)
zong@zong-virtual-machine:~$ mkdir zongl
zong@zong-virtual-machine:~$ cd zong
zong@zong-virtual-machine:~/zongl$ pyenv virtualenv 3.5.2 zong_
zong_000   zong_test  
zong@zong-virtual-machine:~/zongl$ pyenv virtualenv 3.5.2 zongl
Ignoring indexes: https://pypi.python.org/simple
Requirement already satisfied (use --upgrade to upgrade): setuptools in /home/zong/.pyenv/versions/3.5.2/envs/zongl/lib/python3.5/site-packages
Requirement already satisfied (use --upgrade to upgrade): pip in /home/zong/.pyenv/versions/3.5.2/envs/zongl/lib/python3.5/site-packages
zong@zong-virtual-machine:~/zongl$ ls -la
total 12
drwxrwxr-x  2 zong zong 4096  9月  9 17:18 .
drwxr-xr-x 21 zong zong 4096  9月  9 17:16 ..
-rw-rw-r--  1 zong zong    6  9月  9 17:18 .python-version
zong@zong-virtual-machine:~/zongl$ pyenv local zong
zong_000   zongl      zong_test  
zong@zong-virtual-machine:~/zongl$ pyenv local zongl
(zongl) zong@zong-virtual-machine:~/zongl$ pyenv version
zongl (set by /home/zong/zongl/.python-version)

安装ipython

zong_000) zong@zong-virtual-machine:~/zong$ pip install ipython


(zong_000) zong@zong-virtual-machine:~/zong$ echo $?
0 #### 安装jumpter

(zong_000) zong@zong-virtual-machine:~/zong$ pip install jupyter

jupyterd的访问方式

如果这样启动的话,只能在自己的本机访问

zong@zong-virtual-machine:~/zong$ jupyter notebook

如果想让别的主机也能访问的话,需这样访问。

zong@zong-virtual-machine:~/zong$ jupyter notebook --ip=0.0.0.0

pip配置使用国内镜像

1.创建目录
2.编辑文件

(zongl) zong@zong-virtual-machine:~/zongl$ mkdir ~/.pip
(zongl) zong@zong-virtual-machine:~/zongl$ vim ~/.pip/pip.conf

[global]
timeout = 6000
index-url = http://mirrors.aliyun.com/pypi/simple/
trusted-host = mirrors.aliyun.com