通過py2exe打包python程序的過程中,解決的一系列問題


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的導入。
  • 引申:搜索發現這種問題還是比較普遍的,主要的解決方式有兩種,以后再出現這個錯誤時可以嘗試這些解決方法(這次的問題這兩個方法都無法解決):
    1. 認為原因在於py2exe無法識別運行時的動態導入,解決辦法是在文件頭就import相關模塊(也有人建議,在這個辦法的基礎上,import部分結束之后,顯式地調用一次這個模塊,比如xxxx.__version__)
      • 【原地址:https://bytes.com/topic/python/answers/168576-help-py2exe-error-no-module-named-decimal】
    2. 認為原因在於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 )
setup.py

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM