#2134: Create a general exit-safe interface to C libraries
--------------------------------------------------+-------------------------
 Reporter:  wenzeslaus                            |       Owner:  grass-dev@…   
           
     Type:  enhancement                           |      Status:  new           
           
 Priority:  normal                                |   Milestone:  7.0.0         
           
Component:  Python ctypes                         |     Version:  svn-trunk     
           
 Keywords:  G_fatal_error, exit, multiprocessing  |    Platform:  All           
           
      Cpu:  Unspecified                           |  
--------------------------------------------------+-------------------------

Comment(by zarch):

 Sorry the track lost the quote characters.

 Replying to wenzeslaus:
 > Replying to huhabla:
 > > I am not sure if i understand your approach, so code examples would
 > > be very helpful here. :)
 >
 > My original idea does not involved RCP server, it was about ctypes
 > calls versus module calls. It would require rewrite the whole pyGRASS
 > using modules. Here is sample pseudo code:
 > [cut]

 (IMHO) I don't see the point to make a python API using the modules
 interface. It will be only slow and useless for any real task, already
 pygrass for some operations it consume too much memory (probably it is due
 to some circular references, that need to be solve...) or is too slow.

 off-topic { Personally if I have to do the effort of rewriting pygrass I
 would use Cython (or CPython), moreover I think that we should work to
 reduce and clean the high redundancy of the code, a lot of Python objects
 and functions are duplicate between script/pygrass/temporal/wxgui simply
 using slightly different logic and this is unmaintainable, unfortunately I
 have not the global view of the ~111000 rows (removing blank lines and
 comments) of the code. But I do think that we should work on that
 direction. }

 Why not simply define your function (containing ctypes or ctypes-based
 function/objects) and call through the RPC interface? In this way, from my
 little understanding of the problem, you should be able to preserve the
 GUI from a crash, avoiding at the same time to make another duplicate,
 don't you?

 Something like (not tested):

 {{{
 from grass.pygrass.vector import VectorTopo
 from grass.pygrass.vector.geometry import Point
 from grass.pygrass.function import get_mapset_vector


 def add_points(vname, vmapset='', *points):
     """
     >>> add_points('new', (1, 2), (2, 3), (3, 4))
     """
     mapset = get_mapset_vector(vname, vmapset)  # check if already exist
     with VectorTopo(vname, mapset, mode='rw' if mapset else 'w') as vct:
         for x, y in points:
             vct.write(Point(x, y))


 ciface = RPCServer()
 check = ciface.call(function=add_points, args=('new', (1, 2), (2, 3), (3,
 4)))
 }}}

-- 
Ticket URL: <http://trac.osgeo.org/grass/ticket/2134#comment:14>
GRASS GIS <http://grass.osgeo.org>

_______________________________________________
grass-dev mailing list
grass-dev@lists.osgeo.org
http://lists.osgeo.org/mailman/listinfo/grass-dev

Reply via email to