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
关于作者
你也可以通过 github @新浪微博 关注我的动态