cx_Freeze converted GUI-app (tkinter) crashes after pressing plot button

前端 未结 4 739
一向
一向 2020-11-28 14:03

I\'ve been dealing with this for days now and hope to find some help. I developed a GUI-application with imported modules tkinter, numpy, scipy, matplotlib, which runs fine

相关标签:
4条回答
  • 2020-11-28 14:23

    I really wanted to post this as a comment, but I don't have the reputation. This is mostly a followup to J.J. Hakala's answer about how to find the cause.

    If one changes the base to "Console", i.e. using

    base = "Console"

    rather than

    base = "Win32GUI"

    a console will also pop up when the program starts and this error is printed

    Intel MKL FATAL ERROR: Cannot load mkl_intel_thread.dll.

    Which can help finding the cause of the problem pretty faster.

    I thought this would be worth mentioning, since this trick can also be helpful to diagnose other problems. In the final release, one can revert back to Win32GUI to avoid the extra console. I should give the credits to this other stackoverflow post

    0 讨论(0)
  • 2020-11-28 14:25

    I found a potential solution (or at least an explanation) for this problem while testing PyInstaller with the same test.py. I received error message about a dll file being missing, that file being mkl_intel_thread.dll.

    I searched for that file and it was found inside numpy folder. I copied files matching mkl_*.dll and also libiomp5md.dll to the same directory where the test.exe created by python setup.py build was. After this the minimal test.exe showed the matplotlib window when pressing the plot button.

    The files were located in folder lib\site-packages\numpy\core.

    0 讨论(0)
  • 2020-11-28 14:28

    Check if you have numpy+mkl package installed. Uninstalling numpy and installing numpy+mkl package solved my issue of getting error related to mkl_intel_thread.dll

    0 讨论(0)
  • 2020-11-28 14:39

    I have followed @J.J. Hakala's answer, but I found that it's not necessary copy all mkl_*.dll and libiomp5md.dll files. For me it worked with libiomp5md.dll mkl_core.dll mkl_def.dll mkl_intel_thread.dll. This helps to reduce the final bundle size in ~500MB.

    Also, you can include the files you want to copy in the include_files option. You also could only want to include them if sys.platform is win32.

    I'm using Anaconda as well as @Matt Williams, so, changing a bit the OP's code:

    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)
    
    0 讨论(0)
提交回复
热议问题