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

LeeDaniel Lee.Daniel.1986 at gmail.com
Wed May 5 01:17:16 EDT 2010


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.


More information about the grass-user mailing list