Vous êtes sur la page 1sur 9

GRASS and Python - GRASS-Wiki

http://grasswiki.osgeo.org/wiki/GRASS_and_Python

GRASS and Python


From GRASS-Wiki

Contents
1 Python SIGs 2 Writing Python scripts in GRASS 2.1 Python script editor 2.2 Using the GRASS Python Scripting Library 2.3 Creating Python scripts that call GRASS functionality from outside 2.3.1 MS-Windows 2.3.2 Linux 2.4 Running external commands from Python 2.5 Testing and installing Python extensions 2.5.1 Debugging 2.5.2 Installation 3 Python extensions in GRASS GIS 3.1 Python Scripting Library 3.2 pygrass Library 3.3 Python Ctypes Interface 3.4 wxPython GUI development 3.5 Python-GRASS add-ons 3.6 Using GRASS gui.tcl in Python 4 FAQ 5 Links 5.1 General guides 5.2 Programming 5.3 Presentations 5.4 References

Python SIGs
Python Special Interest Groups are focused collaborative efforts to develop, improve, or maintain specific Python resources. Each SIG has a charter, a coordinator, a mailing list, and a directory on the Python website. SIG membership is informal, defined by subscription to the SIG's mailing list. Anyone can join a SIG, and participate in the development discussions via the SIG's mailing list. Below is the list of currently active Python SIGs, with links to their resources. See more at http://www.python.org/community/sigs/

Writing Python scripts in GRASS


