[GRASS-user] Problem with running Python script in GRASS

Hello fellow GRASS users!

I'm sure this is a very simple problem but I'm having a really difficult
time with it... After searching for the solution for several days I'm on the
end of my whits and am really needing this script to get working. This is
the problem:

I've written a Python script, doing my best to use the Python I know and
reverse engineer the python scripts I found in the Internet. As far as I can
tell, the script should be fine, although I naturally can't execute it
independently. My goal is to run it as a command from inside GRASS so that
the user can input the parameters through the GUI. I think GRASS recognizes
that the script is there but isn't able to generate the GUI.

Here's the script:

__________________________________

############################################################################
#
# MODULE: r.solar
# AUTHOR(S): Daniel Lee
# PURPOSE: Runs r.sun for a year using different inputs for each month
# COPYRIGHT: (C) 2010 by Daniel Lee
#
# This program is free software under the GNU General Public
# License (>=v2). Read the file COPYING that comes with GRASS
# for details.
#
#############################################################################

#%Module
#% label: Solar modeling tool.
#% description: Conducts a solar analysis for a year using empirical inputs
for each month.
#% keywords: raster
#%End
#%Option
#% key: elevin
#% type: string
#% gisprompt: old,cell,raster
#% description: Name of input elevation map (unit = meters)
#% required : yes
#% guisection: Required inputs
#%End
#%Option
#% key: aspect
#% type: string
#% gisprompt: old,cell,raster
#% description: Name of input aspect map (decimal degrees)
#% required : yes
#% guisection: Required inputs
#%End
#%Option
#% key: slopein
#% type: string
#% gisprompt: old,cell,raster
#% description: Name of input slope map (decimal degrees)
#% required : yes
#% guisection: Required inputs
#%End
#%Option
#% key: linkein
#% type: string
#% gisprompt: old,cell,raster
#% description: Name of input Linke atmospheric turbidity coefficient map
#% required : no
#% guisection: Optional inputs
#%End
#%Option
#% key: albedo
#% type: string
#% gisprompt: old,cell,raster
#% description: Name of input albedo coefficient map
#% required : no
#% guisection: Optional inputs
#%End
#%Option
#% key: mapset
#% type: string
#% description: Name of the mapset containing solar data
#% required : yes
#% guisection: Required inputs
#%End
#%Flag
#% key: z
#% description: Generate map of sunlight insolation time (h)
#% guisection: Output options
#%End
#%Flag
#% key: y
#% description: Generate map of reflected radiation (Wh/m2)
#% guisection: Output options
#%End

import sys
import os
import string
import grass.script as grass

def main():
  elevin = options['elevin']
  aspect = options['aspect']
  slopein = options['slopein']
  linkein = options['linkein']
  albedo = options['albedo']
  mapset = "@" + options['mapset']
  reflected = flags['y']
  duration = flags['z']
  step = 0.16
   
  for day in range(365):
    day += 1
    # Define month
    if day == 1:
      month = "01" + mapset
    elif day == 32:
      month = "02" + mapset
    elif day == 60:
      month = "03" + mapset
    elif day == 91:
      month = "04" + mapset
    elif day == 121:
      month = "05" + mapset
    elif day == 152:
      month = "06" + mapset
    elif day == 182:
      month = "07" + mapset
    elif day == 213:
      month = "08" + mapset
    elif day == 244:
      month = "09" + mapset
    elif day == 274:
      month = "10" + mapset
    elif day == 305:
      month = "11" + mapset
    elif day == 335:
      month = "12" + mapset

    # Define coefficients!
    coefbh = 'coefbh' + month
    coefdh = 'coefdh' + month
    if not grass.find_file(elevin)['file'] or not
