Windows 下 Python 双版本共存解决方案

Standard

Python 是一门很不错的语言,语言简单易学,又不失脚本语言的灵活性,还有海量的第三方库,覆盖的很全面。但也有不少“硬伤”,比如 Python 2.x 和 Python 3.x 版本之间的不兼容等等。

虽然我遇到的问题并不是很普遍,但还是把整个过程记录下来,以供以后查阅。

问题描述

平常我使用 Python 的环境一般是 Python 2.7,因为一些历史遗留的原因一直没有更换。但总会遇到一些傲娇的 package 需要 Python 3.x 的环境。因为 Python 不是向下兼容的,所以如果把原来的 2.x 代码放到 3.x 的环境下运行那肯定是要报错的。所以便需要两个版本共存。

我的需求是,平时使用的时候 python 指向的是 Python 2.7,用 python3 来表示 3.x 的环境,同时不希望修改系统的环境变量,免得引发一系列连锁问题。

解决方案

解决的方法其实也很简单,假设原来的安装目录是 C:\Python27,那么我只需要在这个目录下新建一个名为 python3.bat 的文件,其中的内容是:

@ echo off
C:\Python34\python.exe %*

这样也不需要修改环境变量,直接打 python3 可以进入命令行,或者用 python3 xxx.py 在 3.x 环境下来执行某个文件。

库的安装

如果你以为这样就完成了,那大概是没睡醒(~﹃~)~zZ。(误)这其实只是第一步,更大的问题在于第三方库的安装,比如 numpy、scipy 等。

通常在 Windows 下,我们会用 easy_install 或者 pip install 的方式安装,这本身没有什么问题。但若是多个 Python 版本,原本想为 3.x 环境装的库就全跑到默认的 2.x 下了(因为环境变量设置)。按照之前的想法,可以搞个 easy_install3 或者 pip3 的方式,但这种方式不仅诡异,而且不优雅。

那么,应该怎么办呢?在这种(双版本的)情况下,我个人不建议使用 easy_install,而是推荐 pip,因为有如下的语法:

python3 -m pip install numpy scipy

这等价于在 Python 3.x 环境下运行

pip install numpy scipy

这样就可以根据自己的需要把库装到对应的环境下了。注意到不同的环境的安装路径是隔开的,所以原本为 Python 2.7 装的 numpy 等类库,在 Python 3.x 是看不到的。

关于 pip

上面的方法,理论上看起来很完美,实际运行的也会很好(误)。我感觉大概有 50% 的几率,上面的方法在装 numpy、scipy 的库时会报错,报错的原因可能是这样的:

distutils.errors.DistutilsError: 
Setup script exited with error: Unable to find vcvarsall.bat

反正这是我遇到的最常见的错误。诡异的是,如果拿这个问题去喂谷歌,它告诉你答案成功的可能性是 ...... 看运气!其中曲折婉转、荡气回肠的情节都可以写成一部血泪史了。

然而这并没有什么鸟用。所以下面还是说一些正经的方法,也是我个人推荐的做法 → 点开这个网址(lfd.uci.edu/~gohlke/pythonlibs/#numpy)。这个是非官方的编译后的Windows源,由加利福尼亚大学欧文分校(University of California, Irvine)的 LFD 实验室(The Laboratory for Fluorescence Dynamics)的 Christoph Gohlke 提供,在此表示感谢。

然后根据你 Python 的版本来确定下载其中哪一个。例如我使用的是 Python 3.4 64bit,所以装 numpy 的时候就选用 numpy-1.10.4+mkl-cp34-none-win_amd64.whl 这个源。

先下载到本地,然后安装的时候使用 pip install <file-destination> 的命令来安装,如下图所示。

Python_pip_install

使用 pip install <filename.whl>的方式来安装第三方库

然后就装好了,全程没有任何错误。真的,只有你自己亲自试过之后,才会知道它有多么的方便!

(注意:若是多版本,可能需要使用 python3 -m pip 而非直接 pip install的方式,具体见前文。)

尾声

或许有人会好奇(实际上并没有)上面的截图里是什么东西,啊哈哈,这么机密的东西你以为我会这么轻易告诉你吗?

 

 

 

 

 

 

 

 

 

好吧,还是告诉你吧。这实际上是一种虚拟化 Python 运行环境的方式,相当于构建了一个沙盒,在里面的操作不会对外界产生影响。网上教程一搜也是一大把。下面简要地说一下步骤:

  1. 构建 (创建) 沙盒 (文件夹)
    mkdir sandbox; cd sandbox
  2. 设置 虚拟环境
    python -m venv --system-site-packages pyvenv
  3. 激活 虚拟环境
    pyvenv\Scripts\activate.bat

操作结束之后,可以 deactivate,甚至可以把沙盒的文件夹删除,也不会有负面影响。

祝君顺利!

以上

 

 

  • arnold-hu

    其实你可以试试python的virtualenv,这个是真的大杀器,只要你想,每个项目都有单独的python环境