[GRASS-SVN] r65795 - grass/trunk/lib/python/script
svn_grass at osgeo.org
svn_grass at osgeo.org
Wed Jul 29 07:18:55 PDT 2015
Author: zarch
Date: 2015-07-29 07:18:55 -0700 (Wed, 29 Jul 2015)
New Revision: 65795
Modified:
grass/trunk/lib/python/script/core.py
Log:
scipt:core add python3 support
Modified: grass/trunk/lib/python/script/core.py
===================================================================
--- grass/trunk/lib/python/script/core.py 2015-07-29 14:12:13 UTC (rev 65794)
+++ grass/trunk/lib/python/script/core.py 2015-07-29 14:18:55 UTC (rev 65795)
@@ -17,26 +17,33 @@
.. sectionauthor:: Martin Landa <landa.martin gmail.com>
.. sectionauthor:: Michael Barton <michael.barton asu.edu>
"""
+from __future__ import absolute_import, print_function
import os
import sys
-import types
-import re
import atexit
import subprocess
import shutil
import codecs
import types as python_types
-from utils import KeyValue, parse_key_val, basename, encode
+from .utils import KeyValue, parse_key_val, basename, encode
from grass.exceptions import ScriptError, CalledModuleError
# i18N
import gettext
gettext.install('grasslibs', os.path.join(os.getenv("GISBASE"), 'locale'))
-import __builtin__
-__builtin__.__dict__['_'] = __builtin__.__dict__['_'].im_self.lgettext
+try:
+ # python2
+ import __builtin__
+except ImportError:
+ # python3
+ import builtins as __builtin__
+ unicode = str
+__builtin__.__dict__['_'] = __builtin__.__dict__['_'].__self__.lgettext
+
+
# subprocess wrapper that uses shell on Windows
@@ -81,14 +88,18 @@
def _make_val(val):
- if isinstance(val, types.StringType) or \
- isinstance(val, types.UnicodeType):
+ """Convert value to bytes"""
+ if isinstance(val, bytes):
return val
- if isinstance(val, types.ListType):
- return ",".join(map(_make_val, val))
- if isinstance(val, types.TupleType):
- return _make_val(list(val))
- return str(val)
+ if isinstance(val, (str, unicode)):
+ return encode(val)
+ if isinstance(val, (int, float)):
+ return encode(str(val))
+ try:
+ return b",".join(map(_make_val, iter(val)))
+ except TypeError:
+ pass
+ return bytes(val)
def get_commands():
@@ -248,7 +259,7 @@
return cmd
-def make_command(prog, flags="", overwrite=False, quiet=False, verbose=False,
+def make_command(prog, flags=b"", overwrite=False, quiet=False, verbose=False,
errors=None, **options):
"""Return a list of strings suitable for use as the args parameter to
Popen() or call(). Example:
@@ -267,31 +278,34 @@
:return: list of arguments
"""
- args = [prog]
+ args = [_make_val(prog)]
if overwrite:
- args.append("--o")
+ args.append(b"--o")
if quiet:
- args.append("--q")
+ args.append(b"--q")
if verbose:
- args.append("--v")
+ args.append(b"--v")
if flags:
- if '-' in flags:
+ flags = _make_val(flags)
+ if b'-' in flags:
raise ScriptError("'-' is not a valid flag")
- args.append("-%s" % flags)
- for opt, val in options.iteritems():
+ args.append(b"-" + bytes(flags))
+ for opt, val in options.items():
if opt in _popen_args:
continue
+ # convert string to bytes
+ opt = encode(opt)
if val != None:
- if opt.startswith('_'):
+ if opt.startswith(b'_'):
opt = opt[1:]
warning(_("To run the module <%s> add underscore at the end"
" of the option <%s> to avoid conflict with Python"
" keywords. Underscore at the beginning is"
" depreciated in GRASS GIS 7.0 and will be removed"
" in version 7.1.") % (prog, opt))
- elif opt.endswith('_'):
+ elif opt.endswith(b'_'):
opt = opt[:-1]
- args.append("%s=%s" % (opt, _make_val(val)))
+ args.append(opt + b'=' + _make_val(val))
return args
@@ -311,16 +325,16 @@
raise CalledModuleError(module=None, code=repr(args),
returncode=returncode)
-def start_command(prog, flags="", overwrite=False, quiet=False,
+def start_command(prog, flags=b"", overwrite=False, quiet=False,
verbose=False, **kwargs):
"""Returns a Popen object with the command created by make_command.
Accepts any of the arguments which Popen() accepts apart from "args"
and "shell".
>>> p = start_command("g.gisenv", stdout=subprocess.PIPE)
- >>> print p # doctest: +ELLIPSIS
+ >>> print(p) # doctest: +ELLIPSIS
<...Popen object at 0x...>
- >>> print p.communicate()[0] # doctest: +SKIP
+ >>> print(p.communicate()[0]) # doctest: +SKIP
GISDBASE='/opt/grass-data';
LOCATION_NAME='spearfish60';
MAPSET='glynn';
@@ -342,7 +356,7 @@
"""
options = {}
popts = {}
- for opt, val in kwargs.iteritems():
+ for opt, val in kwargs.items():
if opt in _popen_args:
popts[opt] = val
else:
@@ -357,7 +371,6 @@
__name__,
' '.join(args)))
sys.stderr.flush()
-
return Popen(args, **popts)
@@ -399,9 +412,9 @@
"stdout = PIPE". Returns the Popen object.
>>> p = pipe_command("g.gisenv")
- >>> print p # doctest: +ELLIPSIS
+ >>> print(p) # doctest: +ELLIPSIS
<....Popen object at 0x...>
- >>> print p.communicate()[0] # doctest: +SKIP
+ >>> print(p.communicate()[0]) # doctest: +SKIP
GISDBASE='/opt/grass-data';
LOCATION_NAME='spearfish60';
MAPSET='glynn';
@@ -470,7 +483,7 @@
parse = None
parse_args = {}
if 'parse' in kwargs:
- if type(kwargs['parse']) is types.TupleType:
+ if isinstance(kwargs['parse'], tuple):
parse = kwargs['parse'][0]
parse_args = kwargs['parse'][1]
del kwargs['parse']
@@ -693,7 +706,7 @@
"flags" are Python booleans.
"""
if not os.getenv("GISBASE"):
- print >> sys.stderr, "You must be in GRASS GIS to run this program."
+ print("You must be in GRASS GIS to run this program.", file=sys.stderr)
sys.exit(1)
cmdline = [basename(sys.argv[0])]
@@ -710,13 +723,12 @@
prog = "g.parser.exe" if sys.platform == "win32" else "g.parser"
p = subprocess.Popen([prog, '-n'] + argv, stdout=subprocess.PIPE)
- s = p.communicate()[0]
+ s = p.communicate()[0].decode()
lines = s.split('\0')
if not lines or lines[0] != "@ARGS_PARSED@":
sys.stdout.write(s)
sys.exit(p.returncode)
-
return _parse_opts(lines[1:])
# interface to g.tempfile
@@ -926,7 +938,7 @@
dictionary. Example:
>>> env = gisenv()
- >>> print env['GISDBASE'] # doctest: +SKIP
+ >>> print(env['GISDBASE']) # doctest: +SKIP
/opt/grass-data
:return: list of GRASS variables
@@ -1088,9 +1100,9 @@
dictionary. Example:
>>> result = find_file('elevation', element='cell')
- >>> print result['fullname']
+ >>> print(result['fullname'])
elevation at PERMANENT
- >>> print result['file'] # doctest: +ELLIPSIS
+ >>> print(result['file']) # doctest: +ELLIPSIS
/.../PERMANENT/cell/elevation
@@ -1131,7 +1143,7 @@
"""
if type == 'cell':
verbose(_('Element type should be "raster" and not "%s"') % type)
-
+
result = list()
for line in read_command("g.list",
quiet=True,
@@ -1320,7 +1332,7 @@
or non-zero return code
:return: True otherwise
"""
- nuldev = file(os.devnull, 'w+')
+ nuldev = open(os.devnull, 'w+')
try:
# TODO: the doc or impl is not correct, any return code is accepted
call([pgm] + list(args), stdin = nuldev, stdout = nuldev, stderr = nuldev)
@@ -1490,8 +1502,7 @@
::
- print version()
-
+ >>> print(version())
{'proj4': '4.8.0', 'geos': '3.3.5', 'libgis_revision': '52468',
'libgis_date': '2012-07-27 22:53:30 +0200 (Fri, 27 Jul 2012)',
'version': '7.0.svn', 'date': '2012', 'gdal': '2.0dev',
@@ -1499,7 +1510,7 @@
"""
data = parse_command('g.version', flags='rge', errors='ignore')
- for k, v in data.iteritems():
+ for k, v in data.items():
data[k.strip()] = v.replace('"', '').strip()
return data
More information about the grass-commit
mailing list