<html><body style="word-wrap: break-word; -webkit-nbsp-mode: space; -webkit-line-break: after-white-space; "><div><div><div><div>My requirement is to connect to GRASS from PostgreSQL9.1/PostGIS2.0 via the pg-python or plpythonu procedural language.   I'm wondering whether I have a permissions issue?</div><div><br></div><div>I'm running my stack on Ubuntu 12.04 LTS</div><div>I've  added the following environmental variables to /etc/bash.bashrc</div><div><pre class="prettyprint"><font class="Apple-style-span" face="Arial">export GISBASE=/usr/local/grass-6.4.3svn
export PATH=$PATH:$GISBASE/bin:$GISBASE/scripts:$GISBASE/lib
export PYTHONPATH=${PYTHONPATH}:$GISBASE/etc/python/
export PYTHONPATH=${PYTHONPATH}:$GISBASE/etc/python/grass
export PYTHONPATH=${PYTHONPATH}:$GISBASE/etc/python/grass/script
export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:$GISBASE/lib
export GIS_LOCK=$$
export GISRC=$HOME/.grassrc6
</font></pre><div><font class="Apple-style-span" face="Arial"><div style="white-space: pre;"><br></div></font></div></div><div>If I log out and log in again, the following environment variables are now available to the postgres user:</div><div><div><br></div><div>ubuntu@ip-10-252-74-140:~$ sudo su postgres</div><div>postgres@ip-10-252-74-140:/home/ubuntu$ echo $GISBASE</div><div>/usr/local/grass-6.4.3svn</div></div><div>postgres@ip-10-252-74-140:/home/ubuntu$ echo $PYTHONPATH</div><div><div>:/usr/local/grass-6.4.3svn/etc/python/:/usr/local/grass-6.4.3svn/etc/python/grass:/usr/local/grass-6.4.3svn/etc/python/grass/script</div></div><div><div>postgres@ip-10-252-74-140:/home/ubuntu$ echo $HOME</div><div>/var/lib/postgresql</div></div><div><br></div><div><br></div><div>if I call the function "import grass.script as grass" from the python console, there is no error.   All seems ok.</div></div></div></div><div><br></div><div><div>postgres@ip-10-252-74-140:/$ python</div><div>Python 2.7.3 (default, Apr 20 2012, 22:39:59) </div><div>[GCC 4.6.3] on linux2</div><div>Type "help", "copyright", "credits" or "license" for more information.</div><div>>>> import grass.script as grass</div><div>>>> </div></div><div><br></div><div>If I now log into PostgreSQL/PostGIS via psql, and try to run the same command within in a postgresql plpythonu or pg-python function, I get the following error messages.</div><div>psql -d test</div><div><br></div><div>CREATE OR REPLACE FUNCTION pythontest() RETURNS text AS</div><div><div><div>$$</div><div>import grass.script as grass</div><div>$$</div><div>LANGUAGE 'plpythonu' VOLATILE;</div></div></div><div><br></div><div>test=# select pythontest();</div><div><div><div>ERROR:  ImportError: No module named grass.script</div><div>CONTEXT:  Traceback (most recent call last):</div><div>  PL/Python function "pythontest", line 3, in <module></div><div>    import grass.script as grass</div><div>PL/Python function "pythontest"</div><div>test=# </div></div></div><div><br></div><div>I've also tried the pg-python language - in case it had something to do with plpythonu:</div><div><br></div><div><div><div><div>CREATE OR REPLACE FUNCTION pgpython_test()</div><div>RETURNS text LANGUAGE python AS</div><div>$python$</div><div>import Postgres</div><div>import grass.script as grass</div><div>def main():</div><div>    return ("Hello World")</div><div>$python$;</div></div></div></div><div><br></div><div><br></div><div><div><div><div><div>test=# select pgpython_test();</div><div>ERROR:  could not load Python function's module object</div><div>CONTEXT:  [exception from Python]</div><div>Traceback (most recent call last):</div><div>   File "public.pgpython_test()", line 3, in <module></div><div> ImportError: No module named grass.script</div><div><br></div><div>[public.pgpython_test() while loading function module]</div><div>test=# </div></div></div></div></div><div><br></div><div>I can however access GRASS from PostgreSQL9.1/PostGIS2.0 via pl/r and R.  For example, this function works...</div><div><pre class="prettyprint prettify"><font class="Apple-style-span" face="Arial">CREATE OR REPLACE FUNCTION generate_viewshed() RETURNS text as 
$$
library(spgrass6)
#initialise GRASS.
initGRASS(gisBase = “/usr/local/grass-6.4.3svn/”, home = tempdir(), gisDbase = “/usr/local/share/grassdata/”, location = “aust_dem_1sec_wgs84″, mapset = “postgres”, SG=”aust_dem_1sec”, override = TRUE)
#define the computational region for the analysis – limiting the region to an area slightly greater than the max_distance from the observation point.
execGRASS(“g.region”, parameters = list(n=”-34.9759927736275″, s=”-34.9985728860995″, e=”138.641896696527″, w=”138.619947232807″, align=”aust_dem_1sec”))
#run the viewshed module – all of these parameters can be set dynamically and parsed as plr function arguments – the output is a raster file.
execGRASS(“r.viewshed”, parameters = list(input = “aust_dem_1sec”, output = “viewshed_raster”, coordinate = “138.630922,-34.987283″, obs_elev = 25, max_dist = 1000), flags = c(“b”, “overwrite”)) 
#convert the raster output to a vector.
execGRASS(“r.to.vect”, parameters = list(input = “viewshed_raster”, output = “viewshed_vector”, feature = “area”), flags = c(“overwrite”)) 
#write the vector data back to PostGIS.
execGRASS(“v.out.ogr”, parameters = list(input = “viewshed_vector”, dsn = “PG:host=localhost dbname=test user=postgres password=password”, olayer = “viewshed_vector”, format = “PostgreSQL”, type = “area”), flags = c(“c”)) 
$$
LANGUAGE ‘plr’;</font></pre><div><font class="Apple-style-span" face="Arial"><br></font></div></div><div><font class="Apple-style-span" face="Arial">In terms of GRASS permissions...</font></div><div><pre class="prettyprint"><font class="Apple-style-span" face="Arial"><div style="font-family: Helvetica; white-space: normal; "><pre class="prettyprint"><font class="Apple-style-span" face="Arial">postgres@ip-10-252-74-140:/home/ubuntu$ vi $HOME/.grassrc6
</font></pre></div><div style="font-family: Helvetica; white-space: normal; "><span class="Apple-style-span" style="font-family: Arial; ">GISDBASE: /usr/local/share/grassdata</span></div><div style="font-family: Helvetica; white-space: normal; "><font class="Apple-style-span" face="Arial"><div>LOCATION_NAME: aust_dem_1sec_wgs84</div><div>MAPSET: postgres</div><div>GRASS_GUI: text</div><div>~                  </div><div><br></div><div>This is as far as I've got and need some help to connect to GRASS from PostgeSQL/PostGIS via python (as an alternative to pl/r).</div></font></div></font></pre></div><div>Is there something obvious I have missed?  Could someone please guide me through to a solution.</div><div><br></div><div>With thanks and regards</div><div><br></div><div>Mark</div><div><br></div><div><br></div><div><br></div><div><br></div><div><br></div><div><br></div><div><br></div><div><br></div><div><br></div><div><br></div><div><br></div><div><br></div><div><br></div><div><br></div><div><br></div><div><br></div><div><br></div><div><br></div><div><br></div><div><br></div><div><br></div></body></html>