项目从pyhon2.7升级到python3.9

一、看项目引用了哪些开源模块#####

我们项目我捋了一遍用了三个开源:

  1. pyzmq
  2. pyserial
  3. gdb

前两个直接在源码中(随便哪个入口文件头部一般会注释开源信息),找到对应的github地址,我是先自己在电脑上用pip3安装的(命令 pip3 install pyzmq/pyserial),安装完了后, 在路径
/Library/Frameworks/Python.framework/Versions/3.9/lib/python3.9/site-packages/serial
/Library/Frameworks/Python.framework/Versions/3.9/lib/python3.9/site-packages/zmq
找到这两个文件夹,然后拷贝到项目,就搞定了。

第三个gdb,没用到python,只是借用了它batch功能,所以不用升级,兼容python3.

开源模块升级完后,记得从原有项目中提出来,开始对剩下的文件进行第二步动作。

二、采用2to3工具

参考这篇文章,讲的很详细
2to3 - 自动将 Python 2 代码转为 Python 3 代码
就在终端使用命令

2to3 --output-dir=python3-version/mycode -W -n python2-version/mycode

我使用该命令是这样的

2to3 --output-dir=ph1_Script_Python3.0/ -w -n ph1_Script_Python3.0/

这样转换出来的包总是报 ImportError: attempted relative import with no known parent package的问题,这是因为2to3工具将项目import默认转成了相对地址,所以我增加了一个参数 -f all -x import ,让2to3不要把项目的import转成相对路径,修改后命令如下

2to3 -f all -x import --output-dir=ph1_Script_Python3.0/ -w -n ph1_Script_Python3.0/

这样转换出来就没有impor的问题了,然后对项目不是特别熟,所以将可选的修复器全部都选上了,最后执行的命令是这样的

2to3 -f all -x import -f buffer -f idioms -f set_literal -f ws_comma --output-dir=ph1_Script_Python3.0/ -w -n ph1_Script_Python3.0/

三、微调

前两个步骤将项目已经完全升级成python3.0版本了,接下来就是看build的时候会出什么问题,针对性的解决,就我项目而言,出现了以下几个问题

  1. .encode('string-escape' )
    python2
addLog("diag:{}".format(totalRes.encode('string-escape')))

python3

# addLog("diag:{}".format(totalRes.encode('latin1').decode('unicode-escape').encode('latin1')))
  1. exception.message
    Python2.7
try:
        main()
except Exception as ex:
        ex.message = "Software error-" + str(ex)
        OutputExceptAndExit(ex)
...
output = ex.message

Python3.9

try:
        main()
except Exception as ex:
        ex.args = ex.args+("Software error-" + str(ex),)
        OutputExceptAndExit(ex)
...
output = repr(ex)

python2的try exception和python3的区别如下


image.png
  1. python2 subprocess 函数返回值都是string
    python2
p1 = Popen(helloGDB, stdin = PIPE, stdout = PIPE, stderr = PIPE, shell = True)

python3

p1 = Popen(helloGDB, stdin = PIPE, stdout = PIPE, stderr = PIPE, shell = True, universal_newlines=True)

python3 subprocess的返回值默认都是bytes,所以在创建subprocess对象的时候传入参数universal_newlines=True,让返回值都为string,从而改动比较小

  1. python3的pyserial函数传入的参数都要求是bytes

python2

 self.port.write(cmd)
res = self.port.read_until(terminator)

python3

self.port.write(cmd.encode())
res_bytes = self.port.read_until(terminator)
        res = str(res_bytes, encoding="utf-8")
  1. Python2和3的除法不一样
    Python2.x 里,整数除整数,只能得出整数
    a = 10 ,b = 20,b / a的运行结果是2.0,所得结果是浮点型
    所以有计算出来的结果给range(a)用到了,都要做一下处理range(int(a))
image.png
  1. python2和3的取bin file文件的数据返回的类型不一样
    python2取出来的是string,但是python3直接返回的是int型,所以python2取出来的值还需要用ord(a)转换成int型,到了python3再这样做会报错
    TypeError('ord() expected string of length 1, but int found'), 所以在python3要把ord函数去掉
python3.png
python2.png
  1. python2和3 在bytes截取的返回值上不一致
    python2 返回的是string
    python3 返回的是bytes


    image.png
  2. python2和3 在bytes的print的format不一致
    python2
    a = b'4000\r\n'
    print('Reply:{}'.format(a))
    自动将bytes解码成string了
    但是python3还要再进行一步解码才能达到一样的效果
    print('Reply:{}'.format(str(a, encoding="ISO-8859-1")))

image.png

How do I .decode('string-escape') in Python 3? [duplicate]

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 194,319评论 5 459
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 81,801评论 2 371
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 141,567评论 0 319
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 52,156评论 1 263
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 61,019评论 4 355
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 46,090评论 1 272
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 36,500评论 3 381
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 35,192评论 0 253
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 39,474评论 1 290
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 34,566评论 2 309
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 36,338评论 1 326
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,212评论 3 312
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 37,572评论 3 298
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 28,890评论 0 17
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,169评论 1 250
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 41,478评论 2 341
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 40,661评论 2 335

推荐阅读更多精彩内容