On 02/05/17 15:53, Vaclav Petras wrote:
On Tue, May 2, 2017 at 3:24 AM, Moritz Lennert
<mlenn...@club.worldonline.be <mailto:mlenn...@club.worldonline.be>> wrote:
But I'm not against a wrapper. I added a prototype with limited
functionality to addons [1]. However, I'm not sure how to
account for
large data - that's what discouraged me from creating a wrapper. The
Python subprocess documentation says use communicate() but its
doc says
"The data read is buffered in memory, so do not use this method
if the
data size is large or unlimited." [2] Do I have to do the buffering
myself then or is it just fine? Is there some code like this in
GRASS?
Wouldn't using pipe_command() and feed_command() in the grass.script
be a solution ?
I'm using pipe_command() which is just convenience function setting
stdout=PIPE. Similarly feed_command() is just setting stdin=PIPE which
I'm not using because I'm feeding the stdout of the other process
directly (stdin=first_process.stdout). What I don't understand,
regardless of using stdin=PIPE or stdin=first_process.stdout for the
second process, is what should be next.
Do you really need the in_process.communicate() ? Here's what I used in
a local script and it works, without communicate(). Then again, I don't
think the data flowing through this pipe ever exceeded available memory.
pin = gscript.pipe_command('v.db.select',
map = firms_map,
column="x,y,%s" % turnover_column,
where="substr(%s, 1, 2) = '%s' AND
%s >= 0" % (nace_column, nace2, turnover_column),
flags='c',
quiet=True)
total_turnover_map = 'turnover_%s' % nace2
p = gscript.start_command('r.in.xyz',
input_='-',
stdin=pin.stdout,
method='sum',
type_='DCELL',
output=total_turnover_map,
quiet=True,
overwrite=True)
if p.wait() is not 0:
gscript.fatal("Error in r.in.xyz with nace %s" % nace2)
Moritz
_______________________________________________
grass-dev mailing list
grass-dev@lists.osgeo.org
https://lists.osgeo.org/mailman/listinfo/grass-dev