1. 前言
- 继安装好python2.7和pip2.7之后(安装方法可以戳这里),为了更好地在centos上区分python2.6和python2.7的使用,决定学习使用virtualenv,我真的不想再重装系统了=。=
- vitualenv是用于隔离python工程的packages等环境的,有时候不同的python工程所需的package的版本不同、甚至python版本不同(2.7和3等),这样的情况下使用virtualenv就能很好地隔离这些环境,方便管理
- 准备系统环境
- centos6.8(64bit)
- 自带的python2.6和pip2.6
- 源码安装的python2.7.14和pip2.7
- python2.7的安装位置:/usr/local/python2.7.14
2. 安装virtualenv
- 经过测试验证,使用pip2.6安装virtualenv的版本和使用pip2.7安装的virtualenv的版本都是15.2.0,因此我选择使用pip2.6来安装
virtualenv-15.2.0
,这样virtualenv是被安装在/usr/lib/python2.6/site-packages
[ding@host ~]$ sudo pip2.6 install virtualenv
[ding@host ~]$ pip2.6 list | grep virtualenv
virtualenv (15.2.0)
[ding@host ~]$ whereis virtualenv
virtualenv: /usr/bin/virtualenv
[ding@host ~]$ pip2.7 list
Package Version
---------- -------
pip 10.0.0
setuptools 39.0.1
wheel 0.31.0
- 使用pip2.6安装了vitualenv之后,可以看到,pip2.7的安装位置中是没有vitualenv的,并且virtualenv的指令是会默认安装在
/usr/bin
(环境变量)下的,可以直接使用,省去很多麻烦
3. 创建需要隔离环境的工程目录
[ding@host ~]$ mkdir spiderMyCsdn
[ding@host ~]$ cd spiderMyCsdn
[ding@host spiderMyCsdn]$ vi test.py
# coding=utf-8
import numpy as np
a = np.arange(12).reshape([3,4])
print 'hello virtualenv~'
print a
:wq
4. 在需要隔离的工程根目录下创建独立的Python运行环境(命名为venv
)
创建名为venv
的虚拟环境,选择Python解释器为/usr/local/python2.7.14/bin/python2.7
[ding@host spiderMyCsdn]$ virtualenv -p /usr/local/python2.7.14/bin/python2.7 venv
Running virtualenv with interpreter /usr/local/python2.7.14/bin/python2.7
New python executable in /home/ding/spiderMyCsdn/venv/bin/python2.7
Also creating executable in /home/ding/spiderMyCsdn/venv/bin/python
Installing setuptools, pip, wheel...done.
默认情况下,虚拟环境会依赖系统环境中的site-packages,就是说系统中已经安装好的第三方package也会安装在虚拟环境中,如果不想依赖这些package,那么可以加上参数
--no-site-packages
建立虚拟环境virtualenv --no-site-packages [虚拟环境名称]
- 这就是为什么安装完python2.7、pip2.7和virtualenv之后我不再使用任何版本的pip安装任何package的原因,这样,我能确保外部系统环境不会有什么奇怪的冲突,而在虚拟环境创建的时候也不用担心默认使用外部的package,每个虚拟环境内的package独立安装,能够最大限度确保各个项目能正常运行(我是真的怕了重装系统=。=勉为其难给自己找个理由)
- 创建虚拟环境成功之后可以看到工程根目录下多了一个文件夹
venv/
,大概长这样:
.
├──bin
│ ├── activate
│ ├── activate.csh
│ ├── activate.fish
│ ├── activate_this.py
│ ├── easy_install
│ ├── easy_install-2.7
│ ├── f2py
│ ├── pip
│ ├── pip2
│ ├── pip2.7
│ ├── python -> python2.7
│ ├── python2 -> python2.7
│ ├── python2.7
│ ├── python-config
│ └── wheel
├──include
│ └── python2.7 -> /usr/local/python2.7.14/include/python2.7
└──lib
└──python2.7
5. 启动虚拟环境venv
[ding@host spiderMyCsdn]$ source venv/bin/activate
(venv) [ding@host spiderMyCsdn]$
启动虚拟环境后,会发现前面多了一个(venv)
,这时候就已经在虚拟python环境中啦,愉快地安装所需的package吧~
6. 在虚拟环境venv中使用pip2.7安装package
(venv) [ding@host spiderMyCsdn]$ pip install numpy
Collecting numpy
Downloading https://files.pythonhosted.org/packages/b9/84/513dc190113249244b3027ffebc6bf8ddcce1843cc471620ea179dc5613c/numpy-1.14.2-cp27-cp27m-manylinux1_x86_64.whl (12.1MB)
100% |████████████████████████████████| 12.1MB 1.7MB/s
Installing collected packages: numpy
Successfully installed numpy-1.14.2
7. 在虚拟环境venv
中测试
(venv) [ding@host spiderMyCsdn]$ python2.7 test.py
hello vitualenv~
[[ 0 1 2 3]
[ 4 5 6 7]
[ 8 9 10 11]]
8. 退出虚拟环境
(venv) [ding@host spiderMyCsdn]$ deactivate
[ding@host spiderMyCsdn]$
退出虚拟环境后,可以看到前面的(venv)
就不见啦,这时候就不是虚拟环境了,那么执行python2.7 test.py
是会出错的:
[ding@host spiderMyCsdn]$ python2.7 test.py
Traceback (most recent call last):
File "test.py", line 2, in <module>
import numpy as np
ImportError: No module named numpy
9. 删除虚拟环境
如果想删除虚拟环境,那么直接运行 rm -rf venv/
命令即可。
10. 启用仅在虚拟环境中才能使用pip安装的功能
- 如果没有启动虚拟环境,一不小心就直接在系统环境执行了pip安装指令,那么packages就会被安装在系统环境中。为了避免发生这种情形,可以在环境变量文件中加上
export PIP_REQUIRE_VIRTUALENV=true
,然后source一下即可 - 由于pip都不是安装在某一用户下的软件,都是使用root用户来安装的,因此在使用pip来安装package的时候也是要加上sudo才能执行,所以如果仅仅修改自己用户的环境变量文件.bashrc是不能根治上述情形的。因此只能修改系统的环境变量文件
- 又因为查看到
/etc/bashrc
文件中前面有个描述是最好不要更改它,而是去/etc/profile.d/
目录下创建一个叫custom.sh
的文件,在里面添加一些需要的配置,然后source
一下即可:
[root@host /home]# cd /etc/profile.d/
[root@host profile.d]# touch custom.sh
[root@host profile.d]# vi custom.sh
export PIP_REQUIRE_VIRTUALENV=true
:wq
[root@host profile.d]# source /etc/profile
- 完成后,不论是root用户还是普通用户,都无法在系统环境中使用pip指令啦:
[root@host profile.d]# pip2.7 list
Could not find an activated virtualenv (required).
[root@host profile.d]# exit
exit
[ding@host ~]$ pip2.7 list
Could not find an activated virtualenv (required).
- 假如突然又不想启用这个功能了,把
custom.sh
清空之后再source一下,如果发现还是不能用pip指令,那么有可能是ssh没有重启,关闭ssh连接,重连一次就可以了。
11. 关于virtualenvwrapper
这是一个统一管理系统中所有virtualenv的东西,以后再学习=。=,先记录一个链接,有兴趣的小伙伴也可以先自行学习