1

I want to run this code outside QGIS as a standalone Python script.

import os
import processing
os.chdir('C:/Users/User/test/25')
alg_params = { '-c' : False, 
 '-f' : False, 
 '-i' : False, 
 '-n' : False, 
 '-r' : False, 
 'GRASS_RASTER_FORMAT_META' : '', 
 'GRASS_RASTER_FORMAT_OPT' : '', 
 'GRASS_REGION_CELLSIZE_PARAMETER' : 0, 
 'GRASS_REGION_PARAMETER' : None, 
 'map' : 'test.tif', 
 'null' : None, 
 'output' : 'Null/out.tif', 
 'setnull' : '0' }
processing.run('grass7:r.null', alg_params)

I searched for some solutions but got for Linux. I have QGIS 3.16. Please guide how to run it on Windows?

Kadir Şahbaz
78.6k57 gold badges260 silver badges407 bronze badges
asked Feb 17, 2021 at 4:50
1

1 Answer 1

2

This answer assumes that you have an OSGeo4W64 installation of QGIS. If you have a standalone install, you will need to alter some of the files in the batch file and Python script.

First, create and save a batch file with the following content. As I said, make sure all the paths are correct for your system and installation. This batch file will set up the required environment to run QGIS processing algorithms including Grass algs with Python outside of the QGIS Python console.

@echo off
SET OSGEO4W_ROOT=C:\OSGeo4W64
call "%OSGEO4W_ROOT%"\bin\o4w_env.bat
call "%OSGEO4W_ROOT%"\bin\qt5_env.bat
call "%OSGEO4W_ROOT%"\bin\py3_env.bat
call "%OSGEO4W_ROOT%"\apps\grass\grass78\etc\env.bat
@echo off
path %PATH%;%OSGEO4W_ROOT%\apps\qgis\bin
path %PATH%;C:\OSGeo4W64\apps\Qt5\bin
path %PATH%;C:\OSGeo4W64\apps\Python37\Scripts
set QGIS_PREFIX_PATH=%OSGEO4W_ROOT:\=/%/apps/qgis
set GDAL_FILENAME_IS_UTF8=YES
rem Set VSI cache to be used as buffer, see #6448
set VSI_CACHE=TRUE
set VSI_CACHE_SIZE=1000000
set PYTHONPATH=%PYTHONPATH%;%OSGEO4W_ROOT%\apps\qgis\python
set PYTHONHOME=%OSGEO4W_ROOT%\apps\Python37
set QT_PLUGIN_PATH=%OSGEO4W_ROOT%\apps\qgis\qtplugins;%OSGEO4W_ROOT%\apps\qt5\plugins
cmd.exe

This line call "%OSGEO4W_ROOT%"\apps\grass\grass78\etc\env.bat is required to run Grass algorithms from a standalone script. Give the batch file a logical name (e.g. qgis-python-grass.bat).

Save the following script as a .py file. Again, it is up to you change all paths in this script to match your system and installation including the paths to your input and output .tif files.

import sys
from qgis.core import QgsApplication
#from qgis.analysis import QgsNativeAlgorithms
QgsApplication.setPrefixPath('C:/OSGeo4W64/apps/qgis', True)
qgs = QgsApplication([], False)
qgs.initQgis()
sys.path.append('C:\\OSGeo4W64\\apps\\qgis\\python\\plugins')
import processing
from processing.core.Processing import Processing
Processing.initialize()
#QgsApplication.processingRegistry().addProvider(QgsNativeAlgorithms())
alg_params = {
'map':'C:/Users/Path/To/Input.tif',
'setnull':'',
'null':0,
'-f':False,
'-i':False,
'-n':False,
'-c':False,
'-r':False,
'output':'C:/Users/Path/To/Output.tif',
'GRASS_REGION_PARAMETER':None,
'GRASS_REGION_CELLSIZE_PARAMETER':0,
'GRASS_RASTER_FORMAT_OPT':'',
'GRASS_RASTER_FORMAT_META':''
}
processing.run("grass7:r.null", alg_params)

For argument's sake, let's say that we will call this script r-null_standalone.py. Place both this script and the batch file in the same folder. You can then simply double click the batch file to launch a cmd window. At the command prompt just type python3 r-null_standalone.py and hit Enter to run your Python script.

Update Jan 2022

For newer versions of QGIS installed with the new OSGeo4W installer, the batch file looks slightly different. I used the following batch file to set the environment then retested this answer using the script and steps described above. It worked fine for me in QGIS 3.20.3.

@echo off
SET OSGEO4W_ROOT=C:\OSGeo4W
call "%OSGEO4W_ROOT%"\bin\o4w_env.bat
call "%OSGEO4W_ROOT%\apps\grass\grass78\etc\env.bat"
@echo off
path %PATH%;%OSGEO4W_ROOT%\apps\qgis\bin
path %PATH%;C:\OSGeo4W\apps\Qt5\bin
path %PATH%;C:\OSGeo4W\apps\Python39\Scripts
set QGIS_PREFIX_PATH=%OSGEO4W_ROOT:\=/%/apps/qgis
set GDAL_FILENAME_IS_UTF8=YES
rem Set VSI cache to be used as buffer, see #6448
set VSI_CACHE=TRUE
set VSI_CACHE_SIZE=1000000
set PYTHONPATH=%PYTHONPATH%;%OSGEO4W_ROOT%\apps\qgis\python
set PYTHONHOME=%OSGEO4W_ROOT%\apps\Python39
set QT_PLUGIN_PATH=%OSGEO4W_ROOT%\apps\qgis\qtplugins;%OSGEO4W_ROOT%\apps\qt5\plugins
cmd.exe
answered Feb 18, 2021 at 3:40
2
  • This answer no longer works in QGIS 3.20.2. Please message me if you know the solution. Commented Jan 11, 2022 at 7:16
  • @Comrade Che, I have posted a new version of the batch file, edited slightly for the new OSGeo4W installer. I have just retested the steps described to run the code in this answer. It worked fine for me in QGIS 3.20.3 Commented Jan 11, 2022 at 9:13

Your Answer

Draft saved
Draft discarded

Sign up or log in

Sign up using Google
Sign up using Email and Password

Post as a guest

Required, but never shown

Post as a guest

Required, but never shown

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

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.