Как правильно упаковать PySide6 с помощью cxfreeze?

avatar
jfowkes
8 августа 2021 в 17:29
351
0
2

Я написал довольно простое приложение с графическим интерфейсом, используя Python 3.8.0 и PySide6, и я хотел бы упаковать его для распространения. Основываясь на таблице здесь, я выбрал cxfreeze, так как он совместим с Qt6 и Windows/Linux/Mac.

Мое приложение работает в среде pyenv на моем компьютере для разработки, если это имеет значение. На машине работает Debian Bullseye.

Я запустил мастер cxfreeze-quickstart, чтобы создать сценарий setup.py. Вывод скрипта: здесь (извините за ссылку pastebin, текст слишком длинный для coderhelper)

Когда я запускаю созданный исполняемый файл (build/build/exe.linux-x86_64-3.8/sne), я получаю следующую ошибку:

Traceback (most recent call last):
  File "/home/james/.pyenv/versions/3.8.0/lib/python3.8/site-packages/cx_Freeze/initscripts/__startup__.py", line 104, in run
    module_init.run(name + "__main__")
  File "/home/james/.pyenv/versions/3.8.0/lib/python3.8/site-packages/cx_Freeze/initscripts/Console.py", line 15, in run
    exec(code, module_main.__dict__)
  File "app.py", line 7, in <module>
ImportError: libpyside6.abi3.so.6.1: cannot open shared object file: No such file or directory

Файл libpyside6.abi3.so.6.1 находится в каталоге build/exe.linux-x86_64-3.8/lib/PySide6.

Я добавил строку для вывода содержимого sys.path при запуске приложения:

['/home/james/code/cave-escape/simple-nano-ethernet/SNEGui/build/exe.linux-x86_64-3.8/lib/library.zip', '/home/james/code/cave-escape/simple-nano-ethernet/SNEGui/build/exe.linux-x86_64-3.8/lib']

Каталог lib/PySide6 не указан в пути, но я считаю, что это не проблема, поскольку пакет PySide6 присутствует в lib.

Если я запускаю ldd против libpyside6.abi3.so.6.1, все зависимости имеют путь к файлу, указанный против них, кроме одного:

libshiboken6.abi3.so.6.1 => not found

Этот файл находится в каталоге build/exe.linux-x86_64-3.8/lib/shiboken6.

Я предполагаю, что мне нужно вручную отредактировать сценарий setup.py, чтобы исправить это, или, возможно, отредактировать sys.path при запуске приложения, но я точно не знаю, что делать в любом случае.

РЕДАКТИРОВАТЬ: содержимое setup.py (сгенерировано автоматически, без изменений):

from cx_Freeze import setup, Executable

# Dependencies are automatically detected, but it might need
# fine tuning.
build_options = {'packages': [], 'excludes': []}

import sys
base = 'Win32GUI' if sys.platform=='win32' else None

executables = [
    Executable('app.py', base=base, target_name = 'sne')
]

setup(name='Simple Nano Ethernet GUI',
      version = '1.0',
      description = 'An interface to configure the simple nano ethernet board',
      options = {'build_exe': build_options},
      executables = executables)
Источник
jpeg
9 августа 2021 в 06:29
0

Просто предполагаю: возможно также, что зависимость libpyside6.abi3.so.6.1 не может быть включена cx_Freeze. Есть ли у вас возможность проверить зависимости libpyside6.abi3.so.6.1 с помощью какого-либо инструмента анализа зависимостей? И не могли бы вы поделиться своим setup.py?

jfowkes
9 августа 2021 в 13:21
1

Я добавил setup.py к вопросу.

jfowkes
9 августа 2021 в 13:24
1

Также я использовал ldd в библиотеке libpyside6.abi3.so.6.1, что, возможно, дало подсказку. Я обновил вопрос с этой информацией.

jpeg
9 августа 2021 в 14:28
0

Попробуйте добавить import shiboken6 в основное приложение. Приносит ли это какое-то улучшение?

jpeg
9 августа 2021 в 14:42
0

Я обнаружил аналогичную проблему для PySide2/shiboken2: Ошибка импорта Shiboken2 #638. Хуки в cx_Freeze, похоже, определены только для PyQt5/PySide2, см. github.com/marcelotduarte/cx_Freeze/blob/main/cx_Freeze/…, строки 864–1069. См. также комментарии в PySide6/__init__.py

Ответы (0)