py2exe的使用方法參考《py2exe使用方法》。
注:程序可以在解釋器中正常運行,一切問題都出在打包過程中。
問題1:
- 現象:RuntimeError: maximum recursion depth exceeded in comparison.
- 原因:Python遞歸報錯。Python中默認的最大遞歸深度是989,當嘗試遞歸第990時便出現遞歸深度超限的錯誤。
- 解決:在setup.exe中手動設置遞歸調用深度為10000000,代碼如下:
-
-
import sys sys.setrecursionlimit(10000000)
-
-
問題2:
- 現象: import _tkinter ImportError: DLL load failed: %1 不是有效的 Win32 應用程序。
- 原因:python解釋器版本與tkinter版本不一致。可能是安裝了多個python解釋器,或者tkinter不是用pip安裝、導致其版本與python解釋器版本不一致。(本次遇到的情況屬於后者)
- 解決:安裝對應版本的python解釋器(2.7.10)
問題3:
- 現象: [Errno 2] No such file or directory: 'libopenblas.IPBC74C7KURV7CB2PKT5Z5FNR3SIBV4J.gfortran-win_amd64.dll'
- 解決:在setup.py的setup-options中,dll_excludes下添加 'libopenblas.JKAMQ5EVHIVCPXP2XZJB2RQPIN47S32M.gfortran-win32.dll' ,排除這個dll文件
至此,已經可以打包完成,但打包后的exe無法運行。
問題4:
- 現象:運行exe時彈出命令行窗口報錯,之后在log中發現報錯原因: ImportError: No module named mpl_toolkits.
- 嘗試:中間嘗試過在setup.py的setup-options中添加"includes"或"packages"指令,打包時就指定必須導入這個模塊。這樣的結果就是,打包過程中就出現上述報錯,無法完成打包。下文“引申”中的兩種方法也嘗試過了,都無法解決問題。
- 解決:仔細查看程序,發現其實不需要用到mpl_toolkits包,於是注釋掉mpl_toolkits的導入。
- 引申:搜索發現這種問題還是比較普遍的,主要的解決方式有兩種,以后再出現這個錯誤時可以嘗試這些解決方法(這次的問題這兩個方法都無法解決):
- 認為原因在於py2exe無法識別運行時的動態導入,解決辦法是在文件頭就import相關模塊(也有人建議,在這個辦法的基礎上,import部分結束之后,顯式地調用一次這個模塊,比如xxxx.__version__)
- 【原地址:https://bytes.com/topic/python/answers/168576-help-py2exe-error-no-module-named-decimal】
- 認為原因在於py2exe無法識別egg文件。他的解決辦法是: 我發現python的Lib/site-packages下安裝的是egg文件,beautifulsoup4-4.4.0-py2.7.egg。用winrar將其解壓,把bs4目錄直接放到Lib/site-packages下,再打包並執行,一切正常。問題解決。
- 【原地址:https://www.cnblogs.com/simplestupid/p/4716658.html】
問題5:
- 現象:RuntimeError: Could not find the matplotlib data files.
- 原因:matplotlib運行時缺失一些必要的文件。
- 解決:在setup.py的setup-options-includes中添加
-
"matplotlib.backends", "matplotlib.figure", "matplotlib.backends.backend_tkagg"
在setup.py的setup中添加
-
data_files = [(r'mpl-data', glob.glob(r'C:\Python27\Lib\site-packages\matplotlib\mpl-data\*.*')), (r'mpl-data', [r'C:\Python27\Lib\site-packages\matplotlib\mpl-data\matplotlibrc']), (r'mpl-data\images', glob.glob(r'C:\Python27\Lib\site-packages\matplotlib\mpl-data\images\*.*')), (r'mpl-data\fonts', glob.glob(r'C:\Python27\Lib\site-packages\matplotlib\mpl-data\fonts\*.*'))]
問題6:
- 現象:OMP: warning #178:Function GetModuleHandleEx failed: OMP: System error #126: 找不到模塊
- 解決:在setup.py的setup-options中,取消 "bundle_files":1,不再將所有文件打包到一個exe中。
- 引申:這個問題出現於用py2exe打包、含numpy包,且把所有文件打包到一個exe中的時候。值得參考的解決方法是: 在setup.py的setup-options中excludes("scipy"和)"numpy",並將它們的整個包文件夾復制到dist目錄中,並將該目錄添加到python main.py頂部的系統路徑中 。
-
【原地址(關於此報錯的一些討論):https://stackoverflow.com/questions/22412984/omp-warning-when-numpy-1-8-0-is-packaged-with-py2exe】
-
附:最終的setup.py

1 # -*- coding: utf-8 -*- 2 from distutils.core import setup 3 import py2exe 4 import glob 5 import sys 6 sys.setrecursionlimit(10000000) 7 8 # 在命令行下運行 python setup.py py2exe 9 10 setup( 11 options={ 12 "py2exe":{ 13 "includes":["sip", 14 "matplotlib.backends", 15 "matplotlib.figure", 16 "matplotlib.backends.backend_tkagg" 17 ], 18 "dll_excludes":["MSVCP90.dll", 'libopenblas.JKAMQ5EVHIVCPXP2XZJB2RQPIN47S32M.gfortran-win32.dll'], 19 "compressed":1, 20 "optimize":2, 21 # "bundle_files":1 22 } 23 }, 24 version = "0.1.0", 25 description = "PID Debug", 26 name = "PID", 27 zipfile=None, 28 data_files = [(r'mpl-data', glob.glob(r'C:\Python27\Lib\site-packages\matplotlib\mpl-data\*.*')), 29 (r'mpl-data', [r'C:\Python27\Lib\site-packages\matplotlib\mpl-data\matplotlibrc']), 30 (r'mpl-data\images', glob.glob(r'C:\Python27\Lib\site-packages\matplotlib\mpl-data\images\*.*')), 31 (r'mpl-data\fonts', glob.glob(r'C:\Python27\Lib\site-packages\matplotlib\mpl-data\fonts\*.*'))], 32 windows=[{"script":'main.py', 33 "icon_resources":[(1, "3.ico")] 34 } 35 ] 36 )