问题
有个cocos的项目,使用的cocos 3.13.1,官方指定需要使用python2.X(我不确定最新的cocos 3.17是否已经兼容了最新的Python 3.7.1)。如果使用python3.7.1,直接报错:
UnicodeDecodeError: 'gbk' codec can't decode byte 0xae in position 29301: illegal multibyte sequence
后来又有一个项目使用了python脚本,其中的aes加解密功能需要导入 Crypto.Cipher
模块,而2.x的python在使用aes时报错,只能兼容3.7.1版本的python。
难道每次运行不同的项目时都要先改一下环境变量吗?或者要使用绝对路径来运行python命令?当然不行,这是不能容忍的。所以,就要想办法配置多个版本的python。
思路
查了很多方案,大部分是说运行的文件中含有中文字符,或者编码格式不对,才打不开,要去错误提示的文件中删除乱码的字符等,还有一种解决方案是修改cocos-console下面的setup.py,试图让cocos适配python3.x版本,虽然作者本人说成功了,但还是有点危险,担心会导致以后cocos项目中遇到什么奇葩的问题,这种情况下排查会非常困难。所以都不可取,最后只能往指定多个版本的python方向查。也好在找到了方案如下:
该解决方案参考自 《为什么你的python版本一团糟?因为少了这个操作》
系统环境变量中配置一个通用的python版本,需要特殊版本的项目下创建一个虚拟环境,使用特定版本的python,该项目以后每次运行python脚本时都需要在该虚拟环境下执行。
还是配置为3.7.1的,保证aes功能正常使用, 那么需要对cocos使用的python单独指定为python 27,可以使用虚拟环境。
所谓虚拟环境,就是在该虚拟环境下执行的任何python脚本,都是运行与该环境所对应的python版本下。
那么我的case就有两种方案:
- 系统环境变量使用python 3.7.1,为cocos项目创建python 27的虚拟环境,而且此时无论是使用下述哪种方式编译cocos项目,都是使用的python 27,正常无误:
python build_native.py
cocos run -p android -m release --ap android-19
- 系统环境变量使用python 27,为aes加解密的python项目创建python 3.7.1的虚拟环境。
解决方案
1.安装virtualenv
pip install virtualenv
成功时输出:
Installing collected packages: virtualenv
Successfully installed virtualenv-16.1.0
如果
pip
命令无法识别,需要安装,方法见【Windows安装Python和pip】
2.创建虚拟环境
进入到合适的目录下(一般是项目根目录,但不建议加入 git 仓库里提交),通过 virtualenv 命令创建一个名为 MY_ENV 的环境(这个名字可自定义)
virtualenv MY_ENV
成功时输出:
D:\work\GitHub\SMSSDK-for-Cocos2d>virtualenv MY_ENV
Using base prefix 'd:\\env\\python\\python3.7.1'
New python executable in D:\work\GitHub\SMSSDK-for-Cocos2d\MY_ENV\Scripts\python
.exe
Installing setuptools, pip, wheel...
done.
同时会在工作目录下创建文件夹MY_ENV
,默认会使用virtualenv所在的python版本。
你也可以在创建时就指定Python版本
virtualenv -p D:\env\Python27\python.exe ENV27
这样就会在当前工作目录下再创建一个ENV27的目录,其中的虚拟环境就是Python27,在其中执行python脚本时将在27的环境中运行,成功时输出:
D:\work\GitHub\SMSSDK-for-Cocos2d>virtualenv -p D:\env\Python27\python.exe ENV27
Running virtualenv with interpreter D:\env\Python27\python.exe
New python executable in D:\work\GitHub\SMSSDK-for-Cocos2d\ENV27\Scripts\python.
exe
Installing setuptools, pip, wheel...
done.
3.激活
使用虚拟环境前,需要“激活”环境:
Windows:
MY_ENV\Scripts\activate
Linux:
source MY_ENV/bin/activate
路径根据你所在位置会有所不同,也可以使用完整路径。
激活环境之后,命令行前面会用括号标识出你所在的环境。这时候再通过 pip 安装第三方模块,就不会影响到系统本身的 Python 环境。而你在该环境下运行的任何和python有关的内容都是使用指定的python版本运行的。
D:\work\GitHub\SMSSDK-for-Cocos2d>MY_ENV\Scripts\activate
(MY_ENV) D:\work\GitHub\SMSSDK-for-Cocos2d>
4.关闭
当不需要环境时,可以通过 deactivate
命令关闭。当然,直接关掉命令行窗口也没毛病。
虚拟环境的本质
环境变量的作用不用说了,当你环境变量中针对同一个命令同时配了多个路径时,系统会使用最先找到的路径。先查看一下当前的系统环境变量中的PATH:
Windows:
echo %PATH%
Linux:
echo $PATH
输出为:
接下来激活一个虚拟环境,然后再查看一下PATH:
可见,就是在 PATH 的开头增加了我们创建的目录,使用这个目录里的 Python 及相关库。安装新的库也是装在新建的这个目录之下。从而避免与其他版本发生干扰。
你还可以通过 where/which
命令查看究竟使用的是哪个路径下的python:
网友评论