Windows系统下多个Python版本共存的问题

Posted by Taolee on May 2, 2016

在windows上需要存在多个python版本时,比如python2和python3同时存在,假定python2和3的安装目录分别为: C:\Python27和 C:\Python35。设置windows的步骤如下:

设置path环境变量:

假定你想要的默认的python版本为python27,将C:\Python27;C:\Python27\Scripts; C:\Python35;C:\Python35\Scripts;加入环境变量。如果要python3设为默认版本,则 将Python35开头的路径加在前面; 将python35路径下的 python.exe 和pythonw.exe复制并改名为 python3.exe和pythonw3.exe,注意使用复制是为了,防止有的模块需要直接调用 python.exe文件名,防止出错。

pip和virtual

将C:\Python35\Script文件夹下的 pip 和virtualenv直接改名为 pip3和 virtualenv3,并不好使,直接改名会报错 “Fatal error in launcher: Unable to create process using “””。 参考网址stackoverflow上的问答 可以采用 python3 -m pip installpython3 -m virtualenv XXXX 来代替直接执行 pip和virutal 不会出错。 所以在 C:\Python35\Script 下新建两个python脚本,将 pip3 XXX 转义成 python3 -m pip XXX, 将 virtualenv3 xxx转义成 python -m virtualenv xxx.两个文件的代码如下:

pip3.py

import sys
import subprocess
print(" ".join(sys.argv))
cmd = "python3 -m pip " + " ".join(sys.argv[1:])
obj = subprocess.Popen(cmd)
obj.wait()

virtualenv3.py

import sys
import subprocess
print(" ".join(sys.argv))
cmd = "python3 -m pip " + " ".join(sys.argv[1:])
obj = subprocess.Popen(cmd)
obj.wait()

两个python脚本都利用了 subprocess模块的 Popen对象来执行子进程,同时默认将stdin和stdout等定位在当前是的窗口中。