美文网首页
Python版本冲突?试试配置多个版本!

Python版本冲突?试试配置多个版本!

作者: 未子涵 | 来源:发表于2018-12-19 10:46 被阅读0次

    问题

    有个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就有两种方案:

    1. 系统环境变量使用python 3.7.1,为cocos项目创建python 27的虚拟环境,而且此时无论是使用下述哪种方式编译cocos项目,都是使用的python 27,正常无误:
    python build_native.py
    
    cocos run -p android -m release --ap android-19
    
    1. 系统环境变量使用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:

    相关文章

      网友评论

          本文标题:Python版本冲突?试试配置多个版本!

          本文链接:https://www.haomeiwen.com/subject/zqbdkqtx.html