Как исключить ненужные файлы Qt * .so при упаковке приложения?

После успешной упаковки моего приложения PySide с помощью PyInstaller я обнаружил много разных файлов * .so в папке пакета. Я был удивлен, увидев библиотеки, которые я не использую в своем проекте, например: libQt53DAnimation.so, libQt53DCore.so, libQt5Multimedia.so и т. Д.

Я не импортировал их в исходный код и не включал в скрытый импорт.

Как я читал, PyInstaller автоматически находит все зависимости, необходимые для запуска приложения. Если я удалю их вручную после упаковки, то мое приложение будет работать без каких-либо изменений / проблем. Это указывает на то, что они не нужны и не должны рассматриваться как зависимости, не так ли?

Так есть ли способ исключить их при упаковке?


person Artem    schedule 12.08.2019    source источник


Ответы (1)


Если вы уверены, что они не нужны вашему приложению, вы можете исключить их с помощью анализа в файле спецификации. Вам просто нужно добавить их, как показано здесь https://pythonhosted.org/PyInstaller/spec-files.html#spec-file-operation.

Вот что можно было сделать:

a.binaries = a.binaries - TOC([
  ('libQt53DAnimation.so', None, None),
  ('libQt53DCore.so', None, None),
  ('libQt5Multimedia.so', None, None),
])

Существует также --exclude-module EXCLUDES для исключения модулей, но не уверен, насколько он актуален для вашего случая.

К сожалению, pyinstaller включает некоторые дополнительные зависимости, как объясняет Хартмут Гебель здесь

PyInstaller старается включать только необходимые модули - это то, о чем PyInstaller :-). Но у многих пакетов есть необязательные зависимости, которые для вашей программы могут не понадобиться, но необходимы для других программ. PyInstaller не может этого знать, и если PyInstaller удалит слишком много, другие программы могут выйти из строя. Пожалуйста, используйте для этого опцию --exclude.

Имейте в виду, что одна только функция Python «полная поддержка юникода» добавляет множество модулей кодеков, которые кажутся ненужными, но необходимы для правильной работы Python.

person Vikramaditya Gaonkar    schedule 13.08.2019
comment
Спасибо за ответ. Приятно, что есть возможность исключить библиотеки вручную, но это работает, если я знаю, что они бесполезны для моего приложения (например, я не использую 3D и мультимедиа в своем проекте, поэтому я могу идентифицировать их по имени библиотеки а потом удалим) а как разобраться в других либах? Как я узнаю, что lib libQt5Concurrent.so не является значительной зависимостью от другой библиотеки? Проверять это путем удаления и видеть, что не работает, - не лучшая идея, особенно в больших проектах. - person Artem; 13.08.2019
comment
@Artem отредактировал ответ, чтобы объяснить причину добавления дополнительных DLL - person Vikramaditya Gaonkar; 13.08.2019
comment
Я не думаю, что на комментарий @Artem был дан ответ. Кто-нибудь знает, как проверить, нужна ли библиотека или зависит от другой необходимой библиотеки? - person Aaron; 28.11.2020