[Qgis-user] Problem with processing and GRASS algorithms in QGIS 3

Stephen posting at vodacomm.ca
Fri May 25 15:18:18 PDT 2018


Hi everyone,

I'm porting some PyQGIS 2 code to 3.

This post is a continuation of the issue I first mentioned in this post
to the list:

http://lists.osgeo.org/pipermail/qgis-user/2018-May/042343.html

I've since upgraded from 3.0.1 to 3.0.2. (Previously working code did
not work with 3.1 master.)

My code contains the following statement:
> grid_r_raster_layer = processing.run("grass7:v.to.rast", {'input': grid_v, 'type': 0, 'use': 1,
>                                     'GRASS_REGION_PARAMETER': extent,
>                                     'output': file_grid_r,
>                                     'GRASS_REGION_CELLSIZE_PARAMETER': 0.008333,
>                                     'GRASS_SNAP_TOLERANCE_PARAMETER': -1,
>                                     'GRASS_MIN_AREA_PARAMETER': 0.000100},
>                              feedback=QgsProcessingFeedback())['output']

'grid_v' is a QgsVectorLayer object and 'file_grid_r' a string
containing a path:

>>>> type(grid_v)
> <class 'qgis._core.QgsVectorLayer'>
>>>> grid_v.isValid()
> True
>>>> print(file_grid_r)
> /tmp/processing_3951f631a6664dd2ac1924f0536a7dd0/5b088658e2ff22

If I execute this code in the pycharm debugger, I get this output:

> Traceback (most recent call last):
>   File "/usr/share/qgis/python/plugins/processing/algs/grass7/Grass7Algorithm.py", line 384, in processAlgorithm
>     Grass7Utils.executeGrass(self.commands, feedback, self.outputCommands)
>   File "/usr/share/qgis/python/plugins/processing/algs/grass7/Grass7Utils.py", line 367, in executeGrass
>     startupinfo=si if isWindows() else None
>   File "/usr/lib64/python3.5/subprocess.py", line 676, in __init__
>     restore_signals, start_new_session)
>   File "/usr/lib64/python3.5/subprocess.py", line 1211, in _execute_child
>     executable = os.fsencode(executable)
>   File "/usr/lib64/python3.5/os.py", line 864, in fsencode
>     raise TypeError("expect bytes or str, not %s" % type(filename).__name__)
> TypeError: expect bytes or str, not NoneType

(This is progress! In 3.0.1, I didn't get any traceback at all.)

The problem would appear to be in Grass7Utils.py (or be triggered there;
perhaps my input is faulty). Here's the code around line 367 (first line
is 359, last is 379)

>         with subprocess.Popen(
>                 command,
>                 shell=True if isMac() else False,
>                 stdout=subprocess.PIPE,
>                 stdin=subprocess.DEVNULL,
>                 stderr=subprocess.STDOUT,
>                 universal_newlines=True,
>                 env=grassenv,
>                 startupinfo=si if isWindows() else None
>         ) as proc:
>             for line in iter(proc.stdout.readline, ''):
>                 if 'GRASS_INFO_PERCENT' in line:
>                     try:
>                         feedback.setProgress(int(line[len('GRASS_INFO_PERCENT') + 2:]))
>                     except:
>                         pass
>                 else:
>                     if 'r.out' in line or 'v.out' in line:
>                         grassOutDone = True
>                     loglines.append(line)
>                     feedback.pushConsoleInfo(line)

The offending statement in subprocess.py is this:

>             self._execute_child(args, executable, preexec_fn, close_fds,
>                                 pass_fds, cwd, env,
>                                 startupinfo, creationflags, shell,
>                                 p2cread, p2cwrite,
>                                 c2pread, c2pwrite,
>                                 errread, errwrite,
>                                 restore_signals, start_new_session)

('executable' is None in this case, which seems wrong, but I have no
clue where it comes from.)

The problem is not, as far as I can tell, in GRASS. The batch job gets
generated and when I run it manually, it works fine:

> /tmp/processing_b02dc280166f49e0af77208296099ea5/grassdata $ export GRASS_BATCH_JOB="$PWD/grass_batch_job.sh"
> /tmp/processing_b02dc280166f49e0af77208296099ea5/grassdata $ grass72
> Cleaning up temporary files...
> Starting GRASS GIS...
> Executing </tmp/processing_b02dc280166f49e0af77208296099ea5/grassdata/grass_batch_job.sh> ...
> Projection information updated
> Over-riding projection check
> Check if OGR layer <Kenya_power_grid> contains polygons...
>  100%
> WARNING: Writing column <BANDWIDTH> with integer 64 as integer 32
> WARNING: Writing column <AICD> with integer 64 as integer 32
> Importing 48 features (OGR layer <Kenya_power_grid>)...
>  100%
> -----------------------------------------------------
> Building topology for vector map <vector_5b086ca96575b3 at PERMANENT>...
> Registering primitives...
> 61 primitives registered
> 180 vertices registered
> Building areas...
>  100%
> 0 areas built
> 0 isles built
> Attaching islands...
> Attaching centroids...
>  100%
> Number of nodes: 63
> Number of primitives: 61
> Number of points: 0
> Number of lines: 61
> Number of boundaries: 0
> Number of centroids: 0
> Number of areas: 0
> Number of isles: 0
> Writing raster map...
>  100%
> v.to.rast complete.
> Checking GDAL data type and nodata value...
>  100%
> Using GDAL data type <Int32>
> Input raster map contains cells with NULL-value (no-data). The value
> -2147483648 will be used to represent no-data values in the input map. You
> can specify a nodata value with the nodata option.
> Exporting raster data to GTiff format...
> ERROR 6: SetColorTable() only supported for Byte or UInt16 bands in TIFF format.
>  100%
> r.out.gdal complete. File
> </tmp/processing_b02dc280166f49e0af77208296099ea5/5b086c8c419362> created.
> Execution of </tmp/processing_b02dc280166f49e0af77208296099ea5/grassdata/grass_batch_job.sh> finished.
> Cleaning up temporary files...

What can I do to determine the cause and make this work?

Cheers

Stephen



More information about the Qgis-user mailing list