5 votos

Configuración del entorno de GRASS 7 para Python

Me gustaría utilizar algunas funcionalidades de GRASS desde un programa Python. Con GRASS 6 esto requería la configuración de varias variables de ambiente, como se detalla en el documento Wiki de GRASS .

Estoy intentando una configuración similar con GRASS 7, como en este ejemplo:

import os

os.environ['LC_ALL'] = "en_GB.UTF-8"
os.environ['GISBASE'] = "/usr/lib/grass70/"
os.environ['PATH'] = "$PATH:/usr/bin:$GISBASE/bin:$GISBASE/scripts"
os.environ['LD_LIBRARY_PATH'] = "$LD_LIBRARY_PATH:$GISBASE/lib"
# for parallel session management, we use process ID (PID) as lock file number:
os.environ['GIS_LOCK'] = "$$"
# path to GRASS settings file
os.environ['GISRC'] = "$HOME/.grass7"
os.environ['PYTHONPATH'] = "$PYTHONPATH:$GISBASE/etc/python"

import grass.script as grass
env = grass.gisenv()
print env
#List all environment variables
for key, value in os.environ.items(): print key, value 
#Print region extent
r = grass.read_command("g.region", flags='p' )
print r

Pero el resultado final es un ImportError :

Traceback (most recent call last):
  File "grass_test.py", line 13, in <module>
    import grass.script as grass
ImportError: No module named grass.script

La comprobación de sanidad básica muestra la biblioteca de scripts en la carpeta esperada:

$ ls -la /usr/lib/grass70/etc/python/grass
total 44
drwxr-xr-x 9 root root 4096 Mai  3 08:44 .
drwxr-xr-x 3 root root 4096 Jan  7 08:16 ..
drwxr-xr-x 2 root root 4096 Mai  3 08:44 exceptions
drwxr-xr-x 2 root root 4096 Mai  3 08:44 imaging
-rw-r--r-- 1 root root  151 Mai  1 21:46 __init__.py
-rw-r--r-- 1 root root  363 Mai  3 08:44 __init__.pyc
drwxr-xr-x 2 root root 4096 Mai  3 08:44 lib
drwxr-xr-x 2 root root 4096 Mai  3 08:44 pydispatch
drwxr-xr-x 9 root root 4096 Mai  3 08:44 pygrass
drwxr-xr-x 2 root root 4096 Mai  3 08:44 script
drwxr-xr-x 2 root root 4096 Mai  3 08:44 temporal

¿Qué más hay que añadir a la configuración de este entorno?

Actualización : Lo intenté la configuración sugerida por Gene pero produce el mismo ImportError excepción:

import os

os.environ['GISBASE'] = "/usr/lib/grass70/"
os.environ['PYTHONPATH'] = "${PYTHONPATH}:$GISBASE/etc/python/"
os.environ['LD_LIBRARY_PATH'] = "$LD_LIBRARY_PATH:$GISBASE/lib"
os.environ['GIS_LOCK'] = "$$"
os.environ['GISRC'] = "$HOME/.grass7/rc"

import grass.script as grass

4voto

GreyCat Puntos 146

Yo uso este

export GISBASE="path_to_your GISBASE"
export PYTHONPATH="${PYTHONPATH}:$GISBASE/etc/python/"
export LD_LIBRARY_PATH="$LD_LIBRARY_PATH:$GISBASE/lib"
export GIS_LOCK=$$
export GISRC="/path_to/.grass7/rc"

A continuación, con Python

import grass.script.setup as gsetup
gisbase = os.environ['GISBASE']
gisdb="path_to_your_GISDBASE"
location="Geol"
mapset="test"
gsetup.init(gisbase, gisdb, location, mapset)
import grass.script as grass
# region extent
d = grass.parse_command('g.region', flags='p')
# d is a Python dictionary
print d
{'ellipsoid:  international': None, 'zone: ': None, 'east:       231750.54768451': None, 'cols:       456': None, 'nsres:      10.0010371': None, 'north:      125744.93437974': None, 'rows:       302': None, 'projection: 99 (Lambert Conformal Conic)': None, 'west:       227192.86784828': None, 'cells:      137712': None, 'ewres:      9.99491192': None, 'datum:      bel72': None, 'south:      122724.62117483': None}

Pero es más fácil con el nuevo PyGRASS

from grass.pygrass.gis.region import Region
reg = Region()
print reg.items
[(u'proj', 99), (u'zone', 0), (u'north', 125744.93437974), (u'south', 122724.62117483), (u'west', 227192.86784828), (u'east', 231750.54768451), (u'top', 284.0), (u'bottom', 156.0), (u'nsres', 10.001037102351026), (u'ewres', 9.994911921557025), (u'tbres', 1.0), (u'rows', 302), (u'cols', 456), (u'cells', 137712)]
print reg.keys()
[u'proj', u'zone', u'north', u'south', u'west', u'east', u'top', u'bottom', u'nsres', u'ewres', u'tbres', u'rows', u'cols', u'cells']
print reg.east
231750.547685
....
print reg.get_bbox()
Bbox(125744.93438, 122724.621175, 231750.547685, 227192.867848)

3voto

Eyal Puntos 188

Una vez que se ejecuta un script python, los cambios en las variables de entorno ya no surten efecto. Se configuran justo antes del tiempo de ejecución y el intérprete no las actualizará después. PYTHONPATH puede actualizarse mediante el método sys.path.append() y eso es todo.

Una solución es volver a ejecutar el script después de configurar el entorno. De esta forma el intérprete recarga el entorno antes de iniciar el script por segunda vez:

import os, sys

if 'LD_LIBRARY_PATH' not in os.environ:
    os.environ['GISBASE'] = "/usr/lib/grass70"
    sys.path.append(os.environ['GISBASE'] + "/etc/python/")
    os.environ["LD_LIBRARY_PATH"] = os.environ['GISBASE'] + "/lib"
    os.environ['GIS_LOCK'] = "$$"
    os.environ['GISRC'] = os.environ["HOME"] + "/.grass7/rc"
    try:
        os.execv(sys.argv[0], sys.argv)
    except Exception, exc:
        print 'Failed re-exec:', exc
        sys.exit(1)

import grass.script as grass

1voto

artificer Puntos 3

i-Ciencias.com

I-Ciencias es una comunidad de estudiantes y amantes de la ciencia en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros usuarios, hacer tus propias preguntas o resolver las de los demás.

Powered by:

X