Python is a programming language which is more powerful than shell scripting but easier and more forgiving than C. The Python script can contain simple module description definitions which will be processed with g.parser (http://grass.osgeo.org/grass64/manuals/g.parser.html) , as shown in the example

1 de 9

31/07/2013 21:58

GRASS and Python - GRASS-Wiki

http://grasswiki.osgeo.org/wiki/GRASS_and_Python

below. In this way with no extra coding a GUI can be built, inputs checked, and a skeleton help page can be generated automatically. In addition it adds links to the GRASS message translation system. The library for "scripting" is "grass.script", typically used as:
import grass.script as grass

The related files are at $GISBASE/etc/python/grass/script/*.py. See below for more details. Note: For code which needs access to the power of C, you can access the GRASS C library functions via the Python "ctypes" interface.

Python script editor


The wxGUI Layer Manager in GRASS 6.4.3+ comes with a "Python shell" which enables users to type and execute python commands directly in wxGUI environment.

Using the GRASS Python Scripting Library


You can run Python scripts easily in a GRASS session. To write these scripts, check the code in lib/python/ which provides grass.script in order to support GRASS scripts written in Python.
See the GRASS Python Scripting Library for notes and examples.

The scripts/ directory of GRASS contains a series of examples actually provided to the end users. For the desired Python code style, have a look at SUBMITTING_PYTHON (http://trac.osgeo.org/grass /browser/grass/trunk/SUBMITTING_PYTHON) .

Creating Python scripts that call GRASS functionality from outside


Note: This is a more advanced use case of using GRASS' functionality from outside via Python. Commonly,

2 de 9

31/07/2013 21:58

GRASS and Python - GRASS-Wiki

http://grasswiki.osgeo.org/wiki/GRASS_and_Python

a user will run GRASS Python script from inside a GRASS session, i.e. either from the command line or from the Python shell embedded in the wxGUI (screenshot). For calling GRASS functionality from outside, see also Working with GRASS without starting it explicitly. MS-Windows In order to use GRASS functionality via Python from outside, some environment variables have to be set:

GISBASE= C:\GRASS-64 GISRC= C:\Documents and Settings\user\.grassrc6 LD_LIBRARY_PATH= C:\GRASS-64\lib PATH= C:\GRASS-64\etc;C:\GRASS-64\etc\python;C:\GRASS-64\lib;C:\GRASS-64\bin;C:\GRASS-64\extralib;C:\GRASS-64\msys\bi PYTHONLIB= C:\Python26 PYTHONPATH= C:\GRASS-64\etc\python GRASS_SH= C:\GRASS-64\msys\bin\sh.exe

Some hints: 1. The ".grassrc6" file listed above must exist. Run GRASS one time interactively to create it or see below for how to writing it 2. The Python interpreter (python.exe) needs to be in the PATH 3. Python needs to be associated with the .py extension 4. PATHEXT needs to include .py if you want to be able to omit the extension 5. PYTHONPATH needs to be set to %GISBASE%\etc\python Points 2-4 should be taken care of by the Python installer. 5 needs to be done by the startup (currently, this doesn't appear to be the case on MS-Windows). Alternatively to run GRASS interactively, you can also create the ".grassrc6" file yourself, e.g. (update to existing directory for "grassdata"):
GISDBASE: C:\Documents and Settings\user\grassdata LOCATION_NAME: nc_spm_08 MAPSET: user1 GRASS_DB_ENCODING: ascii

It doesn't matter what the file is called, so long as %GISRC% points to it and it contains the necessary settings. The normal location for GRASS 6.x on Windows is:
%APPDATA%\GRASS6\grassrc6

On Windows 7, a typical setting for %APPDATA% is


C:\Users\<username>\AppData\Roaming

Linux In order to use GRASS functionality via Python from outside, some environment variables have to be set:
export GISBASE="/usr/local/grass-6.4.svn/"

3 de 9

31/07/2013 21:58

GRASS and Python - GRASS-Wiki

http://grasswiki.osgeo.org/wiki/GRASS_and_Python

export PATH="$PATH:$GISBASE/bin:$GISBASE/scripts" export LD_LIBRARY_PATH="$LD_LIBRARY_PATH:$GISBASE/lib" # for parallel session management, we use process ID (PID) as lock file number: export GIS_LOCK=$$ # path to GRASS settings file export GISRC="$HOME/.grassrc6" export PYTHONPATH="$PYTHONPATH:$GISBASE/etc/python"

Running external commands from Python


For information on running external commands from Python, see: http://docs.python.org/lib/modulesubprocess.html Avoid using the older os.* functions. Section 17.1.3 lists equivalents using the Popen() interface, which is more robust (particularly on Windows).

Testing and installing Python extensions


Debugging Make sure the script is executable:
chmod +x /path/to/my.extension.py

During development, a Python script can be debugged using the Python Debugger (pdb):
python -m pdb /path/to/my.extension.py input=my_input_layer output=my_output_layer option=value -f

Installation Once you're happy with your script, you can put it in the scripts/ folder of your GRASS install. To do so, first create a directory named after your extension, then create a Makefile for it, and a HTML man page:
cd /path/to/grass_src/ cd scripts ls # It is useful to check out the existing scripts and their structure mkdir my.extension cd my.extension cp path/to/my.extension.py . touch my.extension.html touch Makefile

Next step is to edit the Makefile. It is a very simple text file, the only thing to check is to put the right extension name (WITHOUT the .py file extension) after PGM:
MODULE_TOPDIR = ../.. PGM = my.extension include $(MODULE_TOPDIR)/include/Make/Script.make default: script

The HTML file would be generated automatically. If you want to add more precisions in it, you can do it (just make sure you start at DESCRIPTION. See existing scripts.)

4 de 9

31/07/2013 21:58

GRASS and Python - GRASS-Wiki

http://grasswiki.osgeo.org/wiki/GRASS_and_Python

You can then run "make" within the my.extension folder. Running "make" in the extension directory places the resulting files in the staging directory (path/to/grass_src/dist.<YOUR_ARCH>/). If you're running GRASS from the staging directory (/path/to/grass_src/bin.<YOUR_ARCH>/grass7), subsequent commands will used the updated files.
# in your extension directory (/path/to/grass_src/scripts/my.extension/) make # Starting GRASS from the staging directory /path/to/grass_src/bin.<YOUR_ARCH>/grass7 my.extension help

You can also run "make install" from the top level directory of your GRASS install (say /usr/local /src/grass_trunk/). Running "make install" from the top level just copies the whole of the dist.<YOUR_ARCH>/ directory to the installation directory (e.g. /usr/local/grass70) and the bin.<YOUR_ARCH>/grass70 bin file to the bin directory (e.g. /usr/local/bin), and fixes any embedded paths in scripts and configuration files.
cd /path/to/grass_src make install # Starting GRASS as usual would work and show your extension available grass7 my.extension help

Python extensions in GRASS GIS


Python Scripting Library
See GRASS Python Scripting Library

pygrass Library
See pygrass

Python Ctypes Interface


This interface allows calling GRASS library functions from Python scripts. See Python Ctypes Examples for details. Examples: GRASS 7: raster (http://trac.osgeo.org/grass/browser/grass/trunk/doc/python /raster_example_ctypes.py) , vector (http://trac.osgeo.org/grass/browser/grass/trunk/doc/python /vector_example_ctypes.py) example Latest and greatest: GRASS 7 Python scripts (http://trac.osgeo.org/grass/browser/grass/trunk/scripts) More complicated examples <<-- TODO: update to Ctypes Sample script for GRASS 6 raster access (use within GRASS, Spearfish session):
#!/usr/bin/env python ## TODO: update example to Ctypes import os, sys

5 de 9

31/07/2013 21:58

GRASS and Python - GRASS-Wiki

http://grasswiki.osgeo.org/wiki/GRASS_and_Python

from grass.lib import grass if "GISBASE" not in os.environ: print "You must be in GRASS GIS to run this program." sys.exit(1) if len(sys.argv)==2: input = sys.argv[1] else: input = raw_input("Raster Map Name? ") # initialize grass.G_gisinit('') # find map in search path mapset = grass.G_find_cell2(input, '') # determine the inputmap type (CELL/FCELL/DCELL) */ data_type = grass.G_raster_map_type(input, mapset) infd = grass.G_open_cell_old(input, mapset) inrast = grass.G_allocate_raster_buf(data_type) rown = 0 while True: myrow = grass.G_get_raster_row(infd, inrast, rown, data_type) print rown, myrow[0:10] rown += 1 if rown == 476: break grass.G_close_cell(inrast) grass.G_free(cell)

Sample script for vector access (use within GRASS, Spearfish session):
#!/usr/bin/python # # # # # # # run within GRASS Spearfish session run this before starting python to append module search path: export PYTHONPATH=/usr/src/grass70/swig/python check with "import sys; sys.path" or: sys.path.append("/usr/src/grass70/swig/python") FIXME: install the grass bindings in $GISBASE/lib/ ?

import os, sys from grass.lib import grass from grass.lib import vector as grassvect if "GISBASE" not in os.environ: print "You must be in GRASS GIS to run this program." sys.exit(1) if len(sys.argv)==2: input = sys.argv[1] else: input = raw_input("Vector Map Name? ") # initialize grass.G_gisinit('') # find map in search path mapset = grass.G_find_vector2(input,'') # define map structure map = grassvect.Map_info()

6 de 9

31/07/2013 21:58

GRASS and Python - GRASS-Wiki

http://grasswiki.osgeo.org/wiki/GRASS_and_Python

# define open level (level 2: topology) grassvect.Vect_set_open_level (2) # open existing map grassvect.Vect_open_old(map, input, mapset) # query print 'Vect map: ', input print 'Vect is 3D: ', grassvect.Vect_is_3d (map) print 'Vect DB links: ', grassvect.Vect_get_num_dblinks(map) print 'Map Scale: 1:', grassvect.Vect_get_scale(map) print 'Number of areas:', grassvect.Vect_get_num_areas(map) # close map grassvect.Vect_close(map)

wxPython GUI development


See the wxGUI wiki page

Python-GRASS add-ons
Stand-alone addons: Jchym epick's PyWPS, GRASS-Web Processing Service (http://pywps.wald.intevation.org)

Using GRASS gui.tcl in Python


Here is some example code to use the grass automatically generated guis in python code. This could (should) all be bundled up and abstracted away so that the implementation can be replaced later.
import Tkinter import os # Startup (once): tk = Tkinter.Tk() tk.eval ("wm withdraw .") tk.eval ("source $env(GISBASE)/etc/gui.tcl") # Here you could do various things to change what the gui does # See gui.tcl and README.GUI # Make a gui (per dialog) # This sets up a window for the command. # This can be different to integrate with tkinter: tk.eval ('set path ".dialog$dlg"') tk.eval ('toplevel .dialog$dlg') # Load the code for this command: fd = os.popen ("d.vect --tcltk") gui = fd.read() # Run it tk.eval(gui) dlg = tk.eval('set dlg') # This is used later to get and set # Get the current command in the gui we just made: currentcommand = tk.eval ("dialog_get_command " + dlg) # Set the command in the dialog we just made: tk.eval ("dialog_set_command " + dlg + " {d.vect map=roads}")

FAQ
7 de 9 31/07/2013 21:58

GRASS and Python - GRASS-Wiki

http://grasswiki.osgeo.org/wiki/GRASS_and_Python

Q: Error message "execl() failed: Permission denied" - what to do? A: Be sure that the execute bit of the script is set.

Links
General guides
Wikibook Python Programming (http://en.wikibooks.org/wiki/Python_Programming/) Quick Python tutorial (http://www.poromenos.org/tutorials/python) for programmers of other languages More Python tutorials (http://wiki.python.org/moin/BeginnersGuide/Programmers) for programmers Python programming style guide (http://www.python.org/dev/peps/pep-0008/) Python Editors (http://wiki.python.org/moin/PythonEditors)

Programming
Python and GRASS: Library interfaces: [GRASS Python Scripting Library http://grass.osgeo.org/programming7 /pythonlib.html] Graphical user interface (GIU): [GRASS wxPython-based GUI http://grass.osgeo.org /programming7/wxpythonlib.html] PyWPS, GRASS-Web Processing Service: WPS Python and OSGeo: OSGeo Python Library (http://wiki.osgeo.org/wiki/OSGeo_Python_Library) Python and GDAL/OGR: Open Source Python GIS Hacks Mum'03 (http://mapserver.gis.umn.edu/community/conferences /MUM3/workshop/python) http://hobu.biz/software/OSGIS_Hacks - Python OSGIS Hacks '05 http://zcologia.com/news/categorylist_html?cat_id=8 http://www.perrygeo.net/wordpress/?p=4 Python bindings to PROJ: http://www.cdc.noaa.gov/people/jeffrey.s.whitaker/python/pyproj.html Python and GIS: Open Source GIS-Python Laboratory (http://gispython.org/) Python and Statistics: RPy (http://rpy.sourceforge.net/) - Python interface to the R-statistics programming language Bindings: SIP (C/C++ bindings generator) http://directory.fsf.org/all/Python-SIP.html Cython (http://www.cython.org/) - C-Extensions for Python (compile where speed is needed) Other external projects Scientific Python (http://www.scipy.org) Numeric and Scientific (http://wiki.python.org/moin/NumericAndScientific) Info on Python for Scientific Applications (http://w3.pppl.gov/~hammett/comp/python

8 de 9

31/07/2013 21:58

GRASS and Python - GRASS-Wiki

http://grasswiki.osgeo.org/wiki/GRASS_and_Python

/python.html)

Presentations
From FOSS4G2006: A Python sweeps in the GRASS (http://www.foss4g2006.org/materialDisplay.py?contribId=136& sessionId=48&materialId=slides&confId=1) - A. Frigeri 2006 GRASS goes web: PyWPS (http://www.foss4g2006.org/materialDisplay.py?contribId=67& sessionId=48&materialId=slides&confId=1) - J. Cepicky 2006 (see also WPS)

References
Zambelli, P., Gebbert, S., Ciolli, M., 2013. Pygrass: An Object Oriented Python Application Programming Interface (API) for Geographic Resources Analysis Support System (GRASS) Geographic Information System (GIS). ISPRS International Journal of Geo-Information 2, 201219. (DOI (http://dx.doi.org/10.3390/ijgi2010201) | PDF (http://www.mdpi.com/2220-9964/2/1/201/pdf) ) Retrieved from "http://grasswiki.osgeo.org/grass-wiki/index.php?title=GRASS_and_Python&oldid=18159" Categories: Development Linking to other languages Python This page was last modified on 27 March 2013, at 07:03. This page has been accessed 72,675 times. Content is available under GNU Free Documentation License 1.2.

9 de 9

31/07/2013 21:58

Vous aimerez peut-être aussi