解決Pyinstaller打包為可執行文件編碼錯誤的問題

錯誤信息

UnicodeDecodeError: ‘utf-8′ codec can’t decode byte 0xce in position ***

解決方案

命令行中先輸入

chcp 65001

再輸入打包命令。

pyinstaller -F xxx.py

補充:pyinstaller打包python程序時遇到遞歸超界和字符編碼錯誤的問題與解決方法

打包命令:pyinstaller -F xx.py

-F一定要加上,其含義是生成獨立的可執行文件

問題一:超過遞歸深度

由於python文件中可能存在遞歸運算,實際執行時沒什麼問題,但打包時報錯,錯誤信息如下

RecursionError: maximum recursion depth exceeded

大體意思就是說遞歸深度超過程序允許的界限瞭,最大是1000.

在執行完成後雖然報錯,但是與xx.py文件同級目錄下會生成一個xx.spec文件,打開這個文件,xx.py第一行是字符編碼,在代碼的第二三行加入下面兩句代碼。

然後執行下面代碼(千萬不要再去執行原來的打包命令)

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)輸入打包命令之前先輸入下面的命令,執行回車

chcp 65001

然後再輸入打包命令。如果開始因為遞歸出錯,修改spec文件後又出現編碼錯誤,此時打包命令仍然執行

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窗口內,然後回車執行。

以上為個人經驗,希望能給大傢一個參考,也希望大傢多多支持WalkonNet。如有錯誤或未考慮完全的地方,望不吝賜教。

推薦閱讀: