【Python】 virtualenv虚拟环境建设和管理
【virtualenv】
用Python开发时面临的一个大问题就是每个项目需要的依赖包不一致。如果是包本身不一样倒还好,如果不同项目需要的是不同版本的包的话就会很麻烦。如果采用统一的系统Python环境(这里先定义一下系统python环境,是指比如windows上安装Python的目录默认是C:\python27之类的目录下面的所有python相关内容,而linux因为自带python,就是指系统自带的那套python环境。比如第三方库都存储在/usr/lib/python2.7/site-packages下等等)开发,包也只有一套做不到按项目区分。
解决这个问题的办法就是采用虚拟环境进行开发和维护不同的项目。所谓虚拟环境,其实就是说在系统Python环境之外另搭一套python环境,这套python环境可能借用一部分系统Python环境的内容,而自身补充另一些。身处虚拟环境上下文中的程序将会按照虚拟环境给出的边界来运行。
建立和管理虚拟环境的简单工具就是virtualenv了。virtualenv在linux平台和windows平台上都可用,而且它会根据自己所在的具体平台来改变一些配置适应当前OS。
安装virtualenv十分方便,只要pip install virtualenv即可。这表明virtualenv其实也是用python写成的一个包。但更加方便的地方在于,在pip安装过程中会为我们在系统的可执行文件目录下(linux的话就是/usr/bin下)为我们设立一个virtualenv的可执行文件。也就是说在命令行直接键入virtualenv就可以了。下面将以linux(CentOS7)为基础,说明virtualenv的用法。
■ 基本使用
在命令行键入virtualenv <虚拟环境目录名>就可以在当前位置生成一个虚拟环境的目录,虚拟环境的目录名也就是虚拟环境的名字。打开这个目录我们可以看到主要有bin,include,lib等目录,其中重点关注一下bin和lib两个目录。bin目录下顾名思义放着一些可执行的二进制文件,进去之后可以看到除了python以及几个不同名字的python软链之外, 还有pip和easy_install这俩。就知道了,虚拟环境生成时自带了pip和easy_install这两个重要的工具,方便后续环境的搭建。lib目录可以看到最下面有个site-packages目录的。这个目录当然就是一些第三方库的目录了,默认情况下生成的这个目录中是只带有一些基本的第三方包的。传说加上--system-site-packages作为参数可以把系统python环境中的第三方包完整地拷贝过来,但是试了一下并不行。(刚才试了一下,--no-site-packages和--system-site-packages的主要区别是在虚拟环境架设完毕后进行pip安装时,如果本来系统环境中存在了想要装的包,指定--no-site-packages的会把那个包复制到虚拟环境的lib中,后者则不会。但这也不绝对。。比如我想pip install flask flask-bootstrap的时候,装flask包时确实能体现这个区别,但是装flask-bootstrap的时候,无论用啥参数flask-bootstrap文件就是不被复制过来。。)
另外在目录下还可以看到一个activate文件。这个文件是进入虚拟环境的入口。键入source activate就可以看到命令行的提示符前面多出了一个小括号,括号中是虚拟环境的名字。进入虚拟环境之后,键入pip,python等命令时运行的就不再是系统python环境中的那些命令了。用which python就可以看一下,显示的应该已经不是/usr/bin/python了。因此,在这个环境中(无论你在哪个目录下),只要调用了python命令来运行脚本的话,那么它所用的第三方库等上下文就是虚拟环境的上下文了。所以在虚拟环境的lib目录下安装想要的第三方包,然后用这个虚拟环境的python启动程序,就可以使这个程序或者项目处于一个相对独立封闭的环境中了。
说到安装,虚拟环境中自带了pip,也就是提示我们可以用pip安装。而且pip安装方便的一点在于,如果你要安装的包已经存在于系统python环境中了,那么pip不会再去PyPI上面下载,而是直接从系统环境中复制过来就好,所以安装速度也大大提高。另外,用pip freeze > requirement.txt这个命令可以将虚拟环境上下文中的python包的要求和依赖固化到requirement.txt这个文件中。当程序进行迁移但环境没有迁移的时候,只要在新环境中键入pip install -r requirement.txt来一口气安装所有这些依赖即可。将虚拟环境和pip freeze两个东西结合起来用十分方便
■ 关于程序迁移的问题
项目开发过程中,常常遇到的就是在开发环境开发完成之后上线生产环境,但是生产环境的python环境不一定和开发环境一致,引起很多麻烦。
此时用虚拟环境可以节省力气。比如生产环境上面装了virtualenv,那么就可以在合适的地方建立一个虚拟环境,然后activate进入这个虚拟环境之后根据开发环境中固化下来的requirement.txt在虚拟环境中pip install -r requirement.txt。一口气就可以把所有依赖包都装进去。然后进入虚拟环境,用虚拟环境python启动程序(或者直接通过路径调用虚拟环境目录下的bin/python来启动)就可以做到和开发环境一样了。
不过能这么做还是比较好的情况,假如生产环境没网呢?这时得想另外办法。在有网的地方搭建一套虚拟环境然后pip install相关包然后再把那些文件复制过来不失为一个好办法,不过略显麻烦。另一个办法是这样的:直接把开发环境的整个虚拟环境复制到生产环境上,如果复制过去之后的路径相比于开发环境有变化,那么可以改动一下activate中VIRTUAL_ENV这个即将被添加的环境变量为新目录,这样就可以保证source activate出来的虚拟环境仍然是保持虚拟环境而不是变成了系统环境。(其实看下activate的代码不难发现,所谓虚拟环境只是在source activate的时候增加了一点环境变量,包括把虚拟环境下bin目录添加到PATH中并且先于原先所有PATH,所以在键入python的时候调用的是虚拟环境的python了,其余一些环境变量也类似。deactivate就是把这些环境变量恢复原值。)然后在项目中添加一个启动脚本,这个脚本先进入虚拟环境然后调用python启动程序,一切就和开发环境一样了。
请注意:上面的迁移要成功有一个大前提,就是生产环境和开发环境的python版本要一样。。。如果在python2.7下开发,迁移到2.6上很可能就会报缺少libpython2.7.so.1.0之类的错误。如果真的想要一站式解决这个问题,比如想把这个程序移植到没有python的环境中去,那么需要把整个python都安装过去。
■ windows下的virtualenv
windows下的virtualenv生成的虚拟环境的目录和linux下不太一样。主要区别在于bin目录被改名成Scripts目录且里面都是一些.exe文件包括activate。然后lib改叫Lib了。其他的好像倒也都类似
■ virtualenvwrapper
有空再补充吧。。
【Python】 virtualenv虚拟环境建设和管理的更多相关文章
- 创建 Python Virtualenv 虚拟隔离环境
video:创建 Python Virtualenv 虚拟隔离环境 python 虚拟环境 venv 简单用法 - littlemore - 博客园 创建 Python Virtualenv 虚拟隔离 ...
- python virtualenv 管理工具 - virtualenvwrapper
我们使用python virtualenv构建不同的python环境,python3 也加入了virtualenv 模块. virtualenvwrapper 提供了更便捷的 virtualenv环境 ...
- centos下python多版本管理(pyenv+python+virtualenv+ipython)
pyenv是个多版本python管理器,可以同时管理多个python版本共存,如pypy,miniconde等等 1 环境准备 安装相关软件和pyenv1.1 安装相关软件yum install -y ...
- Python Virtualenv运行Django环境配置
系统: RHEL6.5 版本说明: Python-3.5.0 Django-1.10.4 virtualenv:为每个项目建立不同的/独立的Python环境,你将为每个项目安装所有需要的软件包到它们各 ...
- Python virtualenv with Sublime Text 3
背景介绍 最近喜欢上了Sublime编辑器,刚开始学着用.不过对我这个python狂人来讲,首要问题是需要sublime支持python virtualenv包的导入.所以我就找了google最后找到 ...
- python virtualenv环境运行django
python virtualenv环境运行django 安装前准备 检查pip版本与python版本是否一致 [root@localhost bin]# whereis pip pip: /usr/b ...
- Python virtualenv安装库报错SSL: CERTIFICATE_VERIFY_FAILED
Python virtualenv安装库报错SSL: CERTIFICATE_VERIFY_FAILED 问题描述 使用pip按照virtualenv报错,如下: pip install virtua ...
- python:利用logbook模块管理日志
日志管理作为软件项目的通用部分,无论是开发还是自动化测试过程中,都显得尤为重要. 最初是打算利用python的logging模块来管理日志的,后来看了些github及其他人的自动化框架设计,做了个比对 ...
- nginx之全局设置,location,虚拟主机,日志管理
nginx之全局设置,location,虚拟主机,日志管理 worker_processes 1;//子进程,cpu数*核数 ****************全局设置************** ** ...
随机推荐
- gm8180:arm linux启动加载模块、运行程序
1. init #!/bin/busybox ash#load modules mao 2013-02-16 14:12:48 echo "************************m ...
- 在windows XP系统下编译和使用ffmpeg
最近在做流媒体开发这一块,在服务器端,所用的live555不支持mp4,avi等视频容器格式,所以打算运用ffmpeg来进行扩展.将MP4文件先运用ffmpeg进行解析,解析成live555所支持的基 ...
- DBUtils-对JDBC简单封装的开源工具类库
DBUtils 是对JDBC简单封装的开源工具类 详细介绍地址: https://baike.baidu.com/item/Dbutils/10655914?fr=aladdin 在使用DBUtil ...
- stun/turn/ice学习笔记
stun基本只是用于client探测NAT之后靠近stun server的外网地址,本身不包含应用数据通信的功能,其底层STUN协议通信多是基于UDP的.多个端点之间相互通过信令通道拿到彼此的NAT外 ...
- Codeforces Round #432 (Div. 1) B. Arpa and a list of numbers
qtmd的复习pat,老子不想看了,还不如练几道cf 这题首先可以很容易想到讨论最后的共因子为素数 这个素数太多了,1-1e6之间的素数 复杂度爆炸 所以使用了前缀和,对于每个素数k的每个小区间 (k ...
- 一道bfs与邻接表应用题
Problem Description 终于有一天,王元姬用他的劫打上了最强王者.他号称,他从来不会在偶数段位停留,因为他的实力太强会跳段(这个13我给满分).傲娇棠和翔妹觉得他的13装的都比勇哥哥好 ...
- Hibernate【查询、连接池、逆向工程】
前言 在Hibernate的第二篇中只是简单地说了Hibernate的几种查询方式....到目前为止,我们都是使用一些简单的主键查询阿...使用HQL查询所有的数据....本博文主要讲解Hiberna ...
- toggle的用法(点击更换不同的function)当指定元素被点击时,在两个或多个函数之间轮流切换。
一,用法 <html> <head> <script type="text/javascript" src="/jquery/jquery. ...
- 【转】MySQL乐观锁在分布式场景下的实践
背景 在电商购物的场景下,当我们点击购物时,后端服务就会对相应的商品进行减库存操作.在单实例部署的情况,我们可以简单地使用JVM提供的锁机制对减库存操作进行加锁,防止多个用户同时点击购买后导致的库存不 ...
- C#图解教程 第八章 表达式和运算符
表达式和运算符 表达式字面量 整数字面量实数字面量字符字面量字符串字面量 求值顺序 优先级结合性 简单算术运算符求余运算符关系比较运算符和相等比较运算符递增运算符和递减运算符条件逻辑运算符逻辑运算符移 ...