[GRASS-user] issues with grass python script running outside grass without defined location

Thanks Vaclav for your help with the python script running outside grass when location is predefined. I am using an example posted in the case of no existing location and the following error came up…

alassane@alassane-MS-7593:~/Programs/grass/pythongrass$ /home/alassane/Programs/grass/pythongrass/grass_noloc.py
File “/home/alassane/Programs/grass/pythongrass/grass_noloc.py”, line 62
else:
^
SyntaxError: invalid syntax

The program works when I comment the followings statements

define GRASS DATABASE

if sys.platform.startswith(‘win’):
gisdb = os.path.join(os.getenv(‘APPDATA’, ‘grassdata’)
else:

gisdb = os.path.join(os.getenv(‘HOME’, ‘grassdata’)

gisdb = os.path.join(os.getenv(‘/home/alassane/Data’, ‘grassdata’)

instruction do not work

Here is the posted code used… Again your help is appreciated.

Alassane

#!/usr/bin/env python

Python script to generate a new GRASS GIS 7 location simply from metadata

Markus Neteler, 2014

?? LINUX USAGE: First set LIBRARY SEARCH PATH

#export LD_LIBRARY_PATH=$(grass70 --config path)/lib
#python start_grass7_create_new_location_ADVANCED.py

some predefined variables

Linux

grass7bin = ‘grass70’

#myepsg = ‘4326’ # latlong
myepsg = ‘3044’ # ETRS-TM32, http://spatialreference.org/ref/epsg/3044/
#myfile = ‘/home/neteler/markus_repo/books/kluwerbook/data3rd/lidar/lidar_raleigh_nc_spm.shp’
myfile = ‘/home/alassane/Data/IPDSData/lc80400372013110lgn01_prod_ll.tif’
#myfile = r’C:\Dati\Padergnone\square_p95.tif’

###########
import os
import sys
import subprocess
import shutil
import binascii
import tempfile

########### SOFTWARE

we assume that the GRASS GIS start script is available and in the PATH

query GRASS 7 itself for its GISBASE

startcmd = grass7bin + ’ --config path’

p = subprocess.Popen(startcmd, shell=True,
stdout=subprocess.PIPE, stderr=subprocess.PIPE)
out, err = p.communicate()
if p.returncode != 0:
print >>sys.stderr, ‘ERROR: %s’ % err
print >>sys.stderr, “ERROR: Cannot find GRASS GIS 7 start script (%s)” % startcmd
sys.exit(-1)
if sys.platform.startswith(‘linux’):
gisbase = out.strip(‘\n’)
elif sys.platform.startswith(‘win’):
if out.find(“OSGEO4W home is”) != -1:
gisbase = out.strip().split(‘\n’)[1]
else:
gisbase = out.strip(‘\n’)
os.environ[‘GRASS_SH’] = os.path.join(gisbase, ‘msys’, ‘bin’, ‘sh.exe’)

Set GISBASE environment variable

os.environ[‘GISBASE’] = gisbase

define GRASS-Python environment

gpydir = os.path.join(gisbase, “etc”, “python”)
sys.path.append(gpydir)
########

define GRASS DATABASE

if sys.platform.startswith(‘win’):
gisdb = os.path.join(os.getenv(‘APPDATA’, ‘grassdata’)
else:

gisdb = os.path.join(os.getenv(‘HOME’, ‘grassdata’)

gisdb = os.path.join(os.getenv(‘/home/alassane/Data’, ‘grassdata’)

instruction do not work

override for now with TEMP dir

gisdb = os.path.join(tempfile.gettempdir(), ‘grassdata’)
try:
os.stat(gisdb)
except:
os.mkdir(gisdb)

location/mapset: use random names for batch jobs

string_length = 16
location = binascii.hexlify(os.urandom(string_length))
mapset = ‘PERMANENT’
location_path = os.path.join(gisdb, location)

Create new location (we assume that grass7bin is in the PATH)

from EPSG code:

#startcmd = grass7bin + ’ -c epsg:’ + myepsg + ’ -e ’ + location_path

from SHAPE or GeoTIFF file

startcmd = grass7bin + ’ -c ’ + myfile + ’ -e ’ + location_path

print startcmd
p = subprocess.Popen(startcmd, shell=True,
stdout=subprocess.PIPE, stderr=subprocess.PIPE)
out, err = p.communicate()
if p.returncode != 0:
print >>sys.stderr, ‘ERROR: %s’ % err
print >>sys.stderr, ‘ERROR: Cannot generate location (%s)’ % startcmd
sys.exit(-1)
else:
print ‘Created location %s’ % location_path

Now the location with PERMANENT mapset exists.

########

Now we can use PyGRASS or GRASS Scripting library etc. after

having started the session with gsetup.init() etc

Set GISDBASE environment variable

os.environ[‘GISDBASE’] = gisdb

Linux: Set path to GRASS libs (TODO: NEEDED?)

path = os.getenv(‘LD_LIBRARY_PATH’)
dir = os.path.join(gisbase, ‘lib’)
if path:
path = dir + os.pathsep + path
else:
path = dir
os.environ[‘LD_LIBRARY_PATH’] = path

language

os.environ[‘LANG’] = ‘en_US’
os.environ[‘LOCALE’] = ‘C’

Import GRASS Python bindings

import grass.script as grass
import grass.script.setup as gsetup

###########

Launch session and do something

gsetup.init(gisbase, gisdb, location, mapset)

say hello

grass.message(‘— GRASS GIS 7: Current GRASS GIS 7 environment:’)
print grass.gisenv()

do something in GRASS now…

grass.message(‘— GRASS GIS 7: Checking projection info:’)
in_proj = grass.read_command(‘g.proj’, flags = ‘jf’)

selective proj parameter printing

kv = grass.parse_key_val(in_proj)
print kv
print kv[‘+proj’]

print full proj parameter printing

in_proj = in_proj.strip()
grass.message(“— Found projection parameters: ‘%s’” % in_proj)

show current region:

grass.message(‘— GRASS GIS 7: Checking computational region info:’)
in_region = grass.region()
grass.message(“— Computational region: ‘%s’” % in_region)

do something else: r.mapcalc, v.rectify, …

Finally remove the temporary batch location from disk

print ‘Removing location %s’ % location_path
shutil.rmtree(location_path)

sys.exit(0)

Hi again Alassane!

On Wed, Jun 1, 2016 at 7:41 PM, alassane toure <atourej@gmail.com> wrote:

alassane@alassane-MS-7593:~/Programs/grass/pythongrass$
/home/alassane/Programs/grass/pythongrass/grass_noloc.py
  File "/home/alassane/Programs/grass/pythongrass/grass_noloc.py", line 62
    else:
       ^
SyntaxError: invalid syntax

The program works when I comment the followings statements

# define GRASS DATABASE
if sys.platform.startswith('win'):
    gisdb = os.path.join(os.getenv('APPDATA', 'grassdata')
else:

From looking at the code, it seems that the closing parentheses is missing

in the os.getenv() function call.

I'm not sure which code you are using and also where your data actually
are. APPDATA is not common for grassdata directory but should work of
course if it is what you want. Anyway, this is what the documentation [1]
suggests:

gisdb = os.path.join(os.path.expanduser("~"), "grassdata")

(and usually modifying for MS Windows with `os.path.expanduser("~"),
,"Documents", "grassdata"`.

Hope this helps,
Vaclav

PS: Please note you have grass-dev-request@lists.osgeo.org mailing list in
your To field. I don't think you want that (I'm not sure what would be the
reason). You can of course subscribe to grass-dev@lists.osgeo.org if you
want to discuss some development of GRASS GIS!

[1]
https://grass.osgeo.org/grass70/manuals/libpython/script.html#module-script.setup