gpt4 book ai didi

python - 使用 pyinstaller 和 mayavi 导入创建独立的 exe

转载 作者:行者123 更新时间:2023-12-01 09:26:37 27 4
gpt4 key购买 nike

我有一个程序,可以通过绘制表面和点云来查看它们与表面的关系,从而帮助以 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。我已经阅读了很多关于不同钩子(Hook)文件和隐藏导入的 github 文档,每次我修复一个错误时都会弹出另一个错误。这一切都是从 scipy 开始的,但我相信我已经解决了这些问题。所以我有几个问题可以帮助我解决问题:

1)是否有人使用 pyinstaller 和 Mayavi 导入(特别是 from mayavi import mlab)成功创建了独立的 exe?你的 secret 是什么?!?

这看起来很相似,但我还没能弄清楚... SO_link

我已使用以下链接( scipyh5pypandastraits/qt4ETS_TOOLKIT )来添加隐藏导入或修复其他问题,但在设置 ETS_TOOLKIT=qt4 后我现在陷入困境。在设置它之前,我会收到 pyface/traits 错误 RuntimeError: No Traitsui.toolkits plugin found for toolkit null,但现在它对 qt4 说同样的事情,而不是 null。我安装了 qt4,所以我不明白...它位于 pyface/base_toolkit.py 中的 import_toolkit 函数中。

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

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

编辑

虽然我仍然很困惑,但我已经能够更改错误发生的位置。在回溯之后,我在traitsui/editors/code_editor.py(第49行)中注释掉了设置标记颜色的行,此时异常在下次调用 Color 方法时开始......但我仍然得到相同的结果运行时错误。因此,除了我仍在寻找需要包含哪些隐藏导入才能使此功能正常工作之外,这并没有告诉我太多信息。

另请注意,我在 PyInstaller 和 cx_Freeze 中都遇到了完全相同的错误,以防有帮助...

编辑2

我现在已经尝试使用 anaconda for python 2.7,同样的问题......我开始相信宇宙不希望这种情况发生。我应该在其他地方提出这个问题吗?我已经在 Traitsui GitHub 上发布了,但这并没有多大帮助。这似乎比 pyinstaller/cx_freeze 更大,因为它发生在两者中......

最佳答案

我处理了同样的问题,最后切换到 cx_freeze,它现在在 Linux 和 Windows 上运行良好。您正在处理的问题是由类似 SE answer 中的语句引起的。 ,您发现,即动态导入语句,其中导入的内容仅在运行时确定:

    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 之前

关于python - 使用 pyinstaller 和 mayavi 导入创建独立的 exe,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50337382/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com