pyinstallerを使ってGUIアプリを作成した際に「Recursion error : maximum recursion depth exceeded」が起きて解決に手間取ってしまったので、備忘録としてまとめます。
やっていて正しい修正方法ではない気がしたので、正しい修正方法をご存知の方ご教示お願い致します。
pyinstallerとは
知らない方もいると思うので、簡単に説明します。
pyinstallerはpythonのプログラムをexeファイルにしてくれるツールです。
pythonの環境が整っていないパソコンでもpythonが実行できるようになるので、プログラムを配布する際に役にたちます。知ってる方も多いと思いますが、念のため補足しておきますとexeファイルはwindowsでしか動かないです。(そもそもlinuxやmacには標準でpythonが入ってるみたいなので、実行ファイルにする必要が無いと思いますが...)
pyinstallerの詳しい使い方は下記のサイトを参考にしてください。
Recursion error : maximum recursion depth exceededが発生した場合の対処法
原因
上記のサイトを参考にしながら、pyinstallerを使ってみたらRecursion error : maximum recursion depth exceeded
というエラーが発生しました。このエラーを調べてみると再帰しすぎでエラーが生じているみたいでした。
pythonはデフォルトでは1000回までしか再帰を許していないので、それ以上再帰が行われてしまうと、このエラーが出てしまうみたいです。
ちなみに私の書いたコードは再帰関数を利用していないので、なぜこのエラーが生じているのかは不明ですが、多分pyinstallerで再帰関数を使っているのでしょう。
対策
対策法を調べてみると同様の現象が発生している方がいました。
こちらのサイトを見ると、pyinstallerを実行した際に作成される.specファイルの中に再帰関数の上限を上げるコードを追加すればいいということが分かりました。
早速.specファイルの最初の数行を以下のように再帰の上限を1万回にしました。
# -*- mode: python -*-
import sys
sys.setrecursionlimit(10000)
block_cipher = None
pyinstaller <ファイル名>.py --onefile
再帰の数が足りないのかなと思い、再びspecファイルを開いてみると追加したコードが消えていました。
多分実行するたびに新しくspecファイルを作成する仕様みたいです。
解決策が分からなかったのですが、再びspecファイルに再帰の上限を上げるコードを追加して、下記のようにpyファイルではなく、specファイルを指定して実行してみました。
pyinstaller <ファイル名>.spec --onefile
このようにしたらとりあえず、エラーが起きずexeファイルが作成できました。
やり方間違っている気しかしないですが、とりあえずエラーが起きなかったのでよしとします。
(追記)pythonのバージョンによるエラーの違い
この症状が起きたのは知人のパソコンで、python3.7でした。
自分のパソコン(python3.6)で実行したらこのエラーが起きなかったので、もしかしたら何か関係があるかもしれないです...
ちなみに仮想環境を使って違うバージョンで実行する方法があるので、こちらも試してみるといいかもしれません。
0 件のコメント:
コメントを投稿