使用带有mayavi imp的pyinstaller创建独立exe

2024-06-25 22:47:34 发布

您现在位置:Python中文网/ 问答频道 /正文

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

作为参考,这些都是在Windows10、Python3.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文档,每次我修复一个错误,就会弹出另一个错误。一切都是从西皮开始的,但我相信我已经解决了。所以我有几个问题可以帮助我解决这个问题:

1)是否有人使用带有mayavi导入的pyinstaller成功地创建了一个独立的exe(特别是from mayavi import mlab)?你的秘密是什么?!?在

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

我使用了以下链接(scipyh5pypandastraits/qt4ETS_TOOLKIT)来添加隐藏的导入或解决其他问题,但是在设置了ETS_TOOLKIT=qt4之后,我现在被卡住了。在设置它之前,我会得到一个pyface/traits错误RuntimeError: No traitsui.toolkits plugin found for toolkit null,但是现在它对qt4说的是相同的东西,而不是null。我安装了qt4,所以我不明白。。。它位于pyface/base的import_toolkit函数中_工具箱.py. 在

2)在3D可视化/exe创建方面,是否有更好的路线?我需要一个三维程序,可以准确地渲染,如果点是在前面或后面的表面,能够旋转/缩放/平移互动,加上它需要直观。Mayavi有与matplotlib相似的非常简单的命令,但是其他命令似乎非常复杂,涉及UI如何与所有事物交互。在

3)如何解释我得到的所有这些错误代码?他们通常很神秘地说,某一行抛出了一个嵌套在10个其他函数调用中的异常,而且似乎很难找出到底哪里出了问题,尤其是当Google上似乎没有任何相关的内容出现时。在

编辑

虽然我仍然很困惑,但我已经能够改变错误发生的地方。在回溯之后,我注释掉了traitsui/editors/code中设置标记颜色的一行_编辑器.py然后在第49个时间点开始调用颜色(第49行)。。。但是我仍然得到同样的运行时错误。所以这并没有告诉我什么,除了我仍在寻找什么隐藏的进口,我需要包括这件事的工作。在

另外请注意,PyInstaller和cx_Freeze的错误完全相同,以防有助于。。。在

编辑2

我现在已经尝试了使用Python2.7版,同样的问题。。。。。我开始相信宇宙不希望这种事发生。还有别的地方我应该提起这个问题吗??我在traitsui GitHub上发过帖子,但那不是很有帮助。这似乎比pyinstaller/cx_冻结要大,因为这两种情况都会发生。。。。在


Tags: 模块文件import程序matplotlib可视化错误exe
1条回答
网友
1楼 · 发布于 2024-06-25 22:47:34

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

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

我无法在pyinstaller中修复这个问题,而在cx\u freeze中,当您明确地在构建文件中添加所需的包时,它仍然有效。这是我使用的包装清单:

^{pr2}$

下面是一个完整的构建脚本,可以与python3.6、cx_freeze 5.0.2、mayavi 4.5.0+vtk71、traits 4.6.0、pyface 5.1.0和traitsui 5.1.0一起使用。在

^{3}$

我通过以下方式导入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

在导入玛雅维之前

相关问题 更多 >