создание автономного exe-файла с использованием pyinstaller с помощью импорта mayavi - PullRequest
0 голосов
/ 14 мая 2018

У меня есть программа, которая помогает визуализировать некоторые данные в 3D путем построения поверхности и облака точек, чтобы увидеть, как они связаны с поверхностью. Для визуализации я использую Mayavi, поскольку его было легко настроить, и он работает лучше, чем Matplotlib в 3D. Программа прекрасно работает, когда я запускаю ее в своей среде Python, и делает красивые визуализации. Однако мне нужно распространить это среди нескольких людей, у которых нет Python и которые предпочли бы не устанавливать python и все надстройки на каждом компьютере, поэтому я использую pyinstaller для создания автономных файлов .exe, которые они можно запустить после того, как я разработаю программу.

Для справки, все это делается в Windows 10, Python 3.6, pyqt 4.11.4, pyface 6.0.0, чертах 4.6.0, pyinstaller 3.3.1, mayavi 4.5.0 + vtk81. Почти каждый модуль, который я использую, был установлен с помощью pip.

Проблема в том, что я не могу получить работающий exe-файл, если использую / импортирую модуль mayavi. Я читал так много документации github по различным файлам хуков и скрытого импорта, и каждый раз, когда я исправляю одну ошибку, появляется другая. Все началось со Сципи, но я думаю, что у меня все получилось. Поэтому у меня есть несколько вопросов, которые могут помочь мне решить проблему:

1) Кто-нибудь успешно создал автономный exe-файл, используя pyinstaller с импортом из Mayavi (в частности, from mayavi import mlab)? В чем твой секрет?!?

Это похоже на то, но я пока не смог понять ... SO_link

Я использовал следующие ссылки ( scipy , h5py , pandas , traits / qt4 , ETS_TOOLKIT ) чтобы добавить скрытый импорт или исправить другие проблемы, но я застрял сейчас после установки моего ETS_TOOLKIT = qt4. Перед установкой я получил бы ошибку pyface / traits RuntimeError: No traitsui.toolkits plugin found for toolkit null, но теперь он говорит то же самое для qt4 вместо нуля. У меня установлен qt4, так что я не понимаю, что ... Это в функции import_toolkit в pyface / base_toolkit.py.

2) Есть ли лучший путь с точки зрения 3D визуализации / создания exe-файлов? Мне нужна 3D-программа, которая может точно отображать, если точки находятся перед или позади поверхности, и иметь возможность интерактивного вращения / масштабирования / панорамирования, плюс она должна быть интуитивно понятной. У Mayavi были очень простые команды, похожие на matplotlib, но другие, похоже, очень сложно работают над тем, как пользовательский интерфейс взаимодействует со всем.

3) Как мне интерпретировать все эти коды ошибок, которые я получаю? Они обычно довольно загадочны, говоря, что определенная строка вызвала исключение, вложенное в 10 других вызовов функций, и кажется, что очень трудно отследить, где именно что-то пошло не так, особенно когда в Google не появляется ничего похожего.

EDIT

Хотя я все еще в замешательстве, мне удалось изменить место возникновения ошибки. После обратной трассировки я закомментировал строку, устанавливающую цвет маркера, в traitsui / editors / code_editor.py (строка 49), после чего исключение затем запустилось при следующем вызове метода Color ... но я все равно получаю то же самое Ошибка выполнения. Так что это не говорит о многом, кроме того, что я все еще ищу, какой скрытый импорт мне нужно включить, чтобы эта штука работала.

Также обратите внимание, что я получаю одинаковую ошибку как с PyInstaller, так и с cx_Freeze, в случае, если это помогает ...

Редактировать 2

Я сейчас попробовал это, используя anaconda для python 2.7, ОДНАЖДУ ТОЧНАЯ ПРОБЛЕМА ..... Я начинаю верить, что вселенная не хочет, чтобы это произошло. Есть ли где-то еще, я должен поднять этот вопрос? Я разместил на traitsui GitHub, но это не очень помогло. Кажется, это больше, чем pyinstaller / cx_freeze, так как это происходит в обоих ....

1 Ответ

0 голосов
/ 15 мая 2018

Я столкнулся с той же проблемой и, наконец, переключился на cx_freeze, который теперь отлично работает на Linux и Windows.Проблемы, с которыми вы сталкиваетесь, возникают из-за операторов, подобных найденному вами ответу SE , то есть динамических операторов импорта, где импортируемый объект определяется только во время выполнения:

    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

...