[GRASS-SVN] r72790 - grass/trunk/lib/init
svn_grass at osgeo.org
svn_grass at osgeo.org
Sat Jun 9 10:08:43 PDT 2018
Author: wenzeslaus
Date: 2018-06-09 10:08:43 -0700 (Sat, 09 Jun 2018)
New Revision: 72790
Modified:
grass/trunk/lib/init/grass.py
grass/trunk/lib/init/grass7.html
Log:
init: add --tmp-location (based on patch from radeknovotny94 in #3537)
Creates a location in program's tmp dir which is deleted at the end.
Meant for use with --exec. Possible to use without it as well (e.g. with GUI).
CRS needs to be specified using -c.
Does not write to a rc file to user's settings at the end.
Based on grass-tmp-loc-2.diff from Radek Novotny submitted in #3537.
Modified: grass/trunk/lib/init/grass.py
===================================================================
--- grass/trunk/lib/init/grass.py 2018-06-09 17:01:45 UTC (rev 72789)
+++ grass/trunk/lib/init/grass.py 2018-06-09 17:08:43 UTC (rev 72790)
@@ -226,6 +226,7 @@
def readfile(path):
+ debug("Reading %s" % path)
f = open(path, 'r')
s = f.read()
f.close()
@@ -233,6 +234,7 @@
def writefile(path, s):
+ debug("Writing %s" % path)
f = open(path, 'w')
f.write(s)
f.close()
@@ -290,6 +292,7 @@
[-e] [-f] [-text | -gtext | -gui] [--config param]
[[[GISDBASE/]LOCATION_NAME/]MAPSET]
$CMD_NAME [FLAG]... GISDBASE/LOCATION_NAME/MAPSET --exec EXECUTABLE [EPARAM]...
+ $CMD_NAME -c [geofile | EPSG] --tmp-location --exec EXECUTABLE [EPARAM]...
{flags}:
-h or -help or --help or --h {help_flag}
@@ -307,6 +310,7 @@
{config_detail}
--exec EXECUTABLE {exec_}
{exec_detail}
+ --tmp-location {tmp_location}
{params}:
GISDBASE {gisdbase}
@@ -363,6 +367,7 @@
executable=_("GRASS module, script or any other executable"),
executable_params=_("parameters of the executable"),
standard_flags=_("standard flags"),
+ tmp_location=_("create temporary location (use with -c and --exec flags)"),
)
@@ -886,12 +891,16 @@
mapset=mapset, loc=location)
-def set_mapset(gisrc, arg, geofile=None, create_new=False):
+def set_mapset(gisrc, arg=None, geofile=None, create_new=False,
+ tmp_location=False, tmpdir=None):
"""Selected Location and Mapset are checked and created if requested
The gisrc (GRASS environment file) is written at the end
(nothing is returned).
+
+ tmp_location requires tmpdir (which is used as gisdbase)
"""
+ # TODO: arg param seems to be always mapset or dash, refactor
l = None
if arg == '-':
@@ -925,6 +934,18 @@
l, location_name = os.path.split(l)
gisdbase = l
+ # all was None for tmp loc so that case goes here quickly
+ # TODO: but the above code needs review anyway
+ if tmp_location:
+ # set gisdbase to temporary directory
+ gisdbase = tmpdir
+ # we are already in a unique directory, so we can use fixed name
+ location_name = "tmploc"
+ # we need only one mapset
+ mapset = "PERMANENT"
+ debug("Using temporary location <{gdb}{sep}{lc}>".format(
+ gdb=gisdbase, lc=location_name, sep=os.path.sep))
+
if gisdbase and location_name and mapset:
location = os.path.join(gisdbase, location_name, mapset)
@@ -938,11 +959,12 @@
# 'location' is not valid, the user wants to create
# mapset on the fly
if not is_location_valid(gisdbase, location_name):
- # 'location_name' is not a valid GRASS location,
- # create new location and 'PERMANENT' mapset
- gisdbase = os.path.join(gisdbase, location_name)
- location_name = mapset
- mapset = "PERMANENT"
+ if not tmp_location:
+ # 'location_name' is not a valid GRASS location,
+ # create new location and 'PERMANENT' mapset
+ gisdbase = os.path.join(gisdbase, location_name)
+ location_name = mapset
+ mapset = "PERMANENT"
if is_location_valid(gisdbase, location_name):
fatal(_("Failed to create new location. "
"The location <%s> already exists." % location_name))
@@ -1774,8 +1796,8 @@
self.force_gislock_removal = None
self.mapset = None
self.geofile = None
+ self.tmp_location = False
-
def parse_cmdline(argv, default_gui):
"""Parse the standard part of command line parameters"""
params = Parameters()
@@ -1812,6 +1834,8 @@
elif i == "--config":
print_params()
sys.exit()
+ elif i == "--tmp-location":
+ params.tmp_location = True
else:
args.append(i)
if len(args) > 1:
@@ -1818,7 +1842,10 @@
params.mapset = args[1]
params.geofile = args[0]
elif len(args) == 1:
- params.mapset = args[0]
+ if params.tmp_location:
+ params.geofile = args[0]
+ else:
+ params.mapset = args[0]
else:
params.mapset = None
return params
@@ -1882,9 +1909,17 @@
params = parse_cmdline(sys.argv[1:], default_gui=default_gui)
if params.exit_grass and not params.create_new:
fatal(_("Flag -e requires also flag -c"))
+ if params.tmp_location and not params.create_new:
+ fatal(_("Flag --tmp-location requires also flag -c"))
+ # Theoretically -c is not needed, CRS could be value of --tmp-location
+ # or, considering current code, CRS could be just taken from args.
+ # We allow --tmp-location without --exec (usefulness to be evaluated).
grass_gui = params.grass_gui # put it to variable, it is used a lot
+ # TODO: with --tmp-location there is no point in loading settings
+ # i.e. rc file from home dir, but the code is too spread out
+ # to disable it at this point
gisrcrc = get_gisrc_from_config_dir(grass_config_dir, batch_job)
# Set the username
@@ -1969,7 +2004,7 @@
save_gui(gisrc, grass_gui)
# Parsing argument to get LOCATION
- if not params.mapset:
+ if not params.mapset and not params.tmp_location:
# Try interactive startup
# User selects LOCATION and MAPSET if not set
if not set_mapset_interactive(grass_gui):
@@ -1979,7 +2014,12 @@
"'grass-gui').").format(grass_gui))
else:
# Try non-interactive start up
- if params.create_new and params.geofile:
+ if params.tmp_location:
+ # tmp loc requires other things to be set as well
+ set_mapset(gisrc=gisrc, geofile=params.geofile,
+ create_new=True,
+ tmp_location=params.tmp_location, tmpdir=tmpdir)
+ elif params.create_new and params.geofile:
set_mapset(gisrc=gisrc, arg=params.mapset,
geofile=params.geofile, create_new=True)
else:
@@ -2062,7 +2102,8 @@
# save 'last used' GISRC after removing variables which shouldn't
# be saved, e.g. d.mon related
clean_env(gisrc)
- writefile(gisrcrc, readfile(gisrc))
+ if not params.tmp_location:
+ writefile(gisrcrc, readfile(gisrc))
# After this point no more grass modules may be called
done_message()
Modified: grass/trunk/lib/init/grass7.html
===================================================================
--- grass/trunk/lib/init/grass7.html 2018-06-09 17:01:45 UTC (rev 72789)
+++ grass/trunk/lib/init/grass7.html 2018-06-09 17:08:43 UTC (rev 72790)
@@ -51,6 +51,12 @@
<dt><b>--exec EXECUTABLE</b>
<dd> Execute GRASS module or script. The provided executable will be executed in a GRASS GIS non-interactive session.
+
+<dt><b>--tmp-location</b>
+<dd> Run using a temporary location which is created based on the given
+coordinate reference system and deleted at the end of the execution
+(use with -c and --exec flags)
+
</dl>
<h3>Parameters:</h3>
@@ -360,6 +366,47 @@
print(vector)
</pre></div>
+<h4>Using temporary location</h4>
+
+Creating a new temporary location based on a georeferenced file's
+projection coordinate reference system (CRS) and simultaneously starting
+computation in a shell script:
+
+<div class="code"><pre>
+grass75 -c elevation.tiff --tmp-location --exec test.sh
+</pre></div>
+
+The same, but using an EPSG code and a Python script:
+
+<div class="code"><pre>
+grass75 -c EPSG:3358 --tmp-location --exec test.py
+</pre></div>
+
+Finally, for special cases, we can create an XY location without any CRS:
+
+<div class="code"><pre>
+grass75 -c --tmp-location --exec test.py
+</pre></div>
+
+Temporary location is automatically deleted after computation,
+so the script is expected to export, link or otherwise preserve the
+output data before ending.
+
+<p>
+A single command can be also executed, e.g. to examine properties of the
+temporary location:
+
+<div class="code"><pre>
+grass75 -c EPSG:3358 --tmp-location --exec g.proj -p
+</pre></div>
+
+A temporary XY location with single command is useful, e.g. to show
+help text of a module:
+
+<div class="code"><pre>
+grass75 -c --tmp-location --exec r.neighbors --help
+</pre></div>
+
<h4>Troubleshooting</h4>
Importantly, to avoid an <tt>"[Errno 8] Exec format error"</tt> there must be a
<a href="https://en.wikipedia.org/wiki/Shebang_%28Unix%29">shebang</a> line at the top of
More information about the grass-commit
mailing list