[gdal-dev] pass gdal dataset as an argument from Python to C

Ari Jolma ari.jolma at gmail.com
Tue Nov 28 00:02:10 PST 2017


Sean Gillies kirjoitti 27.11.2017 klo 20:46:

> I believe it's possible, yes, but it will be challenging. I'm not 
> aware of anybody else doing this.

I'm doing it but in the Perl side. It's not impossible but Swig does 
wrap the C pointers quite deep into the Perl object (it must be similar 
in the Python Swig), so it needs a bit of research. However, I think it 
is a quite stable way Swig does it and it's a matter of making a typemap 
or a small function.

I think it is quite an important way to build extensions or link 
systems. In my case I needed a system computing a raster dataset (band) 
from other bands using a Bayesian network. I had built a Perl interface 
to a proprietary Bayesian network engine, and thus I needed only the the 
linkage code, which I built and is this:

https://github.com/ajolma/Geo-GDAL-Bayes-Hugin

See the typemap file for an example of a typemap (GDAL Band Perl object 
to a C GDALBandH pointer).

Ari

>
> In 
> https://github.com/OSGeo/gdal/blob/trunk/gdal/swig/python/extensions/gdal_wrap.cpp 
> you can see examples of C++ functions that access the GDAL objects 
> referenced by Python objects. This isn't a stable public API by any 
> means, and therefore I hesitate to recommend it. Maybe Even would be 
> able to comment more on how much support there is for the 
> SWIG-generated C++ Python classes.
>
> I presume you've already tried writing "_my_module" in Python and 
> found it to be too slow?
>
> Good luck!
>
> On Mon, Nov 27, 2017 at 9:34 AM, Shawn Gong <SGONG at mdacorporation.com 
> <mailto:SGONG at mdacorporation.com>> wrote:
>
>     Thank you Sean.
>
>     What I want to do is to compile C/C++ code into "_my_c_module.pyd"
>     and then to be called by Python. The Python code passes an
>     argument to C/C++.
>
>     I did previously by passing a file name (str) or a numpy array as
>     argument to C/C++, and it is all good.
>
>     This time I want to pass a gdal dataset as an argument:
>
>     in Python:
>
>         from osgeo import gdal
>
>         import _my_c_module
>
>         ds=gdal.Open('my_filename")
>
>         result = _my_c_module.function1(ds)
>
>     is this possible? If yes, how?
>
>
>     Shawn
>
>     ------------------------------------------------------------------------
>     *From:* Sean Gillies [sean at mapbox.com <mailto:sean at mapbox.com>]
>     *Sent:* November-27-17 11:09 AM
>     *To:* Shawn Gong
>     *Cc:* gdal-dev at lists.osgeo.org <mailto:gdal-dev at lists.osgeo.org>
>     *Subject:* Re: [gdal-dev] pass gdal dataset as an argument from
>     Python to C
>
>     Shawn,
>
>     PyObject and GDALDatasetH are incompatible types and you can't
>     pass the former to a function that expects the latter. I'm
>     surprised your program can compile with these incompatible types.
>
>     Do you mean for your module to extend GDAL's Python bindings? If
>     you look inside the C code of GDAL's Python bindings you may be
>     able to see how to get the GDALDatasetH associated with a Python
>     dataset object.
>
>     Hope this helps,
>
>
>     On Thu, Nov 23, 2017 at 1:25 PM, Shawn Gong
>     <SGONG at mdacorporation.com <mailto:SGONG at mdacorporation.com>> wrote:
>
>         Hi list,
>
>         Has anyone done this before?
>
>         I try to pass a gdal dataset as an argument from Python to C.
>
>         in my C code, I have
>
>         PyObject* py_my_func(PyObject *self, PyObject *args)
>         {
>
>             PyObject *poDataset;
>
>            if(!PyArg_ParseTuple(args, "Odd", &poDataset, &a1, &a2))
>           {
>             return NULL;
>           }
>
>           my_func(poDataset, a1, a2);
>         }
>
>         void my_func(GDALDatasetH hDataset, double a1, double a2)
>
>         {
>
>         }
>
>         Python crashed and hDataset was NULL
>
>         Is it possible to do or I did something wrong?
>
>         BTW, I have passed either a filename or a gdal array as an
>         argument from Python to C, with success.
>
>         Thanks,
>         Shawn
>
>         _______________________________________________
>         gdal-dev mailing list
>         gdal-dev at lists.osgeo.org <mailto:gdal-dev at lists.osgeo.org>
>         https://lists.osgeo.org/mailman/listinfo/gdal-dev
>         <https://lists.osgeo.org/mailman/listinfo/gdal-dev>
>
>
>
>
>     -- 
>     Sean Gillies
>
>
>
>
> -- 
> Sean Gillies
>
>
> _______________________________________________
> gdal-dev mailing list
> gdal-dev at lists.osgeo.org
> https://lists.osgeo.org/mailman/listinfo/gdal-dev

-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.osgeo.org/pipermail/gdal-dev/attachments/20171128/44373d26/attachment-0001.html>


More information about the gdal-dev mailing list