[Geowanking] c++/python binding wisdom
Howard Butler
hobu.inc at gmail.com
Thu May 22 10:13:06 PDT 2008
On May 22, 2008, at 11:48 AM, Nino Walker wrote:
> Sorry for the ambiguity: the codebase is C++, and there is no C
> interface to it.
>
> Nino
>
> -----Original Message-----
> From: geowanking-bounces at lists.burri.to [mailto:geowanking-bounces at lists.burri.to
> ] On Behalf Of Mateusz Loskot
> Sent: Thursday, May 22, 2008 8:43 AM
> To: geowanking at lists.burri.to
> Subject: Re: [Geowanking] c++/python binding wisdom
>
> On May 22, 2008, at 5:18 PM, nino at urbanmapping.com wrote:
>> Hopefully, y'all with experience writing or using swig bindings or
>> other c/py framework can weigh in. Rants, gotchas, resources,
>> whatever great or token wisdom will be sincerely appreciated.
>
> In the subject you use C++/Python but above you use C/Python, both are
> very different cases. If you wrap C++ API, I'd go with Boost Python
> [1]. IMHO, there is nothing better than Boost Python for C++, it beats
> SWIG regarding C++ language support.
> I don't have much experience with wrapping C for Python, but some
> users say ctypes may be better than SWIG.
>
> [1] http://www.boost.org/doc/libs/1_35_0/libs/python/doc/index.html
SWIG sucks for a number of reasons and is great for exactly one reason
-- it support more than one language. If you need to support bindings
for more than one language *right now,* I would look at using SWIG.
Otherwise, I would skip it. (Speaking as a SWIG bindings developer
for GDAL and MapServer).
Writing Python bindings against a C++ API can be problematic because
of ABI hell. Small changes/additions/deletions/const correctness
issues in subsequent C++ library releases will make your bindings fail
to work without recompiling them. This means that the bindings have
to be built and ship with the library itself rather than being made
available through something like PyPi. Python's easy_install and ilk
can make it really simple for folks to get going with bindings if they
are getting the base libraries through their package manager, but this
only works if ABI issues aren't in play.
A C API + ctypes (foreign function interface standard in Python 2.5+)
is a really nice way to go. ABI issues tend to go away, most people
have ctypes installed already or can get it quickly, and you can leave
a number of hassles at the feet of the ctypes developers (cross
platform issues, the need for compiling bindings code on windows).
Howard
More information about the Geowanking
mailing list