web-dev-qa-db-ja.com

EXE RuntimeErrorを作成するpyinstaller:Pythonオブジェクトの呼び出し中に最大再帰深度を超えました

WinPython 3.4.4.3をpyinstaller 3.2(pip install pyinstallerで取得)で実行しています。

今、私はEXEに変換したいいくつかの本当に簡単なQt4コードを手に入れましたが、解決できない問題に遭遇しました。

コード:

import sys
import math
from PyQt4 import QtGui, QtCore 
import SMui
import numpy as np
from scipy.interpolate import InterpolatedUnivariateSpline

class SomeCalculation(QtGui.QMainWindow, SMui.Ui_MainWindow):
    def __init__(self):
        super(self.__class__, self).__init__()
        self.setupUi(self)
        self.setWindowTitle('Some Calculation')
        self.calculate.clicked.connect(self.some_math)

    def some_math(self):
        a_diameter=self.a_diameter.value()
        b_diameter=self.b_diameter.value()
        complement=self.complement.value()
        angle=self.angle.value()
        preload=self.preload.value()

### ONLY MATH HAPPENS HERE also defining X and Y ####

        interpolator = InterpolatedUnivariateSpline(X, Y)

### MORE MATH HAPPENS HERE ####

        self.axial.setText(str(axial))
        self.radial.setText(str(radial))

def main():
    app = QtGui.QApplication(sys.argv)
    window=SomeCalculation()
    window.show()
    app.exec_()

if __name__=='__main__':
    main()

pyinstaller file_name.pyと私は得ています:

RuntimeError: maximum recursion depth exceeded while calling a Python object

ここで、問題に影響することがわかったことがいくつかある場合:

1)この行をコメントアウトした場合:from scipy.interpolate import InterpolatedUnivariateSpline

2)Scipy.Interpolate(RBS、しかしまだ)を使用する別の異なるスクリプトからEXEファイルを作成-魅力のように動作します。

3)WinPython 3.5.1.1 + pyinstallerを使用してそれをEXEに変換しようとした場合、同じ方法で取得され、3.2バージョンと同じ-exeファイルは問題なく生成されます。

私は元のケースでエラーの原因を理解したいのですが、残念ながらグーグルで答えを見つけることができません、見つけることができる修正のほとんどはmatplotlibに関連しており、補間ではありませんでした。

18
H_Four

これは私のために働いた

  1. Pyinstallerを実行して停止し、specファイルを生成します。

    pyinstaller filename.py
    

    拡張子が.specのファイルを生成する必要があります

  2. スペックファイルの先頭に次の行を追加します。

    import sys
    sys.setrecursionlimit(5000)
    
  3. 次を使用してspecファイルを実行します。

    pyinstaller filename.spec
    
26
Aviral

ムスタファは正しい方向に私を案内しました、あなたは再帰制限を増やす必要があります。ただし、コードはpythonコードではなく、specファイルの先頭に配置する必要があります。

# -*- mode: python -*-
import sys
sys.setrecursionlimit(5000)

最初にpyi-makespecで仕様ファイルを作成し、それを編集してから、仕様ファイルをpyinstallerコマンドに渡してビルドします。 specファイルを使用 の詳細については、pyinstallerのマニュアルを参照してください。

必ずpyinstaller 3.2.0を使用してください。3.2.1では、ImportError: cannot import name 'is_module_satisfies'が表示されます(GitHubの issue を参照)

26
urxter

再帰の深さの制限を増やしてみます。ファイルの先頭に挿入します:

import sys
sys.setrecursionlimit(5000)
5

次の方法で再帰制限を変更できます。

import sys
sys.setrecursionlimit(1000)
0
user11855545