0
点赞
收藏
分享

微信扫一扫

py2to3——如何将Python2项目升级为Python3项目

1kesou 2022-02-09 阅读 67



py2to3——如何将Python2项目升级为Python3项目


  • ​​前言​​
  • ​​2to3​​
  • ​​py2to3​​
  • ​​快速开始​​
  • ​​需要注意​​

  • ​​from compiler.ast import flatten​​
  • ​​import hashlib​​
  • ​​Runtimeerror: generator raised StopIteration​​
  • ​​持续更新,欢迎评论。。。​​

  • ​​结语​​
  • ​​关于作者​​


前言

目前为止我总共用这个方法论对两个Python2web框架升级。

本编主要为踩坑篇,如果有不错的经验分享欢迎评论✌

2to3

Python有自带的转换模块,可以将xxx.py的Python2语法转换为Python3语法。2to3转换的语法内容有限,但是也足够我们的需求了,我们只需要通过2to3将整个项目进行语法转换,然后再进行小部分的调整就可以了。(毋庸置疑的是现在这个方法并不能被证实是完全稳定的,短期转换肯定是会存在一些bug的,特别是一些大型的框架服务,所以还需要进行微调)

关于2to3

​​​https://docs.python.org/zh-cn/3.8/library/2to3.html​​​

py2to3

就是对2to3模块进行了一个简单的封装,可以实现对整个项目的xxx.py调用2to3模块

快速开始

git clone https://github.com/99kies/2to3
cd 2to3
python py2to3.py /your_py2_project_path
# 项目中只要修改过的py文件都会将old版本备份一份,如有需要可以通过del_bak.py来删除bak文件
python del_bak.py /your_py2_project_path
# 路径不要乱填,del_bak 是专门删除bak文件的!

这样就可以实现整个项目的转换了,详细内容可以查看

​javascript:void(0)">​javascript:void(0)​​

​​​https://github.com/99kies/2to3​​​

需要注意

需要注意一些Only Python2的库,当然如果你感兴趣可以发表一下评论或者帮助我一起优化py2to3这个项目。

​​​https://github.com/99kies/py2to3​​​

from compiler.ast import flatten

如果你的py2项目里有这个东西,在Python3中可以这样子替换flatten函数

import collections
def flatten(x):
result = []
for el in x:
if isinstance(x, collections.Iterable) and not isinstance(el, str):
result.extend(flatten(el))
else:
result.append(el)
return result

import hashlib

Python3中多了个bytes类型

Python3注意对str进行encode(‘utf8’)

Python2 Demo

import hashlib

def md5encode(plaintext):
m = hashlib.md5()
origin = plaintext
m.update(origin)
return m.hexdigest()

Python3 Demo

import hashlib

def md5encode(plaintext):
m = hashlib.md5()
origin = plaintext
m.update(origin.encode('utf8'))
return m.hexdigest()

Runtimeerror: generator raised StopIteration

当Python3.7-alpine运行Flask-web服务时,出现 Runtimeerror: generator raised StopIteration 报错

参考链接:


  • ​​https://github.com/pypa/setuptools/issues/1285​​
  • ​​https://gitlab.com/ita1024/waf/issues​​
  • ​​https://github.com/spacetelescope/hstcal/issues/359​​

WAF与Python 3.7不兼容

解决方法

放弃Python3.7版本转用Python3.6版本

#FROM python3.7-alpine
FROM python:3.6-alpine

持续更新,欢迎评论。。。

结语

如果只是替换函数或者是基础语句,这个方法确实十分有用,但是不免会遗漏一些内容。不过先借用这个方法,再去细化工作,会减少许多工作量。

如果有心大的哥,当基础服务实现了,就上线服务,等用户反馈bug也是可以。

项目地址 ​​https://github.com/99kies/2to3​​

关于作者


py2to3——如何将Python2项目升级为Python3项目_sed


你也可以通过 ​​github​​ ​​@新浪微博​​ 关注我的动态



举报

相关推荐

0 条评论