layout: post title: Pyinstaller遞歸錯誤解決方案 date: 2018-06-18 categories: blog tags: [遞歸錯誤,py,python,MaximumRecursion] description: Pyinstaller 打包成獨立軟件的時候遞歸深度報錯RecursionError maximum recursion depth exceeded 解決方案。python
報錯:Pyinstaller maximum recursion depth exceeded Error Resolution小程序
我用 python 編寫了一個小程序,用於解決以「解一元三次方程」爲核心的問題。具體是在已經知道了一元三次方程的各個階的係數值以及 y 值,求 x 值。寫成的代碼能夠在 python 環境中運行,可是沒法在沒有安裝 Python 解釋器的電腦上運行。所以,我須要將py 文件打包成可執行文件(exe),以供沒有安裝 python 解釋器的同事們來用。可是在生成 exe 的過程當中遇到了若干問題,經過檢索和綜合別人的解決方案,最終解決了這些問題。數組
我有兩臺電腦三套系統, MACpro-64位(另裝了 win7的32位虛擬系統)和 ThinkPad 的Win7-64位,分別裝上了 Anaconda 集成開發環境。工具
使用 Pyinstaller打包成獨立軟件的時候「遞歸深度報錯」,報錯「RecursionError: maximum recursion depth exceeded」post
首先,看到遞歸深度錯誤,我首先想到的是代碼中可能存在 Python 系統能解決可是生成 exe 沒法解決的問題,因此纔出現遞歸錯誤。我上網搜索關鍵詞「Python + maximum recursion depth exceeded」,stackoverflow.com上點贊較多的人所說的解決方案是增長遞歸深度設定(python 默認的遞歸深度是1000?),具體的方法是:網站
import sys
sys.setrecursionlimit(10000) # 10000 is an example, try with different values複製代碼
然而,沒什麼用。我甚至將這個遞歸深度增長到10億次,到達了程序的設計邊界,依然不行。spa
難道是代碼自己錯誤?可是 python 本身卻認呢?Why 啊? 抱着謹慎的態度,我以此檢查數據類型,設計
for i in range (0,8): d = solveset(TA0 + TA1x + TA2(x2) +TA3*(x3) - 1/(273.15+T[i]), x) # 核心計算公式。使用T[i]從T這個數組中按照索引取出數據。 d1,d2,d3 = d # 將數組d進行切片。 d1=float(d1)# 新增長20180612,將sympy 內嵌的float類型裝換位通用的 float 類型。 N = 2.718281825**d1 #轉換出N值 print (round(N))# "N值爲:"code
降級 Python3.6.4→Python3.5.5)+Pyinstaller3.3.1。 使用 Mac-Win7-32內裝的Anaconda集成系統的Environments中,另創建一個環境PY35, 其中出了安裝了 Python3.5.5以外,還單獨安裝了 sympy(安裝具體包的方法請到 Anaconda官方網站上查看,使用官方命令進行安裝)。經過降級的 Python,在Terminal中打開程序所在的文件夾,使用Pyinstaller yourscriptname.py的方法,進行打包程序,在 dish 文件夾下面有一個單獨的文件夾叫yourscriptname,裏面有一大堆文件,其中有一個文件是.exe文件,其餘文件都是支持性的文件,雙擊 exe 文件就能夠在window7下運行了。我這樣打包出來的程序沒有問題,可是網上另外推薦裏一種打包成一個文件而不是一個文件包的方法,仍是使用'Pyinstaller -F yourscriptname.py'的方法制做成了一個 單獨exe 文件,若是但願讓圖標 ICO 好看的話,就在這個 py 文件下,存放一個myico.ico文件,在打包的時候輸入'Pyinstaller -F -i myico.ico yourscriptname.py',而後就生成了獨立的帶有漂亮的圖標的一個獨立程序了。可是我發現這樣的程序在安裝了 python的程序裏運行沒有問題,可是在沒有安裝 python 的電腦裏會報錯「沒法定位程序輸入點 GetFinalPathNameByHandleW 於動態連接庫 KERNEL32.dll上」。blog
接上面話題,生成了獨立的 exe 程序以後,在其餘電腦上運行,報錯「沒法定位程序輸入點 GetFinalPathNameByHandleW 於動態連接庫 KERNEL32.dll上」。也就是說,我生成的這個獨立的 exe 文件可能並無打包徹底,裏面缺乏 dll 控件。若是僅僅是爲了用的話,dish 文件夾下由pyinstaller系統生成了‘單獨的文件夾yourscriptname中 exe’能夠直接用了。若是非要生成一個獨立的 exe 文件的話,我想這個是庫中的文件包打包不全形成了,記得網上有一個說法是繼續加一個參數-p(path)……
{ }因爲時間有限,暫時不深究,此處刨坑,等來日再解決。
20180614 下午念起 20180615 上午用了一小時左右敲了出來。
本文由博客羣發一文多發等運營工具平臺 OpenWrite 發佈