pyinstallerを使った際に「Recursion error : maximum recursion depth exceeded」エラーが発生した場合の対処法

2019/02/13

python プログラミング 環境構築


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

実行したところ、やはり「Recursion error : maximum recursion depth exceeded」 が発生してしまいました。

再帰の数が足りないのかなと思い、再びspecファイルを開いてみると追加したコードが消えていました。

多分実行するたびに新しくspecファイルを作成する仕様みたいです。

解決策が分からなかったのですが、再びspecファイルに再帰の上限を上げるコードを追加して、下記のようにpyファイルではなく、specファイルを指定して実行してみました。
pyinstaller <ファイル名>.spec --onefile

このようにしたらとりあえず、エラーが起きずexeファイルが作成できました。
やり方間違っている気しかしないですが、とりあえずエラーが起きなかったのでよしとします。

(追記)pythonのバージョンによるエラーの違い

この症状が起きたのは知人のパソコンで、python3.7でした。
自分のパソコン(python3.6)で実行したらこのエラーが起きなかったので、もしかしたら何か関係があるかもしれないです...

ちなみに仮想環境を使って違うバージョンで実行する方法があるので、こちらも試してみるといいかもしれません。

自己紹介

はじめまして 社会人になってからバイクやプログラミングなどを始めました。 プログラミングや整備の記事を書いていますが、独学なので間違った情報が多いかもしれません。 間違っている情報や改善点がありましたらコメントしていただけると幸いです。

X(旧Twitter)

フォローお願いします!

QooQ