Python的主版本有2和3两个,还有一些特殊的包要求特殊的版本号。软件开发和测试中,可能会遇到不同开发对Python版本和包的要求不同,还可能要测试编写代码在不同环境下的兼容情况,或在同一机器上同时运行多个对版本要求和依赖包要求不同的Python环境。诸如此类,都需要解决多版本Python共存的问题。
以上问题可以分为两类:
有时,即使同一版本的Python下也会产生依赖包之间的冲突,这种情况下,我们就需要为不同的应用配置不同的依赖包,以避免相互冲突。这个问题更归为第二类问题。
windows系统通过环境变量path
来指向可执行文件的位置。如果path
中有多条路径指向不同文件夹下的同名程序,则系统会以写在前的为优先。
系统path
可通过控制面板\系统和安全\系统\高级系统设置
打开查看,也可在windows控制台(cmd或power shell)中以path
或set path
命令查看。
假设某一版本的Python安装位置为:
d:\py\python26
,则要将该位置及其下的Scripts
文件夹路径d:\py\python26\Scripts
添加到环境变量path
中。
基于上述原理,针对第一类问题,对系统环境变量的修改可以用set命令进行临时性更改。临时性更改只对当前控制台窗口有效。如
set path=%path%d:\py\python26;d:\py\python26\Scripts;
set命令不会修改windows的注册表,所以是临时性的。只对当前控制台窗口有效。
这种方法的好处同时也是坏处–临时性。可以开多个命令窗口来同时执行多个不同版本的python程序。但总是每次都要设置,虽然可以用批处理文件来简化操作,但总归麻烦。
针对第一类问题,只要安装多个Python时,每次安装都不让Windows操作系统自动配置Pyhton的工作路径即可(在Python安装时不要选自动添加路径即可)。在要用到指定版本的Python时手工添加该版本Python所在路径到系统环境变量path
中即可。用完了再手工将这个路径从系统环境变量path
中删掉。
系统环境变量的配置可用sysdm.cpl
命令从控制台打开,也可从windows的控制面板的控制面板\系统和安全\系统\高级系统设置
打开`,编辑环境变量即可。
这种做法的缺点是:(1)配置要手工操作,麻烦;(2)由于配置是全局的,所以不可能同时执行不同版本的python程序。
这种思路下,多个版本的python可执行文件路径都配置在系统环境变量path
中,但是通过修改可执行文件python.exe
的文件名来进行区分。如将2版本的改名为python2.exe
,将3版本的改名为python3.exe
等等。对应的pip文件也用pip2和pip3改名或拷贝重命名。
这样做的坏处是:其他应用程序中如果调用python的默认指令是python.exe的话,则要修改后方能指向对应的版本。这些不同python版本不是完全分离的,所以有潜在冲突的可能。
python安装时候在电脑上会安装核心启动py.exe,通过传递参数可识别并对应启动电脑上python版本。而且可极大解决的pip installa安装时候的问题。即
py -2 //启动2版本的
py -3 //启动3版本的
python2下pip安装命令如下:
py -2 -m pip install xxxxxxpython3下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编辑器。
执行subl.exe
能开启Sublime Text编辑器。由于在该控制台中没有python的执行程序路径,执行python在该控制台将报错。所以Sublime Text也会报找不到python解释器的错误。
设置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作为解释器。
采用sysdm.cpl
打开系统环境变量设置对话框手工设置显然可以,但不方便。这里我介绍如何也采用批处理来修改注册表上的系统环境变量,从而改变python解释器的版本指向。
windows的SETX指令可以实现此功能,但使用有一技巧:
我们这样做:
1. 在系统环境变量中新增一个新的环境变量,例如命名为py。然后将py作为变量名加入到path变量中。
2. 用SETX改变py变量的取值即可。
在命令行中写:
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>
下回再细讲。