Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/319.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 使用pyinstaller和mayavi导入创建独立exe_Python_Pyqt_Data Visualization_Pyinstaller_Mayavi - Fatal编程技术网

Python 使用pyinstaller和mayavi导入创建独立exe

Python 使用pyinstaller和mayavi导入创建独立exe,python,pyqt,data-visualization,pyinstaller,mayavi,Python,Pyqt,Data Visualization,Pyinstaller,Mayavi,我有一个程序,通过绘制曲面和点云来查看它们与曲面的关系,从而帮助在3D中可视化一些数据。对于可视化,我使用mayavi,因为它易于设置,并且在3D中比matplotlib做得更好。当我在python环境中运行该程序时,它工作得非常好,并且可以进行漂亮的可视化。但是,我需要将此分发给一些没有Python的人,他们不希望在每台计算机上安装Python和所有加载项,因此我一直在使用pyinstaller创建独立的.exe文件,在我开发程序后可以运行这些文件 作为参考,这些都是在Windows 10、P

我有一个程序,通过绘制曲面和点云来查看它们与曲面的关系,从而帮助在3D中可视化一些数据。对于可视化,我使用mayavi,因为它易于设置,并且在3D中比matplotlib做得更好。当我在python环境中运行该程序时,它工作得非常好,并且可以进行漂亮的可视化。但是,我需要将此分发给一些没有Python的人,他们不希望在每台计算机上安装Python和所有加载项,因此我一直在使用pyinstaller创建独立的.exe文件,在我开发程序后可以运行这些文件

作为参考,这些都是在Windows 10、Python 3.6、pyqt 4.11.4、pyface 6.0.0、traits 4.6.0、pyinstaller 3.3.1、mayavi 4.5.0+vtk81上完成的。几乎我使用的每个模块都是使用pip安装的

问题是,如果我使用/导入mayavi模块,我似乎无法获得工作的exe。我已经阅读了很多关于不同钩子文件和隐藏导入的github文档,每次我修复一个错误时,都会弹出另一个错误。这一切都是从scipy开始的,但我相信我已经解决了这些问题。因此,我有几个问题可以帮助我解决这个问题:

1) 是否有人使用pyinstaller和mayavi导入成功创建了独立的exe(特别是来自mayavi导入mlab的
)?你的秘密是什么

这看起来很相似,但我还没弄明白

我使用了以下链接(,,,,)来添加隐藏导入或修复其他问题,但在设置我的ETS_TOOLKIT=qt4后,我现在陷入了困境。在设置它之前,我会得到一个pyface/traits错误
RuntimeError:No-traitsui.toolkits plugin for toolkit null
,但现在它对qt4表示相同的内容,而不是null。我已经安装了qt4,所以我不明白。。。它位于pyface/base_toolkit.py中的import_toolkit函数中

2) 在3D可视化/exe创建方面有更好的方法吗?我需要一个3D程序,如果点位于曲面的前面或后面,并且能够以交互方式旋转/缩放/平移,那么该程序可以精确渲染,而且需要直观。Mayavi有非常简单的命令,类似于matplotlib,但其他一些命令在处理UI如何与所有内容交互方面似乎非常复杂

3) 如何解释我得到的所有这些错误代码?他们通常非常隐晦地说,某一行抛出了嵌套在其他10个函数调用中的异常,而且似乎很难找出错误的确切位置,特别是当谷歌上没有出现任何与此相关的弹出窗口时

编辑

虽然我仍然很困惑,但我已经能够更改错误发生的位置。在回溯之后,我注释掉了traitsui/editors/code_editor.py(第49行)中设置标记颜色的一行,在这一点上,异常在下次调用color方法时开始。。。但我仍然得到相同的运行时错误。所以,这并没有告诉我什么,除了我仍然在寻找什么隐藏的进口,我需要包括这件事的工作

还要注意的是,我在PyInstaller和cx_Freeze中得到了完全相同的错误,以防这有助于

编辑2


我现在已经使用anaconda for Python2.7进行了尝试,同样的问题。。。。。我开始相信宇宙不希望这种事情发生。还有其他地方我应该提出这个问题吗??我已经在traitsui GitHub上发布了帖子,但这没有多大帮助。这似乎比pyinstaller/cx_-freeze更大,因为它在这两种情况下都会发生……

我处理了相同的问题,最后切换到cx_-freeze,它现在可以在linux和windows上正常工作。您正在处理的问题来自于中的语句,如,您发现的,即动态导入语句,其中导入的内容仅在运行时确定:

    be = 'pyface.ui.%s.' % tk
    __import__(be + 'init')
我无法在pyinstaller中修复这一问题,而在cx_freeze中,当您在构建文件中明确添加所需的包时,它可以工作。以下是我使用的软件包列表:

"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']
下面是一个完整的构建脚本,可与python3.6、cx_freeze 5.0.2、mayavi 4.5.0+vtk71、traits 4.6.0、pyface 5.1.0和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,
      )
我通过以下方式导入pyface:

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

在导入mayavi之前

不幸的是,我在运行exe时仍然会遇到相同的错误,即使在使用cx_freeze创建它之后也是如此。这让我相信我的mayavi安装有问题。我将卸载并重新安装,看看是否可以对其进行更改,但它似乎正在查找一个不存在的目录(traitsui/toolkits)。我已经卸载并重新安装了除python本身之外我能想到的所有内容,但我仍然有相同的错误。我发现了一些东西,使它看起来好像我没有为traits安装Qt后端,但没有说明如何检查或安装它。。。。因此,这项工作仍在进行中。我将下载Anaconda,看看这是否有帮助,因为我不知所措……@user2731076还有一件事:os.environ['ETS_TOOLKIT']='qt4'意味着您想使用pyside。对于pyqt4,除了其他语句外,请使用os.environ['QT_API']='pyqt',谢谢您的帮助。但是,我使用了您的导入脚本和安装脚本,但错误仍然存在。我读到导入tkinter可能也是一个问题,但删除它并没有改变任何事情。我觉得这必须是pyinstaller/cx_freeze如何找到导入模块的问题,但它们并不能很容易地找到缺少的模块,因为我似乎是直接指向它…@user2731076如果你的代码在github上,我可以查看一下,并试着检查,是你的代码还是你的环境是问题所在。In是一个完整的项目,它使用mayavi,并且有一个适用于windows的cx_冻结构建脚本。如果您愿意,您可以克隆它,并尝试检查冻结它是否在您的机器上工作。