【Python】Python2.7升级Python3

需求背景

  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)