12

I'm referring to this post:

Why does QGIS 3.2 "native:extractvertices" algorithm not work properly in standalone script?

as part on creating startup file py3-env.bat for opening PyCharm with PyQGIS works:

@ECHO OFF 

set OSGEO4W_ROOT=C:\OSGeo4W64

@echo off
call "%OSGEO4W_ROOT%\bin\o4w_env.bat"
call "%OSGEO4W_ROOT%\bin\qt5_env.bat"
call "%OSGEO4W_ROOT%\bin\py3_env.bat"

@echo off
path %OSGEO4W_ROOT%\apps\qgis\bin;%PATH%
set GDAL_FILENAME_IS_UTF8=YES

set VSI_CACHE=TRUE
set VSI_CACHE_SIZE=1000000
set QT_PLUGIN_PATH=%OSGEO4W_ROOT%\apps\qgis\qtplugins;%OSGEO4W_ROOT%\apps\qt5\plugins

SET PYCHARM="C:\Program Files\JetBrains\PyCharm Community Edition with Anaconda plugin 2020.1\bin\pycharm64.exe"

set PYTHONPATH=%OSGEO4W_ROOT%\apps\qgis\python
set PYTHONHOME=%OSGEO4W_ROOT%\apps\Python37
set PYTHONPATH=%OSGEO4W_ROOT%\apps\Python37\lib\site-packages;%PYTHONPATH%

set QT_QPA_PLATFORM_PLUGIN_PATH=%OSGEO4W_ROOT%\apps\Qt5\plugins\platforms
set QGIS_PREFIX_PATH=%OSGEO4W_ROOT%\apps\qgis


cd /d %~dp0
::python3 scratch.py
::pause
start "PyCharm aware of QGIS" /B %PYCHARM% %*

I have:

QGIS 3.12.1 installed in: C:\OSGeo4W64

PyCharm 2020.1 installed in: C:\Program Files\JetBrains\PyCharm Community Edition with Anaconda plugin 2020.1\

After loading PyCharm the interpreter looks like this:

enter image description here

Now I just would like to run a simple test script like:

#native:extractvertices
import sys

from qgis.core import (
     QgsApplication,
     QgsProcessingFeedback,
     QgsVectorLayer
)
from qgis.analysis import QgsNativeAlgorithms

QgsApplication.setPrefixPath(r'C:\OSGeo4W64\apps\qgis', True)
qgs = QgsApplication([], False)
qgs.initQgis()

sys.path.append(r'C:\OSGeo4W64\apps\qgis\python\plugins')

import processing
from processing.core.Processing import Processing
Processing.initialize()
QgsApplication.processingRegistry().addProvider(QgsNativeAlgorithms())

layer = QgsVectorLayer(r"D:\test_pygis\lines.shp", 'my layer', 'ogr')
output = r"D:\test_pygis\verticles.shp"
params = {
    'INPUT': layer,
    'OUTPUT': output,
}
feedback = QgsProcessingFeedback()
res = processing.run("native:extractvertices", params, feedback=feedback)
print(res)

First the processing module is not found:

enter image description here

If I try to run the code the second well know error appears in the Python console:

qt.qpa.plugin: Could not find the Qt platform plugin "windows" in "C:\OSGEO4~1\apps\Qt5\plugins\platforms"
This application failed to start because no Qt platform plugin could be initialized. Reinstalling the application may fix this problem.

3 Answers 3

12
+100

I would like to share the solution I found to integrate PyCharm and PyQGIS in an effective way to run standalone scripts:

Setup:

  • Windows 10
  • QGIS 3.10.4 installed in c:\Program Files\QGIS 3.10
  • PyCharm 2020.1.1 installed in c:\Program Files\JetBrains\PyCharm Community Edition 2020.1.1\bin\pycharm64.exe

I can start PyCharm from a batch file (e.g., pycharm_qgis.bat) that looks like the following (note that the QT_PLUGIN_PATH is slightly different than in your case):

@echo off 
set OSGEO4W_ROOT=c:\PROGRA~1\QGIS3~1.10
set path=%OSGEO4W_ROOT%\bin;%WINDIR%\system32;%WINDIR%;%WINDIR%\system32\WBem

call o4w_env.bat 
call qt5_env.bat
call py3_env.bat

