Terminating Python scripts in Processing framework

  • first thing, osgeo.gdal is for pure Python scripting:

    from osgeo import gdal  
    raster  = gdal.Open('your.tif')   
    raster.GetProjection()
    

Everything else is a problem of osgeo, and not of PyQGIS, since you use 2 QGIS existing layers:

 ##raster_1=raster  
 ##raster_2=raster

you don't need it. To process the layers, the correct code is:

raster_1 = processing.getobject(raster_1)   
raster_2 = processing.getobject(raster_2)

an the crs is given by:

new_proj = raster.crs()
  • second thing, you cannot load a raster in QGIS without projection (if not yet existing, it is chosen by QGIS, according to some criteria):

enter image description here

So your first condition if proj is None:, is unnecessary and your script become (you don't need a list with only two layers):

raster_1 = processing.getobject(raster_1)
raster_2 = processing.getobject(raster_2)
if raster_1.crs()==raster_2.crs():
     action
else:
     WrongCRS()

and the script terminate by himself.


in the last version of the processing module, it is now:

processing.getObjects()

For terminate the script, you can embed your script in a function and use sys.exitfunc() (I use the Python console to to see the results)

example:

import atexit
.....
def all_done():
    message = '- Rasters must have the same CRS!\n\nExecution cancelled!'
    print message   
atexit.register(all_done)
raster_1 = processing.getObject(raster_1)
raster_2 = processing.getObject(raster_2)
def main():
    if raster_1.crs() != raster_2.crs():
         sys.exitfunc()
    else:
          message = "ok"
          print message
          continue
main()

Result in the Python console:

enter image description here


It is impossible (for now at least) to terminate Processing python script and leave QGIS itself untouched. It was suggested by @gene to use sys.exitfunc() to terminate main function. However I find it more useful to use just return message to just end function normally. Here is pseudo code:

class ErrorMessage(...):
  .....

def checkFunction(parameter):
  if parameter == condition:
    return False
  else:
    return True

def jobFunction(...):
  ...
  if parameter_1 == condition_1:
    return False

  result = ...
  return result

def main(...):
  if not checkFunction(parameter):
    return ErrorMessage(...)

  result = jobFunction(...)
  if result == False:
    return ErrorMessage(...)

  return result

main(...)