解決Pyinstaller打包為可執(zhí)行文件編碼錯誤的問題
錯誤信息
UnicodeDecodeError: ‘utf-8' codec can't decode byte 0xce in position ***
解決方案
命令行中先輸入
chcp 65001
再輸入打包命令。
pyinstaller -F xxx.py
補充:pyinstaller打包python程序時遇到遞歸超界和字符編碼錯誤的問題與解決方法
打包命令:pyinstaller -F xx.py
-F一定要加上,其含義是生成獨立的可執(zhí)行文件
問題一:超過遞歸深度
由于python文件中可能存在遞歸運算,實際執(zhí)行時沒什么問題,但打包時報錯,錯誤信息如下
RecursionError: maximum recursion depth exceeded
大體意思就是說遞歸深度超過程序允許的界限了,最大是1000.
在執(zhí)行完成后雖然報錯,但是與xx.py文件同級目錄下會生成一個xx.spec文件,打開這個文件,xx.py第一行是字符編碼,在代碼的第二三行加入下面兩句代碼。
然后執(zhí)行下面代碼(千萬不要再去執(zhí)行原來的打包命令)
pyinstaller xx.spec
import sys sys.setrecursionlimit(6000)
問題二:打包時報告編碼錯誤
錯誤信息如下:
UnicodeDecodeError: ‘utf-8' codec can't decode byte 0xce in position 121: invalid start byte
可能有點蒙圈,明明代碼中進行了代碼聲明為什么還報錯,不要慌,在dos窗口(windows+R,輸入cmd)輸入打包命令之前先輸入下面的命令,執(zhí)行回車
chcp 65001
然后再輸入打包命令。如果開始因為遞歸出錯,修改spec文件后又出現(xiàn)編碼錯誤,此時打包命令仍然執(zhí)行
pyinstaller xx.spec
問題三:原代碼中存在的文件讀取路徑,打包后報錯,找不到路徑
原來代碼如下:
使用abspath獲取路徑行不通,在程序運行時不會出錯,打包時要替換為下面獲取路徑的代碼
import os path1 = os.path.dirname(os.path.abspath(__file__)) path2 = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
替換為
import os import sys path1 = os.path.dirname(os.path.realpath(sys.executable)) path2 = os.path.dirname(os.path.dirname(os.path.realpath(sys.executable)))
問題四:打包時沒問題,生成exe閃退,也看不到報錯信息。
解決方法:打開一個dos窗口,將exe文件拖拽到dos窗口內(nèi),然后回車執(zhí)行。
以上為個人經(jīng)驗,希望能給大家一個參考,也希望大家多多支持腳本之家。如有錯誤或未考慮完全的地方,望不吝賜教。
相關文章
Python 使用 PyMysql、DBUtils 創(chuàng)建連接池提升性能
DBUtils 是一套 Python 數(shù)據(jù)庫連接池包,并允許對非線程安全的數(shù)據(jù)庫接口進行線程安全包裝。這篇文章主要介紹了Python 使用 PyMysql、DBUtils 創(chuàng)建連接池,提升性能,需要的朋友可以參考下2019-08-08python中__call__內(nèi)置函數(shù)用法實例
這篇文章主要介紹了python中__call__內(nèi)置函數(shù)用法,實例分析了python中__call__內(nèi)置函數(shù)的原理與使用技巧,需要的朋友可以參考下2015-06-06