Hi Stefan,
I have been meaning to implement something like this too and got your example to work with the additional step of setting the environment variable GRASS_ADDON_PATH (and under unix setting the permissions). Here is my example just parsing the first mapset it finds:

import os, tempfile, stat
import grass.script as grass

module = 'subbasins.py'

if __name__=='__main__':
    answer = grass.mapsets(search_path = True)
    available_mapsets = grass.mapsets()

    script=file(module,'r').read()

    with tempfile.NamedTemporaryFile(delete = False) as s:
        s.write('''#!/usr/bin/env python
# -*- coding: utf-8 -*-

{script}

#%Option
#% key:{option}
#%end

'''.format(script=script,option=available_mapsets[0].lower()))

    startcmd = 'python '+s.name
    # set env variable
    aoev='GRASS_ADDON_PATH'
    tmpdir = os.path.basename(s.name)
    if aoev in os.environ:
        os.environ[aoev]=[tmpdir]+os.environ[aoev]
    else:
        os.environ[aoev]=[tmpdir]
    # set permissions
    os.chmod(s.name, os.stat(s.name).st_mode | stat.S_IEXEC)
    # start module
    os.system(startcmd)
    os.remove(s.name)

Let me know if this works under Windows too.
Michel

On 10/12/2015 12:55 PM, Blumentrath, Stefan wrote:

Hi again,

Now I found out that the parser section in the inner python script was not formated properly.

However, when I now call the inner script with ‘--ui’ I get an error:

Unable to fetch interface description for command ‘tmpjksdfjiol’

Details:

Try to set up GRASS_ADDON_PATH or GRASS_ADDON_BASE variable.

It was neither possible to run the script using grass.run_command() (on Windows).

Cheers

Stefan

*From:*grass-dev [mailto:grass-dev-boun...@lists.osgeo.org] *On Behalf Of *Blumentrath, Stefan
*Sent:* 12. oktober 2015 11:36
*To:* GRASS developers list (grass-dev@lists.osgeo.org) <grass-dev@lists.osgeo.org>
*Subject:* [GRASS-dev] Using a dynamic text in module header for parser

Hi,

I would like to fill:

#% options:

and

#% answer

in a parser option for a python script dynamically. In particular I want to have tickboxes for available mapsets in the module GUI…

Meaning something like this  (but less complex / not interactive):

http://permalink.gmane.org/gmane.comp.gis.grass.gui/667

My amateur programming skills do unfortunately not allow me to really understand how to accomplish what Glynn describes in the post above…

I tried to generate and run a temporary python script from within my script like this:

def main():

    answer = grass.mapsets(search_path = True)

    available_mapsets = str(grass.mapsets())

    with tempfile.NamedTemporaryFile(delete = False) as s:

        s.write(''' #!/usr/bin/env python

# -*- coding: utf-8 -*-

# Here comes the full module with header for the parser

#% options: ''' + str(','.join(available_mapsets))

…

’’’)

    startcmd = 'python ' + s.name

    os.system(startcmd)

    os.remove(s.name)

But that way the GUI never starts, when I call the outer script from GRASS and it seems that option never get parsed…

Any hints how to proceed?

Thanks for helping in advance.

Stefan



_______________________________________________
grass-dev mailing list
grass-dev@lists.osgeo.org
http://lists.osgeo.org/mailman/listinfo/grass-dev

_______________________________________________
grass-dev mailing list
grass-dev@lists.osgeo.org
http://lists.osgeo.org/mailman/listinfo/grass-dev

Reply via email to