@echo off
path %OSGEO4W_ROOT%\apps\qgis-ltr\bin;%PATH%
set QGIS_PREFIX_PATH=%OSGEO4W_ROOT:\=/%/apps/qgis-ltr
set GDAL_FILENAME_IS_UTF8=YES
set VSI_CACHE=TRUE
set VSI_CACHE_SIZE=1000000
set QT_PLUGIN_PATH=%OSGEO4W_ROOT%\apps\qgis-ltr\qtplugins;%QT_PLUGIN_PATH%
set PYTHONPATH=%OSGEO4W_ROOT%\apps\qgis-ltr\python;%PYTHONPATH%

set PYCHARM="c:\Program Files\JetBrains\PyCharm Community Edition 2020.1.1\bin\pycharm64.exe"
@echo on
start "PyCharm with QGIS knowledge!" /B %PYCHARM% %*

From the code above, the o4w_env.bat, qt5_env.bat, py3_env.bat are the same batch files available in the QGIS binary folder (i.e., in the case of this example %OSGEO4W_ROOT%\apps\qgis-ltr\bin) without any modification. By executing pycharm_qgis.bat PyCharm starts and the Python interpreter can be set to %OSGEO4W_ROOT%\apps\Python37\python.exe in order to work with PyQGIS library.

Then, for PyCharm to recognize and use the processing module, one needs to manually add to the interpreter path the folder %OSGEO4W_ROOT%\apps\qgis-ltr\python\plugins, as shown in the next picture:

Manually add the processing module folder to Python interpreter path

After that, PyCharm can interact with the processing module:

PyCharm recognies the processing module

Finally, the following code excerpt replicates your example and uses the native:extractvertices algorithm:

import os
import sys

from qgis.analysis import QgsNativeAlgorithms
from qgis.core import QgsApplication, QgsVectorLayer, QgsProcessingException, QgsProcessingFeedback

if __name__ == "__main__":
    QgsApplication.setPrefixPath(r"c:\Program Files\QGIS 3.10\apps\qgis-ltr", True)
    qgs = QgsApplication([], False)
    qgs.initQgis()
    sys.path.append(os.path.join(QgsApplication.prefixPath(), "python", "plugins"))

    import processing
    from processing.core.Processing import Processing
    Processing.initialize()
    QgsApplication.processingRegistry().addProvider(QgsNativeAlgorithms())

    s_lyr_gpk = os.path.join("Shp", "BOUNDARIES3D.shp")
    s_lyr_name = "Boundaries"
    lyr = QgsVectorLayer(s_lyr_gpk, s_lyr_name, 'ogr')
    if not lyr.isValid():
        print("Layer {} is not valid".format(s_lyr_name))

    s_alg = 'native:extractvertices'
    out = os.path.join("d:\Data\Output", "extracted_vertices_script.gpkg")

    di_param = {
         "INPUT": lyr,
         "OUTPUT": out
    }
    feedback = QgsProcessingFeedback()
    try:
        di_out = processing.run(s_alg, di_param, feedback=feedback)
    except QgsProcessingException as e:
        print(e)
        qgs.exitQgis()
        sys.exit(1)

    print("Vertices extracted to file {}.".format(di_out["OUTPUT"]))
    qgs.exitQgis()

The above script can be executed directly from PyCharm to get the output geopackage written. No error related to missing QT platform plugin is raised (see image below):

Successful script execution from PyCharm

1
  • This was probably the best method at the time it was written, but there is a much simpler way in another answer to this question, see: gis.stackexchange.com/a/459011/48798
    – wfgeo
    Commented Oct 15 at 9:06
12

The Most simply solution without the need to set an own bat-script I have found in the comments of this video: https://www.youtube.com/watch?v=Qm0PCw9v5lI

Just add a new Python Interpreter within PyCharm and select the file python-qgis-ltr.bat which you can find within the bin folder of your QGIS installation directory. All the variables in relation to this QGIS installation are set there already.

enter image description here

0
5

System Windows QGIS 3.28 Firenze

For me I seem to be able to use the qgis functionality as well as the processing plugin in PyCharm when I do the following:

  1. Set the project interpreter in Pycharm to use the batchfile under C:/Program Files/QGIS 3.28.3/bin/python-qgis.bat.

enter image description here

  1. Add manually the path C:/Program Files/QGIS 3.28.3/apps/qgis/python/plugins to the interpreter path

enter image description here

  1. In your python script, to be able to use the algorithms from the processing plugin, import all functionality from the qgis.core module as well as the processing module and initialize it.
from qgis.core import *

import processing
from processing.core.Processing import Processing
Processing.initialize()

I just tried this out without any deeper knowledge about what I'm actually doing here, and didn't had the time since yesterday to do more research on it yet, but it works for me so far.

0

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Not the answer you're looking for? Browse other questions tagged or ask your own question.