美文网首页
【Python】Python2.7升级Python3

【Python】Python2.7升级Python3

作者: Draven_Lu | 来源:发表于2021-01-07 11:14 被阅读0次

    需求背景

    1. 服务是跑在docker的容器里的,因此要新建image
    2. 依赖环境是Ubuntu,老的是16.4。

    步骤

    先准备环境,因为只有你的环境上去了,运行代码的时候才会报错,这样才会把需要改的代码暴露出来。
    python3.5目前也是被遗弃的状态,我不升级3.9是因为Ubuntu20.4自带python3.8,之前自己安装3.9各种报错

    python环境升级

    dockerfile所在目录

    sources.list是对应的Ubuntu的阿里镜像源(这个镜像也可以是清华的,只要和Ubuntu的版本对应起来即可)
    对应关系在这里

    #ubuntu20.4的阿里镜像源
    deb http://mirrors.aliyun.com/ubuntu/ focal main restricted universe multiverse
    deb-src http://mirrors.aliyun.com/ubuntu/ focal main restricted universe multiverse
    
    deb http://mirrors.aliyun.com/ubuntu/ focal-security main restricted universe multiverse
    deb-src http://mirrors.aliyun.com/ubuntu/ focal-security main restricted universe multiverse
    
    deb http://mirrors.aliyun.com/ubuntu/ focal-updates main restricted universe multiverse
    deb-src http://mirrors.aliyun.com/ubuntu/ focal-updates main restricted universe multiverse
    
    deb http://mirrors.aliyun.com/ubuntu/ focal-proposed main restricted universe multiverse
    deb-src http://mirrors.aliyun.com/ubuntu/ focal-proposed main restricted universe multiverse
    
    deb http://mirrors.aliyun.com/ubuntu/ focal-backports main restricted universe multiverse
    deb-src http://mirrors.aliyun.com/ubuntu/ focal-backports main restricted universe multiverse
    
    

    requirements.txt是项目所需的一些依赖库

    #requirements.txt 项目所需的一些依赖库
    appdirs==1.4.4
    cryptography==3.3.1
    ecdsa==0.14.1
    Flask==1.1.2
    Flask-Cors==3.0.10
    Flask-JWT==0.3.2
    Flask-PyMongo==2.3.0
    future==0.18.2
    idna==2.10
    ipaddress==1.0.23
    itsdangerous==1.1.0
    Jinja2==2.11.2
    MarkupSafe==1.1.1
    packaging==20.8
    pyasn1==0.4.8
    pycparser==2.20
    pycrypto==2.6.1
    PyInstaller==4.1
    .
    .
    .
    

    dockerfile文件里的东西也很简单,就安装一些项目需要的就可以了

    FROM ubuntu:20.04
    #更新ubuntu的软件源-draven,sources.list中的镜像要和ubuntu的版本对应起来
    COPY ./sources.list /etc/apt/sources.list
    RUN  apt-get update
    
    # 建立工作目录 /app
    WORKDIR /home/workspace
    ENV WORKSPACE /home/workspace
    # 将当前文件所在的目录下的所有文件 copy 到工作目录
    COPY . /home/workspace
    RUN mkdir -p /home/requirements && chmod -R 777 /home/requirements
    COPY requirements.txt /home/requirements/
    
    #设置时区
    RUN apt-get install tzdata -y
    RUN echo "Asia/Shanghai" > /etc/timezone && dpkg-reconfigure -f noninteractive tzdata
    RUN cp /usr/share/zoneinfo/Asia/Shanghai /etc/localtime && rm /etc/timezone && echo "Asia/Shanghai" >> /etc/timezone
    RUN date
    #设置忽略警告信息
    ARG DEBIAN_FRONTEND=noninteractive
    RUN apt-get install --assume-yes apt-utils
    
    RUN apt-get install curl -y
    RUN apt-get install -y apt-transport-https
    
    RUN echo -n | openssl s_client -connect www.mobibrw.com:443 | sed -ne '/-BEGIN CERTIFICATE-/,/-END CERTIFICATE-/p' |  tee '/usr/local/share/ca-certificates/www_mobibrw_com.crt'
    RUN update-ca-certificates
    RUN apt-get install -y gcc g++ make
    
    RUN apt-get install python3-pip -y
    RUN pip3 install --upgrade pip
    RUN apt-get install vim -y
    RUN apt-get install libssl-dev -y
    RUN apt-get install libffi-dev
    #提前把项目需要的依赖库安装在python的site-packages,pip会自动完成
    RUN pip3 install -r requirements.txt
    
    RUN apt-get install nodejs -y
    RUN apt-get install npm -y
    
    然后准备工作做好了,cd到dockerfile所在目录,执行如下命令

    docker build -t yourImageName:yourVersioninfo .
    其中最后的这个点是表示在当前目录
    然后就是耐心的等待,一层一层的layer嵌套

    至此我们的环境就准备好了,其实上述的结果都是我经过不停的尝试和摸索的结果

    • 刚开始我不知道Ubuntu20.4默认安装python3.8,且没有python2.7,然后自己一顿安装python3.5和3.9
    • 不知道docker image的制作,就把老的image拿来改,结果费煞苦心还不好使,python各种依赖包错误,改项目的python代码也是各种报错(知道原理后,直接整新的image比较好)
      *环境装好之后 要在容器中去看python的版本信息,常用命令
      whereis python 可以看python的安装目录信息,版本信息
      pip -V 或者pip3 -V 查看pip的信息
    • 还有就是如果python3如果是你手动安装的,不要折腾软连接了,把对应编译代码的命令改了就行

    python代码修改

    具体python2.7的代码修改网上已经有很多了,百度就够了
    这里就记录下自己遇到的几点问题

    • python的字符串问题
      主要体现在print函数,这个python的那个2-3框架可以做,自己手动改也OK,我项目中这样的代码不是很多
    • 编码解码问题
      python3.5之后采用的是Unicode编码,其中string和bytes是我遇到问题最多的场景

    如果报错b'myString' XXXX 基本就是说需要一个字符串,但是你给了个bytes[]
    如果报错decode或者encode的参数不对,再或者是序列化不对,也基本是python3升级后的语法变化,具体错误看trace call然后基本都能搞定

    总结

    这次一个很小的一个后台管理系统的服务端项目升级,我差不多花了10天的时间
    1.python不熟,早点用pycharm修改代码会快很多
    2.docker也不熟,以前只是启container,在里面操作
    3.这次摸了这些石头,下次过河应该就会轻松很多

    截屏2021-01-07上午11.17.16.png
    可以看到上图中各种版本的image都有,python3.5的,3.8,web专用的
    其中的none就是在build image的时候那一行命令对应的一层,如果某条命令失败了,重新build即可,因为之前的layer还在,这个docker的设计还是很棒的

    相关文章

      网友评论

          本文标题:【Python】Python2.7升级Python3

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