Ошибка времени выполнения при вызове .exe, сделанного с помощью PyInstaller, включая PyQt4 - PullRequest
0 голосов
/ 05 декабря 2018

Итак, у меня есть два .py файла, один сгенерированный QtDesigner , а другой, который в основном реализует функциональность GUI.Используя pyinstaller , я сгенерировал файл .exe для использования в системах без python и связанных библиотек.

Команда: pyinstaller my_script.py работает без ошибок.

Проблема возникает при запуске файла .exe .

Ошибка:

Qt: Обнаружена непроверенная версия Windows 10.0!Traceback (последний вызов был последним): файл "site-packages \ PyInstaller \ loader \ rthooks \ pyi_rth_qt4plugins.py", строка 41, в ImportError: нет модуля с именем 'PySide'

Во время обработки вышеуказанного исключения,произошло другое исключение:

Traceback (последний вызов был последним): файл "site-packages \ PyInstaller \ loader \ rthooks \ pyi_rth_qt4plugins.py", строка 43, в файле "", строка 2237, в файле _find_and_load "", строка 2226, в _find_and_load_unlocked файле" ", строка 1191, в _load_unlocked файле" ", строка 1161, в _load_backward_compatible файле" C: \ python \ lib \ site-packages \ PyInstaller \ loader \ pyimod03_importers.py ", строка 714,в модуле load_module = loader.load_module (полное имя)

RuntimeError: оба модуля PyQt4.QtCore и PyQt5.QtCore обертывают класс QObject [11364] Не удалось выполнить скрипт pyi_rth_qt4plugins

Я пытался найти решение этой проблемы.Вот решения, которые я попробовал:

Как заставить PyQt5 использовать для класса QObject? - просто выполните импорт PyQt, так как первый оператор не решает проблему.

https://github.com/tzutalin/labelImg/issues/268 - здесь рекомендуется удалить PyQt4 и только для использования PyQt5 .У меня они есть в моей системе, некоторые проекты используют PyQt5 , а некоторые - PyQt4 , поэтому я не хочу удалять последние.Кроме того, должно быть другое решение , заставляющее меня этого не делать.

https://intellij -support.jetbrains.com / hc / en-us / community / posts/ 115000551170-PyQt4-and-PyQt5-collisions-in-PyCharm-2017-2-1-when-debugging-QGIS-application - Это была похожая ошибка, поэтому я добавил: matplotlib.rcParams['backend'] = 'Qt4Agg' matplotlib.rcParams['backend.qt4'] = 'PyQt4'

для моего импорта все еще не работает.

Примечание: Я использую:

PyCharm 2018.1 (Community Edition)

Build #PC-181.4203.547, построено 26 марта 2018 года

JRE: 1.8.0_152-release-1136-b20 amd64

JVM: 64-битная виртуальная машина OpenJDK от JetBrains sro

Windows 10 10.0

и код отлично работает в IDE.

РЕДАКТИРОВАТЬ :

Мой импорт:

from PyQt4 import QtCore, QtGui
from matplotlib.backends.backend_qt4agg import FigureCanvasQTagg as Canvas

Я не добавляю другие операторы импорта, связанные с Qt.

EDIT - 2 :

Попытка cx_Freeze вместо PyInstaller , вот установочный файл.

import sys
from cx_Freeze import setup, Executable

base = None
if sys.platform == "win32":
    base = "Win32GUI"

additional_mods = ['numpy.core._methods', 'numpy.lib.format', 
'numpy._distributor_init']

setup( name="ASCII2fig",
       version = "0.1",
       description = "GUI",
       options = {'build_exe': {'includes': additional_mods}},
       executables = [Executable("ASCII2figALL_main_edited.py", base=base)])

Я добавил additional_mods после выполнения сценария один раз после ImportError, которые являются безостановочными.Любые способы взломать и найти, какие библиотеки я должен упомянуть явно?

Кроме того, я также попытался проверить, какие библиотеки на самом деле импортируются, когда я запускаю свой основной скрипт с Qt, используя:

from modulefinder import ModuleFinder

filename = "ASCII2figALL_main_edited.py"
finder = ModuleFinder()
finder.run_script(filename)
for name, mod in finder.modules.items():
    print(name)

и, по-видимому, он импортирует PyQt5 внутри .Как упоминалось ранее, у меня есть NO операторов импорта, в которых упоминается PyQt5.

Edit - 3

Итак, я изменил код на pure PyQt5 , обновил pyinstaller до последней версии - 3.4, и теперь существует новая проблема, где он не находит плагины Qt.Это все еще как-то импортирует PyQt4, и я не знаю, где.

1 Ответ

0 голосов
/ 10 декабря 2018

Итак, я наконец-то добрался до работы.Не идеальный случай, когда мне не нужно менять библиотеку на PyQt5 и проверять, все ли в порядке с PyInstaller, но это работает.Итак, вот что я сделал:

  1. Установленная версия Python 3.5 - Это потому, что после того, как я обновился до последней версии PyInstaller (3.4) и попытался запустить на Python 3.4, я получилновая ошибка, когда не удалось найти плагины Qt.После некоторых поисков я решил, что, поскольку я установил PyQt5 на версию Python (3.4), используя файл .whl, который я нашел в Пакетах расширения Python для Windows , установка не шла в комплекте с sip .Кроме того, когда я пытался установить PyQt5 на Python 3.4 с помощью pip, он не установился.

  2. Установил PyQt5 и все другие библиотеки в новой версии Python, используя пип . Примечание : в этой версии python не установлен PyQt4, поэтому вполне возможно, что это было причиной.Я установлю PyQt4 на эту версию Python и попробую снова создать .exe с помощью PyInstaller и посмотреть, что произойдет.

Итак, подведем итог: PyQt5 + Pyinstaller работает только для Python версии> = 3.5.Надеюсь, это поможет другим!

...