Я написал довольно простое приложение с графическим интерфейсом, используя 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)
Просто предполагаю: возможно также, что зависимость
libpyside6.abi3.so.6.1
не может быть включена cx_Freeze. Есть ли у вас возможность проверить зависимостиlibpyside6.abi3.so.6.1
с помощью какого-либо инструмента анализа зависимостей? И не могли бы вы поделиться своимsetup.py
?Я добавил
setup.py
к вопросу.Также я использовал
ldd
в библиотекеlibpyside6.abi3.so.6.1
, что, возможно, дало подсказку. Я обновил вопрос с этой информацией.Попробуйте добавить
import shiboken6
в основное приложение. Приносит ли это какое-то улучшение?Я обнаружил аналогичную проблему для PySide2/shiboken2: Ошибка импорта Shiboken2 #638. Хуки в cx_Freeze, похоже, определены только для PyQt5/PySide2, см. github.com/marcelotduarte/cx_Freeze/blob/main/cx_Freeze/…, строки 864–1069. См. также комментарии в
PySide6/__init__.py