5

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.
9
+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

7
  • Thank you, give me some time to test! – cincin21 May 28 '20 at 9:11
  • Hi Cincin, let me know if any additional code snippet or explanation is needed. Cheers – fastest May 28 '20 at 14:06
  • I believe it would be beneficial to paste whole code with import that others could copy-paste the solution – cincin21 May 28 '20 at 14:08
  • Hi Cincin, I did specify the content of the other bat files included in the file used to start PyCharm. Moreover, I added the import statement to the Python code example and enclosed it in a main function so that it can be executed as a standalone script. Cheers. – fastest May 28 '20 at 14:38
  • Great stuff! I would only add one path to Interpreter paths: C:\Program Files\QGIS 3.10\apps\qgis-ltr\python , I've seen it in other solutions and after adding this one, everything started to work. Thank you very much! – cincin21 May 28 '20 at 20:27

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy

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