[GRASS-SVN] r65448 - in grass/branches/releasebranch_7_0: . lib/python/script
svn_grass at osgeo.org
svn_grass at osgeo.org
Fri Jun 12 12:42:30 PDT 2015
Author: wenzeslaus
Date: 2015-06-12 12:42:30 -0700 (Fri, 12 Jun 2015)
New Revision: 65448
Added:
grass/branches/releasebranch_7_0/lib/python/script/setup.py
Removed:
grass/branches/releasebranch_7_0/lib/python/script/setup.py.sed
Modified:
grass/branches/releasebranch_7_0/
grass/branches/releasebranch_7_0/lib/python/script/Makefile
Log:
pythonlib: document and redo compilation in grass.setup (backport r65345, r65346, r65429)
Property changes on: grass/branches/releasebranch_7_0
___________________________________________________________________
Deleted: svn:mergeinfo
- /grass/trunk:64971,65076-65077,65096,65119,65190,65287,65289-65290,65336-65337,65438
Modified: grass/branches/releasebranch_7_0/lib/python/script/Makefile
===================================================================
--- grass/branches/releasebranch_7_0/lib/python/script/Makefile 2015-06-12 14:09:12 UTC (rev 65447)
+++ grass/branches/releasebranch_7_0/lib/python/script/Makefile 2015-06-12 19:42:30 UTC (rev 65448)
@@ -18,10 +18,12 @@
$(DSTDIR)/%: % | $(DSTDIR)
$(INSTALL_DATA) $< $@
-$(DSTDIR)/setup.py: $(OBJDIR)/setup.py | $(DSTDIR)
+EXTRA_CLEAN_FILES = setup.py.tmp
+
+$(DSTDIR)/setup.py: setup.py.tmp | $(DSTDIR)
$(INSTALL_DATA) $< $@
-$(OBJDIR)/setup.py: setup.py.sed | $(OBJDIR)
+setup.py.tmp: setup.py
sed \
-e 's#@LD_LIBRARY_PATH_VAR@#$(LD_LIBRARY_PATH_VAR)#' \
$< > $@
Copied: grass/branches/releasebranch_7_0/lib/python/script/setup.py (from rev 65345, grass/trunk/lib/python/script/setup.py)
===================================================================
--- grass/branches/releasebranch_7_0/lib/python/script/setup.py (rev 0)
+++ grass/branches/releasebranch_7_0/lib/python/script/setup.py 2015-06-12 19:42:30 UTC (rev 65448)
@@ -0,0 +1,191 @@
+"""Setup and initialization functions
+
+Function can be used in Python scripts to setup a GRASS environment
+without starting an actual GRASS session.
+
+Usage::
+
+ import os
+ import sys
+ import subprocess
+
+ # define GRASS Database
+ # add your path to grassdata (GRASS GIS database) directory
+ gisdb = os.path.join(os.path.expanduser("~"), "grassdata")
+ # the following path is the default path on MS Windows
+ # gisdb = os.path.join(os.path.expanduser("~"), "Documents/grassdata")
+
+ # specify (existing) Location and Mapset
+ location = "nc_spm_08"
+ mapset = "user1"
+
+ # path to the GRASS GIS launch script
+ # we assume that the GRASS GIS start script is available and on PATH
+ # query GRASS itself for its GISBASE
+ # (with fixes for specific platforms)
+ # needs to be edited by the user
+ grass7bin = 'grass70'
+ if sys.platform.startswith('win'):
+ # MS Windows
+ grass7bin = r'C:\OSGeo4W\bin\grass70.bat'
+ # uncomment when using standalone WinGRASS installer
+ # grass7bin = r'C:\Program Files (x86)\GRASS GIS 7.0.0\grass70.bat'
+ # this can be avoided if GRASS executable is added to PATH
+ elif sys.platform == 'darwin':
+ # Mac OS X
+ # TODO: this have to be checked, maybe unix way is good enough
+ grass7bin = '/Applications/GRASS/GRASS-7.0.app/'
+
+ # query GRASS GIS itself for its GISBASE
+ startcmd = [grass7bin, '--config', 'path']
+ try:
+ p = subprocess.Popen(startcmd, shell=False,
+ stdout=subprocess.PIPE, stderr=subprocess.PIPE)
+ out, err = p.communicate()
+ except OSError as error:
+ sys.exit("ERROR: Cannot find GRASS GIS start script"
+ " {cmd}: {error}".format(cmd=startcmd[0], error=error))
+ if p.returncode != 0:
+ sys.exit("ERROR: Issues running GRASS GIS start script"
+ " {cmd}: {error}"
+ .format(cmd=' '.join(startcmd), error=err))
+ gisbase = out.strip(os.linesep)
+
+ # set GISBASE environment variable
+ os.environ['GISBASE'] = gisbase
+
+ # define GRASS-Python environment
+ grass_pydir = os.path.join(gisbase, "etc", "python")
+ sys.path.append(grass_pydir)
+
+ # import (some) GRASS Python bindings
+ import grass.script as gscript
+
+ # launch session
+ rcfile = gscript.setup.init(gisbase, gisdb, location, mapset)
+
+ # example calls
+ gscript.message('Current GRASS GIS 7 environment:')
+ print gscript.gisenv()
+
+ gscript.message('Available raster maps:')
+ for rast in gscript.list_strings(type='raster'):
+ print rast
+
+ gscript.message('Available vector maps:')
+ for vect in gscript.list_strings(type='vector'):
+ print vect
+
+ # delete the rcfile
+ os.remove(rcfile)
+
+
+(C) 2010-2012 by the GRASS Development Team
+This program is free software under the GNU General Public
+License (>=v2). Read the file COPYING that comes with GRASS
+for details.
+
+ at author Martin Landa <landa.martin gmail.com>
+ at author Vaclav Petras <wenzeslaus gmail.com>
+"""
+
+# TODO: this should share code from lib/init/grass.py
+# perhaps grass.py can import without much trouble once GISBASE
+# is known, this would allow moving things from there, here
+# then this could even do locking
+
+import os
+import sys
+import tempfile as tmpfile
+
+
+def write_gisrc(dbase, location, mapset):
+ """Write the ``gisrc`` file and return its path."""
+ fd, gisrc = tmpfile.mkstemp()
+ os.write(fd, "GISDBASE: %s\n" % dbase)
+ os.write(fd, "LOCATION_NAME: %s\n" % location)
+ os.write(fd, "MAPSET: %s\n" % mapset)
+ os.close(fd)
+ return gisrc
+
+
+# TODO: there should be a function to do the clean up
+# (unset the GISRC and delete the file)
+def init(gisbase, dbase='', location='demolocation', mapset='PERMANENT'):
+ """Initialize system variables to run GRASS modules
+
+ This function is for running GRASS GIS without starting it
+ explicitly. No GRASS modules shall be called before call of this
+ function but any module or user script can be called afterwards
+ as if it would be called in an actual GRASS session. GRASS Python
+ libraries are usable as well in general but the ones using
+ C libraries through ``ctypes`` are not (which is caused by
+ library path not being updated for the current process
+ which is a common operating system limitation).
+
+ To create a (fake) GRASS session a ``gisrc`` file is created.
+ Caller is resposible for deleting the ``gisrc`` file.
+
+ Basic usage::
+
+ # ... setup GISBASE and PYTHON path before import
+ import grass.script as gscript
+ gisrc = gscript.setup.init("/usr/lib/grass64",
+ "/home/john/grassdata",
+ "nc_spm_08", "user1")
+ # ... use GRASS modules here
+ # remove the session's gisrc file to end the session
+ os.remove(gisrc)
+
+ :param gisbase: path to GRASS installation
+ :param dbase: path to GRASS database (default: '')
+ :param location: location name (default: 'demolocation')
+ :param mapset: mapset within given location (default: 'PERMANENT')
+ :returns: path to ``gisrc`` file (to be deleted later)
+ """
+ # TODO: why we don't set GISBASE?
+ mswin = sys.platform.startswith('win')
+ # define PATH
+ os.environ['PATH'] += os.pathsep + os.path.join(gisbase, 'bin')
+ os.environ['PATH'] += os.pathsep + os.path.join(gisbase, 'scripts')
+ if mswin: # added for winGRASS
+ os.environ['PATH'] += os.pathsep + os.path.join(gisbase, 'extrabin')
+
+ # add addons to the PATH
+ # copied and simplified from lib/init/grass.py
+ if mswin:
+ config_dirname = "GRASS7"
+ config_dir = os.path.join(os.getenv('APPDATA'), config_dirname)
+ else:
+ config_dirname = ".grass7"
+ config_dir = os.path.join(os.getenv('HOME'), config_dirname)
+ addon_base = os.path.join(config_dir, 'addons')
+ os.environ['GRASS_ADDON_BASE'] = addon_base
+ if not mswin:
+ os.environ['PATH'] += os.pathsep + os.path.join(addon_base, 'scripts')
+
+ # define LD_LIBRARY_PATH
+ if '@LD_LIBRARY_PATH_VAR@' not in os.environ:
+ os.environ['@LD_LIBRARY_PATH_VAR@'] = ''
+ os.environ['@LD_LIBRARY_PATH_VAR@'] += os.pathsep + os.path.join(gisbase, 'lib')
+
+ os.environ['GIS_LOCK'] = str(os.getpid())
+
+ # Set PYTHONPATH to find GRASS Python modules
+ # TODO: isn't this useless? user already imported this somehow
+ path = os.getenv('PYTHONPATH')
+ etcpy = os.path.join(gisbase, 'etc', 'python')
+ if path:
+ path = etcpy + os.pathsep + path
+ else:
+ path = etcpy
+ os.environ['PYTHONPATH'] = path
+
+ # TODO: isn't this contra-productive? may fail soon since we cannot
+ # write to the installation (applies also to defaults for Location
+ # and mapset) I don't see what would be the use case here.
+ if not dbase:
+ dbase = gisbase
+
+ os.environ['GISRC'] = write_gisrc(dbase, location, mapset)
+ return os.environ['GISRC']
Deleted: grass/branches/releasebranch_7_0/lib/python/script/setup.py.sed
===================================================================
--- grass/branches/releasebranch_7_0/lib/python/script/setup.py.sed 2015-06-12 14:09:12 UTC (rev 65447)
+++ grass/branches/releasebranch_7_0/lib/python/script/setup.py.sed 2015-06-12 19:42:30 UTC (rev 65448)
@@ -1,77 +0,0 @@
-"""!@package grass.script.setup
-
- at brief GRASS Python scripting module (setup)
-
-Setup functions to be used in Python scripts.
-
-Usage:
-
- at code
-from grass.script import setup as grass
-
-grass.init()
-...
- at endcode
-
-(C) 2010-2012 by the GRASS Development Team
-This program is free software under the GNU General Public
-License (>=v2). Read the file COPYING that comes with GRASS
-for details.
-
- at author Martin Landa <landa.martin gmail.com>
-"""
-
-import os
-import sys
-import tempfile as tmpfile
-
-
-def write_gisrc(dbase, location, mapset):
- """Write the gisrc file and return the gisrc path."""
- fd, gisrc = tmpfile.mkstemp()
- os.write(fd, "GISDBASE: %s\n" % dbase)
- os.write(fd, "LOCATION_NAME: %s\n" % location)
- os.write(fd, "MAPSET: %s\n" % mapset)
- os.close(fd)
- return gisrc
-
-
-def init(gisbase, dbase='', location='demolocation', mapset='PERMANENT'):
- """!Initialize system variables to run scripts without starting
- GRASS explicitly.
-
- User is resposible to delete gisrc file.
-
- @param gisbase path to GRASS installation
- @param dbase path to GRASS database (default: '')
- @param location location name (default: 'demolocation')
- @param mapset mapset within given location (default: 'PERMANENT')
- @return path to gisrc file
- """
- # define PATH
- os.environ['PATH'] += os.pathsep + os.path.join(gisbase, 'bin')
- os.environ['PATH'] += os.pathsep + os.path.join(gisbase, 'scripts')
- if sys.platform.startswith('win'): # added for winGRASS
- os.environ['PATH'] += os.pathsep + os.path.join(gisbase, 'extrabin')
-
- # define LD_LIBRARY_PATH
- if '@LD_LIBRARY_PATH_VAR@' not in os.environ:
- os.environ['@LD_LIBRARY_PATH_VAR@'] = ''
- os.environ['@LD_LIBRARY_PATH_VAR@'] += os.pathsep + os.path.join(gisbase, 'lib')
-
- os.environ['GIS_LOCK'] = str(os.getpid())
-
- # Set PYTHONPATH to find GRASS Python modules
- path = os.getenv('PYTHONPATH')
- etcpy = os.path.join(gisbase, 'etc', 'python')
- if path:
- path = etcpy + os.pathsep + path
- else:
- path = etcpy
- os.environ['PYTHONPATH'] = path
-
- if not dbase:
- dbase = gisbase
-
- os.environ['GISRC'] = write_gisrc(dbase, location, mapset)
- return os.environ['GISRC']
More information about the grass-commit
mailing list