grass.find_file(aspect)['file'] or not grass.find_file(slopein)['file'] or
not grass.find_file(coefbh)['file'] or not grass.find_file(coefdh)['file']:
      grass.fatal(_("Raster map <%a> not found.") % input

    # Define outputs!
    beam_rad = 'beam' + str(day)
    diff_rad = 'diffuse' + str(day)
    glob_rad = 'global' + str(day)
    if duration and reflected:
      insol_time = 'insol_time' + str(day)
      refl_rad = 'reflected' + str(day)
      grass.run_command('r.sun', flags = 's', elevin = elevin, aspin =
aspin, slopein = slopein, linkein = linkein, albedo = albedo, coefbh =
coefbh, coefdh = coefdh, beam_rad = beam_rad, insol_time = insol_time,
diff_rad = diff_rad, refl_rad = refl_rad, glob_rad = glob_rad, day = day,
step = step)
    elif duration and not reflected:
      insol_time = 'insol_time' + str(day)
      grass.run_command('r.sun', flags = 's', elevin = elevin, aspin =
aspin, slopein = slopein, linkein = linkein, albedo = albedo, coefbh =
coefbh, coefdh = coefdh, beam_rad = beam_rad, insol_time = insol_time,
diff_rad = diff_rad, glob_rad = glob_rad, day = day, step = step)
    elif reflected and not duration:
      refl_rad = 'reflected' + str(day)
      grass.run_command('r.sun', flags = 's', elevin = elevin, aspin =
aspin, slopein = slopein, linkein = linkein, albedo = albedo, coefbh =
coefbh, coefdh = coefdh, beam_rad = beam_rad, diff_rad = diff_rad, refl_rad
= refl_rad, glob_rad = glob_rad, day = day, step = step)
    else:
      grass.run_command('r.sun', flags = 's', elevin = elevin, aspin =
aspin, slopein = slopein, linkein = linkein, albedo = albedo, coefbh =
coefbh, coefdh = coefdh, beam_rad = beam_rad, diff_rad = diff_rad, glob_rad
= glob_rad, day = day, step = step)

if __name__ == "__main__":
  options, flags = grass.parser()
  main()

__________________________________

After loading that into the appropriate directory:
C:\GRASS-64\scripts
and restarting GRASS, I enter the command "r.solar" into the command line.

The result is the following message:

<

Traceback (most recent call last):
  File "C:/GRASS-64/etc/wxpython/wxgui.py", line 473, in
OnRunCmd

self.goutput.RunCmd(cmd, switchPage=False)
  File "C:\GRASS-64\etc\wxpython\gui_modules\goutput.py",
line 354, in RunCmd

menuform.GUI().ParseCommand(cmdlist, parentframe=self)
  File "C:\GRASS-64\etc\wxpython\gui_modules\menuform.py",
line 1825, in ParseCommand

xml.sax.parseString(getInterfaceDescription(cmd[0]).decode(e
nc).split('\n',1)[1].replace('', '<?xml version="1.0"
encoding="utf-8"?>\n', 1).encode("utf-8"),
  File "C:\GRASS-64\etc\wxpython\gui_modules\menuform.py",
line 1764, in getInterfaceDescription

raise IOError, _("Unable to fetch interface description for
command '%s'.") % cmd
IOError
:
Unable to fetch interface description for command 'r.solar'.

__________________________________

I've tried this on two different computers, both with Windows 7. My belief
as to what the problem could be:
- I've put the file in the wrong directory
- I've got to somehow compile it before I can run it
- It's got to be imported somehow into the GRASS interface first
- My syntax is somehow all wrong
- I'm missing some component needed to initiate the GUI

Can somebody help me? I really need this for my thesis and, as always,
there's a lot of time pressure. I'd be immensely grateful to anyone who can
help me further. Thanks a lot!

Best regards,
Daniel Lee
--
View this message in context: http://osgeo-org.1803224.n2.nabble.com/Problem-with-running-Python-script-in-GRASS-tp5007296p5007296.html
Sent from the Grass - Users mailing list archive at Nabble.com.

LeeDaniel wrote:

I've written a Python script, doing my best to use the Python I know and
reverse engineer the python scripts I found in the Internet. As far as I can
tell, the script should be fine, although I naturally can't execute it
independently. My goal is to run it as a command from inside GRASS so that
the user can input the parameters through the GUI. I think GRASS recognizes
that the script is there but isn't able to generate the GUI.

After loading that into the appropriate directory:
C:\GRASS-64\scripts
and restarting GRASS, I enter the command "r.solar" into the command line.

The result is the following message:

Unable to fetch interface description for command 'r.solar'.

Windows, Python and 6.4 isn't the most reliable combination.

At a minimum, you need a fairly recent version of 6.5 to be able to
use Python scripts on Windows (the hacks required to get shell scripts
to work on Windows get in the way of running other scripts). 6.4.0-RC6
won't work (g.parser was updated, but lib/python wasn't).

You also need a "clean" Python install with the correct registry
entries, and you may need to hack the GRASS startup scripts (the
WinGRASS installer fails quite badly with regard to Python, and the
OSGeo4W installer fails even harder).

--
Glynn Clements <glynn@gclements.plus.com>

Hi everyone,

Just a quick status update:

Being so new to the whole GRASS scene (and the Open Source scene in the
first place) but wanting very much to work with these systems, I installed
Linux and had the difficulties I described above. As an answer to the
question if anything else happened when I tried to run a Python script using
GRASS 6.4: I listed everything that happened, sadly there was no further
information that the system gave me.

I've now learned a little bit about writing shell scripts and have
successfully translated the Python script into the shell format. Now it
seems to be running without problems. It's quite a large computation, but
right now it's going great in Linux.

My other question, though, is how to get newer versions of GRASS. I also
considered going over to GRASS 7, it seems to be planned to deal a lot
better with Python, but wasn't able to find it on the official GRASS page.
Did I just overlook it, or is it available through some other source? I
found some sources in the Internet but didn't quite trust them.

Best,
Daniel
--
View this message in context: http://osgeo-org.1803224.n2.nabble.com/Problem-with-running-Python-script-in-GRASS-tp5007296p5018865.html
Sent from the Grass - Users mailing list archive at Nabble.com.

LeeDaniel wrote:

My other question, though, is how to get newer versions of GRASS. I also
considered going over to GRASS 7, it seems to be planned to deal a lot
better with Python, but wasn't able to find it on the official GRASS page.
Did I just overlook it, or is it available through some other source? I
found some sources in the Internet but didn't quite trust them.

http://grass.osgeo.org/download/software.php

--
Glynn Clements <glynn@gclements.plus.com>