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):
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:
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(...)