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に関連しており、補間ではありませんでした。
これは私のために働いた
Pyinstallerを実行して停止し、specファイルを生成します。
pyinstaller filename.py
拡張子が.spec
のファイルを生成する必要があります
スペックファイルの先頭に次の行を追加します。
import sys
sys.setrecursionlimit(5000)
次を使用してspecファイルを実行します。
pyinstaller filename.spec
ムスタファは正しい方向に私を案内しました、あなたは再帰制限を増やす必要があります。ただし、コードは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 を参照)
再帰の深さの制限を増やしてみます。ファイルの先頭に挿入します:
import sys
sys.setrecursionlimit(5000)
次の方法で再帰制限を変更できます。
import sys
sys.setrecursionlimit(1000)