Windows10下解决多个版本Python共存问题初探

    • 为何要在一个系统中装多个Python版本
    • 如何解决多版本共存问题
      • 原理:系统如何找到指定版本的Python?
      • 常见四种方法实现多版本共存的评述
        • 1. 临时性修改系统路径
        • 2. 永久性修改系统路径
        • 3. 修改python.exe的文件名
        • 4. 使用Python启动器py.exe
      • 改进方法
        • 用批处理进行临时系统路径设置
        • 用SETX长久修改系统环境变量
    • 有没有更好的办法?

为何要在一个系统中装多个Python版本

Python的主版本有2和3两个,还有一些特殊的包要求特殊的版本号。软件开发和测试中,可能会遇到不同开发对Python版本和包的要求不同,还可能要测试编写代码在不同环境下的兼容情况,或在同一机器上同时运行多个对版本要求和依赖包要求不同的Python环境。诸如此类,都需要解决多版本Python共存的问题。
以上问题可以分为两类:

  1. 在系统中安装多个独立的Python版本,依据需要切换应用和测试环境。但这些Pyhton版本不是同时工作的。
  2. 要让系统中多个Python版本能够同时独立运行,而各自的运行环境做到相互隔离,各自使用不同的版本,不同的依赖包。而这些独立运行的py程序在数据上又是可交互或共享的。

有时,即使同一版本的Python下也会产生依赖包之间的冲突,这种情况下,我们就需要为不同的应用配置不同的依赖包,以避免相互冲突。这个问题更归为第二类问题。

如何解决多版本共存问题

原理:系统如何找到指定版本的Python?

windows系统通过环境变量path来指向可执行文件的位置。如果path中有多条路径指向不同文件夹下的同名程序,则系统会以写在前的为优先。
系统path可通过控制面板\系统和安全\系统\高级系统设置打开查看,也可在windows控制台(cmd或power shell)中以pathset path命令查看。
假设某一版本的Python安装位置为:
d:\py\python26,则要将该位置及其下的Scripts文件夹路径d:\py\python26\Scripts添加到环境变量path中。

常见四种方法实现多版本共存的评述

1. 临时性修改系统路径

基于上述原理,针对第一类问题,对系统环境变量的修改可以用set命令进行临时性更改。临时性更改只对当前控制台窗口有效。如

set path=%path%d:\py\python26;d:\py\python26\Scripts;

set命令不会修改windows的注册表,所以是临时性的。只对当前控制台窗口有效。

这种方法的好处同时也是坏处–临时性。可以开多个命令窗口来同时执行多个不同版本的python程序。但总是每次都要设置,虽然可以用批处理文件来简化操作,但总归麻烦。

2. 永久性修改系统路径

