当前位置: 首页 > news >正文

【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 multiversedeb http://mirrors.aliyun.com/ubuntu/ focal-security main restricted universe multiverse
deb-src http://mirrors.aliyun.com/ubuntu/ focal-security main restricted universe multiversedeb http://mirrors.aliyun.com/ubuntu/ focal-updates main restricted universe multiverse
deb-src http://mirrors.aliyun.com/ubuntu/ focal-updates main restricted universe multiversedeb http://mirrors.aliyun.com/ubuntu/ focal-proposed main restricted universe multiverse
deb-src http://mirrors.aliyun.com/ubuntu/ focal-proposed main restricted universe multiversedeb 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-utilsRUN apt-get install curl -y
RUN apt-get install -y apt-transport-httpsRUN 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++ makeRUN 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.txtRUN 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的设计还是很棒的

最后编辑于:2024-10-01 17:48:35


喜欢的朋友记得点赞、收藏、关注哦!!!

http://www.lryc.cn/news/467487.html

相关文章:

  • Python 内置函数 round() 详解
  • JavaScript入门中-流程控制语句
  • kconfig语法(一)
  • 十七、行为型(命令模式)
  • 原材料供应商的GRS认证证书过期了怎么办?
  • C++编程:实现一个基于原始指针的环形缓冲区(RingBuffer)缓存串口数据
  • LangChain 创始人万字科普:手把手教你设计 Agent 用户交互
  • Docker 用例:15 种最常见的 Docker 使用方法
  • 若依 RuoYi4.6.0 代码审计
  • C语言入门-选择结构
  • Legion拯救者 刃7000K-26IAB联想台式机T5 26IAB7(90SU,90SV,90SW,90SX)原厂Windows11系统镜像下载
  • 代码随想录算法训练营第二十四天|Day24 回溯算法
  • vue elementui table编辑表单时,弹框增加编辑明细数据
  • springboot集成Redisson做分布式消息队列
  • 如何通过Lua语言请求接口拿到数据
  • Android 13 SystemUI 隐藏下拉快捷面板部分模块(wifi,bt,nfc等)入口
  • 自由学习记录(14)
  • 疯狂Spring Boot讲义[推荐1]
  • vue中$nextTick的作用是什么,什么时候使用
  • Redis实现全局ID生成器
  • Xshell远程连接工具详解
  • 如何在verilog设计的磁盘阵列控制器中实现不同RAID级别(如RAID 0、RAID 1等)的切换?
  • 基于元神操作系统实现NTFS文件操作(十)
  • Qt的几个函数方法
  • openpnp - bug - 散料飞达至少定义2个物料
  • HDFS异常org.apache.hadoop.hdfs.protocol.NSQuotaExceededException
  • 数据库的构成与手写简单数据库的探索
  • 基于STM32的智能晾衣架设计
  • 【MAUI】模糊控件(毛玻璃高斯模糊亚克力模糊)
  • 深度学习:pandas篇