Как исправить 'Не удалось найти плагин платформы Qt "Windows" в "" "при реализации qgis в пользовательском приложении Python3? - PullRequest
0 голосов
/ 10 января 2019

Я реализую qgis 3.4.3 в пользовательском приложении, но когда я создаю экземпляр класса QgsApplication (), я получаю сообщение об ошибке «Не удалось найти подключаемый модуль платформы Qt« Windows »в» ».

Я пытался использовать различные установки qgis 3.x +, включая автономный установщик и веб-установщик OSGeo4W. В настоящее время я придерживаюсь установки веб-установщика OSGeo4W. Я использую установку Python 3.7 отдельно от того, что поставляется с OSGeo4W, и пытаюсь интегрировать функциональность qgis.

Я следовал инструкциям в следующем справочном документе QGIS в разделе: «Использование PyQGIS в пользовательских приложениях» https://docs.qgis.org/2.18/en/docs/pyqgis_developer_cookbook/intro.html#run-python-code-when-qgis-starts

После попытки запустить скрипт я понял, что отсутствует плагин dll. После некоторых исследований я обнаружил, что qwindows.dll использует qt. Файл qwindows.dll включен в установку OSGeo4W по адресу: C: \ OSGeo4W \ apps \ Qt5 \ plugins \ platform

Я изменил переменную QT_PLUGIN_PATH в локальной командной строке, чтобы включить каталог выше, но та же ошибка преобладала. Я также изменил переменную QT_DEBUG_PLUGINS на 1, которая распечатывает местоположения, которые Qt ищет плагины. Интересно, что он не искал плагины в пути, который я указал в переменной QT_PLUGIN_PATH.

Код Python:

import sys
#add qgis python libraries to instance python path in case not added 
#at the environment variable %PYTHONPATH% level
sys.path.extend(['C:\\OSGeo4W\\apps\\qgis\\python', 
'C:\\OSGeo4W\\apps\\Python37\\Lib\\site-packages'])

from qgis.core import *

# supply path to qgis install location
QgsApplication.setPrefixPath('C:\\OSGeo4W\\apps\\qgis', True)

# create a reference to the QgsApplication
# setting the second argument to True enables the GUI, which we need to do
# since this is a custom application
qgs = QgsApplication([], True)

# load providers
qgs.initQgis()

# Write your code here to load some layers, use processing algorithms, etc.

# When your script is complete, call exitQgis() to remove the provider and
# layer registries from memory
qgs.exitQgis()

Код командного файла для запуска запроса Cmd с правильными переменными:

@echo off
SET OSGEO4W_ROOT=C:\OSGeo4W
::Include environment variables set by qgis on startup
call %OSGEO4W_ROOT%\bin\o4w_env.bat
call %OSGEO4W_ROOT%\bin\qt5_env.bat
call %OSGEO4W_ROOT%\bin\py3_env.bat
@echo off
path %PATH%;%OSGEO4W_ROOT%\apps\qgis\bin
path %PATH%;C:\OSGeo4W\apps\Qt5\bin
path %PATH%;C:\OSGeo4W\apps\Python37\Scripts
path %PATH%;C:\OSGeo4W\apps\Python37

set PYTHONPATH=%PYTHONPATH%;%OSGEO4W_ROOT%\apps\qgis\python
set PYTHONHOME=%OSGEO4W_ROOT%\apps\Python37
set QT_PLUGIN_PATH=%OSGEO4W_ROOT%\apps\Qt5\plugins;%OSGEO4W_ROOT%\apps\qgis\qtplugins
set QT_DEBUG_PLUGINS=1

cmd.exe

Я ожидаю запустить скрипт python и не получу ошибок, поскольку указываю на каталог, в котором хранится отсутствующий плагин qwindows.dll. Тем не менее, я все еще получаю сообщение об ошибке отсутствующего плагина Windows.

Вот фактическое сообщение с QT_DEBUG_PLUGINS, установленным в 1: QFactoryLoader :: QFactoryLoader () проверяет путь к каталогу "C: / OSGeo4W / apps / qgis / qtplugins / platform" ... QFactoryLoader :: QFactoryLoader () проверяет путь к каталогу "C: / OSGeo4W / apps / Python37 / platform" ... qt.qpa.plugin: Не удалось найти плагин платформы Qt "windows" в "" Не удалось запустить это приложение, поскольку ни один плагин платформы Qt не мог быть инициализирован. Переустановка приложения может решить эту проблему.

1 Ответ

0 голосов
/ 11 января 2019

Добавьте следующие переменные окружения в начале скрипта Python перед загрузкой qgis.core:

#modify environment variables to find qgis and qt plugins during qgis.core import
os.environ['QT_QPA_PLATFORM_PLUGIN_PATH'] = r'~qgis directory\apps\Qt5\plugins'
os.environ['PATH'] += r';~qgis directory\apps\qgis\bin;~qgis directory\apps\Qt5\bin'

Переменная QT_QPA_PLATFORM_PLUGIN_PATH используется Qt для поиска определенных драйверов, включая qwindows.dll. Он не знает путь к каталогу '~ qgis directory \ apps \ Qt5 \ plugins', поэтому вам нужно указать его перед использованием модуля QgsApplication, импортированного из qgis.core.

Чтобы ваша локальная версия python нашла каталог qgis.core, вам также необходимо добавить следующие каталоги qgis в ваш скрипт перед загрузкой qgis.core:

sys.path.extend([r'~qgis directory\apps\qgis\python',r'~qgis directory\apps\Python37\Lib\site-packages'])
...