Всем привет! Это небольшие заметки программиста, вдруг кому-то пригодится.
Недавно во время разработки одного проекта на Qt, заметил одну ошибку, решение которой нашлось довольно быстро, но как оказалось оно даже не одно. Сегодня я бы хотел рассказать о найденных мною решениях и, собственно, показать их.
Ошибка возникала следующая:
"qt.qpa.plugin: Could not load the Qt platform plugin "<платформа>" in "" even though it was found."
Ошибка рассказывает нам о том, что Qt, а в моем случае PySide2, не удалось найти путь к библиотекам для текущей платформы. С такой ошибкой я столкнулся как на MacOS так и на операционных системах Linux, на Windows проект собирался без проблем.
Решение 1
Можно пойти на хитрость и сделать программную подмену системной переменной QT_QPA_PLATFORM_PLUGIN_PATH, в которой хранится путь до библиотек платформы. На Python это можно сделать следующим образом:
- Получаем путь к каталогу, где находится пакет PySide2
dirname = os.path.dirname(PySide2.__file__)
- Строим путь к папке 'platforms' внутри пакета PySide2
plugin_path = os.path.join(dirname, 'Qt','plugins', 'platforms')
- Устанавливаем значение переменной среды созданный путь к плагину
os.environ['QT_QPA_PLATFORM_PLUGIN_PATH'] = plugin_path
Также не забываем в начале кода импортировать модуль os для взаимодействия с текущей операционной системой
import os
Также можно добавить условие чтобы установка переменной среды выполнялась только на MacOS и Linux. Код будет выглядеть следующим образом:
import sys
import os
…
if (sys.platform.startswith("linux")) or (sys.platform.startswith("darwin")):
dirname = os.path.dirname(PySide2.__file__)
plugin_path = os.path.join(dirname, 'Qt','plugins', 'platforms')
os.environ['QT_QPA_PLATFORM_PLUGIN_PATH'] = plugin_path
Решение 2
Более правильное по моему мнению. Так как MacOS и Linux по части своей это Unix-подобные системы, то можно просто выполнить в консоли две команды:
export QT_QPA_PLATFORM_PLUGIN_PATH=<путь_до_папки_с_библиотеками>
export QT_PLUGIN_PATH=<путь_до_папки_с_библиотеками>
Путь до папки с библиотеками можно узнать из первого решения (plugin_path). Просто выведите в консоль эту переменную и получите путь до нужно папки.
print(plugin_path)
P.S.
Для Linux, а в частности Astra Linux, по мимо установки пути в системной переменной, необходимо установить и дополнительные библиотеки:
sudo apt-get install '^libxcb.*-dev' libx11-xcb-dev libglu1-mesa-dev libxrender-dev libxi-dev libxkbcommon-dev libxkbcommon-x11-dev
P.S.S
Дополнительно, опять же на Astra Linux, при сборке проекта может возникать ошибка, связанная с отсутствием библиотеки libxcb-util.so.1. Решением здесь будет создание символической ссылки на уже имеющийся файл libxcb-util.so.0
sudo ln -s /usr/lib/x86_64-linux-gnu/libxcb-util.so.0 /usr/lib/x86_64-linux-gnu/libxcb-util.so.1
У меня после этих манипуляций проект начал собираться на всех трех десктопных операционных системах.
Если я что-то, по-вашему, упустил или у вас есть дополнения, милости прошу в комментарии. Всем удачи