creating standalone exe using pyinstaller with mayavi import

前端 未结 1 1096
别跟我提以往
别跟我提以往 2020-12-17 07:24

I have a program that helps visualize some data in 3D by plotting a surface and a cloud of points to see how they relate to the surface. For the visualization I am using may

相关标签:
1条回答
  • 2020-12-17 08:01

    I dealt with the same problem and finally switched to cx_freeze, which now works fine on linux and windows. The problems you are dealing with arise from statements like in the SE answer, you found, i.e. dynamic import statements, where what is imported is only determined at runtime:

        be = 'pyface.ui.%s.' % tk
        __import__(be + 'init')
    

    I couldn't fix that in pyinstaller, while in cx_freeze it works, when you explicitely add the required packages in the build file. Here is the package list I used:

    "packages": ["pyface.ui.qt4", "tvtk.vtk_module", "tvtk.pyface.ui.wx", "matplotlib.backends.backend_qt4",'pkg_resources._vendor','pkg_resources.extern','pygments.lexers',
                                  'tvtk.pyface.ui.qt4','pyface.qt','pyface.qt.QtGui','pyface.qt.QtCore','numpy','matplotlib','mayavi']
    

    Here is a full build script that works with python3.6, cx_freeze 5.0.2, mayavi 4.5.0+vtk71, traits 4.6.0, pyface 5.1.0 and traitsui 5.1.0.

    import os
    from cx_Freeze import setup, Executable
    import cx_Freeze.hooks
    def hack(finder, module):
        return
    cx_Freeze.hooks.load_matplotlib = hack
    import scipy
    import matplotlib
    
    scipy_path = os.path.dirname(scipy.__file__) #use this if you are also using scipy in your application
    
    build_exe_options = {"packages": ["pyface.ui.qt4", "tvtk.vtk_module", "tvtk.pyface.ui.wx", "matplotlib.backends.backend_qt4",'pygments.lexers',
                                      'tvtk.pyface.ui.qt4','pyface.qt','pyface.qt.QtGui','pyface.qt.QtCore','numpy','matplotlib','mayavi'],
                         "include_files": [(str(scipy_path), "scipy"), #for scipy
                        (matplotlib.get_data_path(), "mpl-data"),],
                         "includes":['PyQt4.QtCore','PyQt4.QtGui','mayavi','PyQt4'],
                         'excludes':'Tkinter',
                        "namespace_packages": ['mayavi']
                        }
    
    
    executables = [
        Executable('main.py', targetName="main.exe",base = 'Win32GUI',)
    ]
    
    setup(name='main',
          version='1.0',
          description='',
          options = {"build_exe": build_exe_options},
          executables=executables,
          )
    

    I import pyface in the following way:

    os.environ['ETS_TOOLKIT'] = 'qt4'
    
    import imp
    try:
        imp.find_module('PySide') # test if PySide if available
    except ImportError:
        os.environ['QT_API'] = 'pyqt' # signal to pyface that PyQt4 should be used
    
    from pyface.qt import QtGui, QtCore
    

    before importing mayavi

    0 讨论(0)
提交回复
热议问题