windows环境下使用virtualenv对python进行多版本隔离
最近在用python做一个文本的情感分析的项目,用到tensorflow,需要用python3的版本,之前因为《机器学习实战》那本书的缘故,用的是python2.7.所以目前的情况是要两个版本共存,之前看到身边有人为了解决这个问题,居然装了两款软件,pycharm用来做python2.7的开发,另一款用来做python3.6的开发,估计一定是不知道python的虚拟环境工具virtualenv.本文就来讲述一下这个工具是怎么用的,同时也讲一下,如何在pycharm中使用virtualenv.
1. virtualenv的安装
virtualenv的安装和其它python上的软件安装一样,有两种方法,pip 和setup方法安装。
值得注意的是,我们说virutalenv的安装是为了解决多版本python共存的问题,暗含了,你的至少有一个python版本是已经存在,并且可以正常工作的。
我这里的主环境是python2.7
1.1 pip安装virtualenv
pip install virtualenv
当然了,卸载就是:pip uninstall virtualenv.
如果pip没有安装的话,可以看下面的第二种安装virtualenv的方法,顺带将pip也安装了。
1.2 源码安装virtualenv
在virtualenv的官网下载最新的tar.gz包:https://pypi.python.org/pypi/virtualenv/15.1.0#downloads
将tar.gz包解压后,目录切换到virutualenv的目录下,然后在执行一下命令:
c:\virtualenv-15.1.0>python setup.py install
如果pip没有安装,就按照上面方法,下载最新pip的tar.gz包安装即可。
2. 用virtualenv配置python虚拟环境
说到用virtualenv配置python的虚拟环境,其实就是将某个特定项目(或者说目录下)配置成某个python版本。
如下:
现在要将c:\PythonProj\sjtu-cs 这个项目(我认为说成目录更准确些)配置成python3.6的版本,因为这个目录下全部是python3.5的东西,用python2.7去运行显然是有问题的。也就是说要用virtualenv去创建python3.6.1的虚拟环境。值得一提的是,虚拟什么版本的python,一定是这个python提前已经装好了。
首先:准备对哪个目录进行虚拟,就先进入到这个目录下(这里是c:\PythonProj\sjtu-cs ),然后运行命令:
virtualenv -p c:\Python36\python.exe HigEnv
说明: -p就是python的版本(需要带上路径,这是因为在我们的环境变量里只有python2.7) HigEnv就是虚拟的环境变量。
如果不知道virtual,可以执行下面的命令进行查看:
上面都解释的很清楚,这里不再赘述。
我们看一下现在我们配置的是否生效了:
显然没有生效,因为需要激活。
3. 激活虚拟环境变量
c:\PythonProj\sjtu-cs>cd HigEnv/Scripts c:\PythonProj\sjtu-cs\HigEnv\Scripts>activate
验证一下:
>>> python "hello ,world"
python3和python2最明显的一个区别就是print由打印语句变成函数了。
退出激活环境用下面的命令:
(HigEnv) c:\PythonProj\sjtu-cs\HigEnv\Scripts>deactivate
值得注意的是,退出终端,重新进来的时候,如果没有激活,我们配置的虚拟环境是不会生效的,linux就不一样了,一直生效,不用每次都激活,目前还在研究中。
4. 在pycharm中使用virtualenv
pycharm开发工具是我目前见过最好的python开发工具,非常强大,本身已经集成了virtualenv工具,所以我们如果用它做开发,根本无需手工安装virtualenv,
不过话又说回来,在windows下的virtualenv使用方法和linux大同小异,会了windows,linux一通百通。
4.1 新建项目,*选择python版本
当导入已有项目时,pychar会自动选择相匹配的python版本,当然你也可以选,方法在后面。另外python2和python3分别向下兼容,你不会除了这两个版本还有其余版本吧。
4.2. 在pycharm中创建virtualenv的虚拟环境:
当然了,你也可以不用创建环境变量,直接选择你需要的就可以了:
打开你需要选择python版本的项目,然后直接选择需要的project interpreter.
OK!