Moritz Lennert wrote:
> I'm a python newbie so have some patience 
>
> I'm trying to use r.mapcal with the grass.py function 'run_command' in
> this way:
>
> e = "%s=%s-%s" % (out, dsm, dtm)
> grass.run_command('r.mapcalc', expression = e)
>
> However, the new raster in "%out" doesn't appear, and a new raster
> called 'expression' is created instead.
>
> I also tried with:
>
> grass.run_command('r.mapcalc', expression = "%s=%s-%s" % (out, dsm, dtm))
The expression= parameter only exists in GRASS7, but not in grass6.x.
So, r.mapcalc expression=k=1
will give you
in GRASS6.x: a map called 'expression' with the value 1
in GRASS7: a map called 'k' with the value 1
So everything depends on the version of GRASS you are running.
> with the same result. And also with:
>
> grass.run_command('r.mapcalc', %s = "%s-%s" % (out, dsm, dtm))
No expert, but shouldn't this be:
grass.run_command('r.mapcalc', "%s = %s-%s" % (out, dsm, dtm))
[note the changed location of the opening quote]
In terms of Python syntax, the latter is correct.
However, grass.run_command() is intended for modules which use
G_parser(). In particular, you can only pass arguments which have the
form "name=value".
You can fudge it for the 6.x version of r.mapcalc with:
grass.run_command('r.mapcalc', **{out: "%s-%s" % (dsm, dtm)})
But I would suggest either using subprocess.call():
subprocess.call(['r.mapcalc', '%s = %s-%s' % (out, dsm, dtm)])
or passing the expression via stdin using grass.write_command():
grass.write_command('r.mapcalc', stdin = '%s = %s-%s' % (out, dsm, dtm))
--
Glynn Clements <glynn@gclements.plus.com>