一髓考、看項目引用了哪些開源模塊#####
我們項目我捋了一遍用了三個開源:
- pyzmq
- pyserial
- 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 代碼轉(zhuǎn)為 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/
這樣轉(zhuǎn)換出來的包總是報 ImportError: attempted relative import with no known parent package的問題,這是因為2to3工具將項目import默認轉(zhuǎn)成了相對地址蓝纲,所以我增加了一個參數(shù) -f all -x import 阴孟,讓2to3不要把項目的import轉(zhuǎn)成相對路徑,修改后命令如下
2to3 -f all -x import --output-dir=ph1_Script_Python3.0/ -w -n ph1_Script_Python3.0/
這樣轉(zhuǎn)換出來就沒有impor的問題了税迷,然后對項目不是特別熟永丝,所以將可選的修復器全部都選上了,最后執(zhí)行的命令是這樣的
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/
三翁狐、微調(diào)
前兩個步驟將項目已經(jīng)完全升級成python3.0版本了类溢,接下來就是看build的時候會出什么問題,針對性的解決,就我項目而言闯冷,出現(xiàn)了以下幾個問題
- .encode('string-escape' )
python2
addLog("diag:{}".format(totalRes.encode('string-escape')))
python3
# addLog("diag:{}".format(totalRes.encode('latin1').decode('unicode-escape').encode('latin1')))
- 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的區(qū)別如下
- python2 subprocess 函數(shù)返回值都是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砂心,所以在創(chuàng)建subprocess對象的時候傳入?yún)?shù)universal_newlines=True,讓返回值都為string蛇耀,從而改動比較小
- python3的pyserial函數(shù)傳入的參數(shù)都要求是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")
- Python2和3的除法不一樣
Python2.x 里辩诞,整數(shù)除整數(shù),只能得出整數(shù)
a = 10 纺涤,b = 20译暂,b / a的運行結(jié)果是2.0,所得結(jié)果是浮點型
所以有計算出來的結(jié)果給range(a)用到了撩炊,都要做一下處理range(int(a))
- python2和3的取bin file文件的數(shù)據(jù)返回的類型不一樣
python2取出來的是string外永,但是python3直接返回的是int型,所以python2取出來的值還需要用ord(a)轉(zhuǎn)換成int型拧咳,到了python3再這樣做會報錯
TypeError('ord() expected string of length 1, but int found')伯顶, 所以在python3要把ord函數(shù)去掉
-
python2和3 在bytes截取的返回值上不一致
python2 返回的是string
python3 返回的是bytes
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")))