python - cx_Freeze प्लॉट बटन दबाने के बाद GUI-app(tkinter) क्रैश में बदल गया




python-3.x matplotlib (3)

मैं अब इसके लिए कई दिनों से काम कर रहा हूं और मुझे कुछ मदद मिलने की उम्मीद है। मैंने आयातित मॉड्यूल tkinter, numpy, scipy, matplotlib के साथ एक GUI- एप्लिकेशन विकसित किया, जो कि अजगर में ही ठीक चलता है। एक exe में परिवर्तित होने के बाद सब कुछ उम्मीद के मुताबिक काम करता है, लेकिन matplotlib खंड नहीं। जब मैं अपना परिभाषित प्लॉट बटन दबाता हूं, तो एक्सई बस बंद हो जाता है और कोई भूखंड नहीं दिखाता है। इसलिए मैंने एक न्यूनतम उदाहरण बनाने के लिए सोचा, जहां मैं बस एक पाप-कार्य की साजिश रचता हूं और मैं एक ही मुद्दे का सामना कर रहा हूं: अजगर में एकदम सही काम करता है, जब इसे exe में परिवर्तित करते हुए यह साजिश बटन दबाते समय क्रैश हो जाता है। यहाँ न्यूनतम उदाहरण है:

import tkinter as tk
import matplotlib.pyplot as plt
import numpy as np

class MainWindow(tk.Frame):
    def __init__(self):
        tk.Frame.__init__(self,bg='#9C9C9C',relief="flat", bd=10)
        self.place(width=x,height=y)
        self.create_widgets()

    def function(self):
        datax = np.arange(-50,50,0.1)
        datay = np.sin(datax)
        plt.plot(datax,datay)
        plt.show()

    def create_widgets(self):
        plot = tk.Button(self, text='PLOT', command=self.function)
        plot.pack()


x,y=120,300
root=tk.Tk()
root.geometry(str(x)+"x"+str(y))
app = MainWindow()
app.mainloop()

और यहाँ cx_Freeze के साथ परिवर्तित करने के लिए मेरा संबंधित setup.py :

import cx_Freeze
import matplotlib
import sys
import numpy
import tkinter

base = None

if sys.platform == "win32":
    base = "Win32GUI"

executables = [cx_Freeze.Executable("test.py", base=base)]


build_exe_options = {"includes":   ["matplotlib.backends.backend_tkagg","matplotlib.pyplot",
                             "tkinter.filedialog","numpy"],
                     "include_files":[(matplotlib.get_data_path(), "mpl-data")],
                     "excludes":[],
                    }

cx_Freeze.setup(
    name = "test it",
    options = {"build_exe": build_exe_options},
    version = "1.0",
    description = "I test it",
    executables = executables)

कोई भी विचार जो इस मुद्दे को हल कर सकता है वह बहुत सराहना करता है। मैं 64-बिट Windows10 मशीन पर काम कर रहा हूं और मैं पायथन वितरण के साथ पायथन 3.4.3 का उपयोग कर रहा हूं।


जाँच करें कि क्या आपके पास numpy + mkl पैकेज स्थापित है। Numpy को अनइंस्टॉल करना और numpy + mkl पैकेज स्थापित करना mkl_intel_thread.dll से संबंधित त्रुटि प्राप्त करने के मेरे मुद्दे को हल करता है


मुझे इस समस्या के लिए संभावित परीक्षण (या कम से कम एक स्पष्टीकरण) मिला, जबकि उसी Test.py के साथ PyInstaller का परीक्षण किया गया। मुझे एक dll फ़ाइल गुम होने के बारे में त्रुटि संदेश मिला, वह फ़ाइल mkl_intel_thread.dll थी

मैंने उस फाइल को खोजा और वह सुन्न फोल्डर के अंदर मिली । मैंने mkl _ * से मेल करने वाली फ़ाइलों की प्रतिलिपि बनाई । dll और libiomp5md.dll को भी उसी निर्देशिका में भेजा जाएगा जहाँ python setup.py build द्वारा निर्मित test.exe था। इसके बाद प्लॉट बटन को दबाते समय न्यूनतम test.exe ने matplotlib विंडो दिखाई।

फ़ाइलें फ़ोल्डर lib \ साइट-संकुल \ numpy \ core में स्थित थीं।


मैंने @JJ हकला के उत्तर का पालन किया है, लेकिन मैंने पाया कि यह आवश्यक नहीं है कि सभी mkl _ * कॉपी करें। dll और libiomp5md.dll फाइलें। मेरे लिए इसने libiomp5md.dll mkl_core.dll mkl_def.dll mkl_intel_thread.dll के साथ काम किया। यह ~ 500MB में अंतिम बंडल आकार को कम करने में मदद करता है।

इसके अलावा, आप उन फ़ाइलों को शामिल कर सकते हैं जिन्हें आप शामिल करना चाहते हैं include_files विकल्प में। यदि sys.platform win32 है तो आप केवल उन्हें शामिल करना चाहते हैं।

मैं एनाकोंडा के साथ-साथ @ माट विलियम्स का उपयोग कर रहा हूं, इसलिए, ओपी के कोड को थोड़ा बदल रहा हूं:

import cx_Freeze
import matplotlib
import sys
import numpy
import tkinter
import os

PYTHON_INSTALL_DIR = os.path.dirname(os.path.dirname(os.__file__))

build_exe_options = {"includes":   ["matplotlib.backends.backend_tkagg","matplotlib.pyplot",
                             "tkinter.filedialog","numpy"],
                     "include_files":[(matplotlib.get_data_path(), "mpl-data")],
                     "excludes":[],
                    }

base = None

if sys.platform == "win32":
    base = "Win32GUI"
    DLLS_FOLDER = os.path.join(PYTHON_INSTALL_DIR, 'Library', 'bin')

    dependencies = ['libiomp5md.dll', 'mkl_core.dll', 'mkl_def.dll', 'mkl_intel_thread.dll']

    for dependency in dependencies:
        build_exe_options['include_files'].append(os.path.join(DLLS_FOLDER, dependency))

executables = [cx_Freeze.Executable("test.py", base=base)]

cx_Freeze.setup(
    name = "test it",
    options = {"build_exe": build_exe_options},
    version = "1.0",
    description = "I test it",
    executables = executables)