针对第一类问题,只要安装多个Python时,每次安装都不让Windows操作系统自动配置Pyhton的工作路径即可(在Python安装时不要选自动添加路径即可)。在要用到指定版本的Python时手工添加该版本Python所在路径到系统环境变量path中即可。用完了再手工将这个路径从系统环境变量path中删掉。
系统环境变量的配置可用sysdm.cpl命令从控制台打开,也可从windows的控制面板的控制面板\系统和安全\系统\高级系统设置打开`,编辑环境变量即可。
这种做法的缺点是:(1)配置要手工操作,麻烦;(2)由于配置是全局的,所以不可能同时执行不同版本的python程序。

3. 修改python.exe的文件名

这种思路下,多个版本的python可执行文件路径都配置在系统环境变量path中,但是通过修改可执行文件python.exe的文件名来进行区分。如将2版本的改名为python2.exe,将3版本的改名为python3.exe等等。对应的pip文件也用pip2和pip3改名或拷贝重命名。
这样做的坏处是:其他应用程序中如果调用python的默认指令是python.exe的话,则要修改后方能指向对应的版本。这些不同python版本不是完全分离的,所以有潜在冲突的可能。

4. 使用Python启动器py.exe

python安装时候在电脑上会安装核心启动py.exe,通过传递参数可识别并对应启动电脑上python版本。而且可极大解决的pip installa安装时候的问题。即

py -2   //启动2版本的
py -3   //启动3版本的

python2下pip安装命令如下:
py -2 -m pip install xxxxxx

python3下pip安装命令如下:
py -3 -m pip install xxxxxx

这是Python原生的方法,但不能支持更多的版本,也无法解决其他应用程序中如果调用python的默认指令是python.exe的问题。

综上4种方法,第1,2种是基本的。第3,4种或多或少存在与其他软件的调用关系问题。所以不建议使用。

改进方法

用批处理进行临时系统路径设置

临时性设置path的方法可以灵活更改调用python解释器版本,并可在不同控制台窗口同时调用不同的python版本,只是设置麻烦一点。可以用批处理文件来简化操作。

【例】我们要用Sublime Text编辑器来编辑和编译执行python。当在Sublime Text编辑代码后,并选以python编译,就可用ctrl+B编译执行。但前题是Sublime Text要能找到(即知道调用解释器的路径),否则就要报错。现要求打开一个SublimeText编辑器,能分别对应调试Pyhton2和3两个版本的代码,如何做?

【解】
预设条件:设Sublime Text软件解压释放在一个文件夹中,首先将Sublime Text的执行文件sublime_text.exe所在文件夹路径设置到系统path中。打开一个控制台窗口(win+R执行cmd.exe),执行subl即可打开一个Sublime Text编辑器。

Windows10下解决多个版本Python共存问题初探_第1张图片

执行subl.exe

Windows10下解决多个版本Python共存问题初探_第2张图片

能开启Sublime Text编辑器。由于在该控制台中没有python的执行程序路径,执行python在该控制台将报错。所以Sublime Text也会报找不到python解释器的错误。

Windows10下解决多个版本Python共存问题初探_第3张图片

设置python路径后再执行subl,Sublime Text就能正确找到Python解释器了。
建立一个bat文件如下:sublpy3.bat

set path=%path%D:\py\Python36x86;D:\py\Python36x86\Scripts;
subl.exe

以及sublpy2.bat

set path=%path%D:\py\Python27x86;D:\py\Python27x86\Scripts;
subl.exe

则,执行sublpy3.bat(可双击执行也可在控制台执行)则打开Python3作为解释器。执行sublpy2.bat则以python2作为解释器。

Windows10下解决多个版本Python共存问题初探_第4张图片

用SETX长久修改系统环境变量

采用sysdm.cpl打开系统环境变量设置对话框手工设置显然可以,但不方便。这里我介绍如何也采用批处理来修改注册表上的系统环境变量,从而改变python解释器的版本指向。

windows的SETX指令可以实现此功能,但使用有一技巧:

我们这样做:
1. 在系统环境变量中新增一个新的环境变量,例如命名为py。然后将py作为变量名加入到path变量中。
2. 用SETX改变py变量的取值即可。

Windows10下解决多个版本Python共存问题初探_第5张图片

在命令行中写:

D:\>SETX py "D:\py\Python27x86;D:\py\Python27x86\Scripts;"

则将python27版的路径赋值给py

D:\>SETX py "D:\py\Python36x86;D:\py\Python36x86\Scripts"

则将python36版的路径赋值给py

这样修改了py并将结果写入到注册表中,从而更改使用的python的版本。这样的方法可以不更改python可执行文件的名字,以使sublimetext等软件的默认参数能够工作。

注意:用SETX设置后,设置参数写入注册表,但当前控制台命令窗中的路径不会更新。需重开新的控制台命令窗才可看到更新结果。SETX默认修改的是当前用户下的路径变量,如要修改系统所有用户的路径变量,可加参数/M。

将以上方法做所批处理文件即可。例如我们做3个bat文件:
usepy3.bat

SETX py "D:\py\Python36x86;D:\py\Python36x86\Scripts"


usepy2.bat

SETX py "D:\py\Python27x86;D:\py\Python27x86\Scripts"

以及
donotuseanypy.bat

SETX py ""

这样可以任意开关python的版本了。
设置后,从新的控制台启动subl即可正确找到解释器版本。如从文件中直接点击sublime_text.exe则可能仍不能正确找到python,那么重新刷新一下文件管理器即可。

有没有更好的办法?

以上两法可以解决多版本Python在windows中共存的问题。但其实还有更好的办法。就是使用虚拟python环境。Python中有virtulenv包可用,在Python3.4以上还自带了venv包完成与virtulenv包一样的功能。

virtulenv包的原理还是为各版的python设置独立的系统路径变量,从而实现分离和共存。

设置了python的virtulenv环境后,通过控制台窗口进入相应目录,以activate.bat激活之。以deactivate.bat退出之。激活后从该窗口中执行subl即进入了对应该虚拟环境的sublimeText编辑器中。
例如:(//后为我的注释)

D:\mypywork\py27work\Scripts>activate
//进入虚拟环境后,在盘符前有相应提示。(py27work)
(py27work) D:\mypywork\py27work\Scripts>subl  
//可以从这启动sublime编辑器

(py27work) D:\mypywork\py27work\Scripts>deactivate    
//退出虚拟环境
D:\mypywork\py27work\Scripts>

下回再细讲。

你可能感兴趣的:(Python编程技术)