[Dream] A meta-wrapper module to interface any C dynamic library

  • Thread starter Francesco Bochicchio
  • Start date
F

Francesco Bochicchio

Hi all,

I was wondering if it would be possible to make a module which allows to
do something like that:

import c_interface
math_lib = c_interface.load('math.so', 'math.h' )
sin_f = math_lib.get_function('sin')
print "sin(3.14) = %f" % sin_f (3.14)

The idea would be to make a module that allows to use any C dynamic
library ( I used an hypothetical math.so only as example ) without
the need of a specific wrapper module.

I've given some thought to this idea, but I was blocked by the theoric (?)
impossibility to correctly call a C function without knowing its prototype
at compile time.

Did anybody ever attempted to do something like this?

Ciao
 
T

Thomas Heller

Francesco Bochicchio said:
Hi all,

I was wondering if it would be possible to make a module which allows to
do something like that:

import c_interface
math_lib = c_interface.load('math.so', 'math.h' )
sin_f = math_lib.get_function('sin')
print "sin(3.14) = %f" % sin_f (3.14)

The idea would be to make a module that allows to use any C dynamic
library ( I used an hypothetical math.so only as example ) without
the need of a specific wrapper module.

I've given some thought to this idea, but I was blocked by the theoric (?)
impossibility to correctly call a C function without knowing its prototype
at compile time.

Did anybody ever attempted to do something like this?

Yes, it already exists (to some degree).

http://starship.python.net/crew/theller/ctypes/

Thomas
 
T

Thomas Heller

Simon Burton said:
I have tried cdecl.py to parse windows header files, and it does a
pretty good job.

I say this after also having tried PLY
http://systems.cs.uchicago.edu/ply/ with a partial C grammer, and
finally gave up because I'm not sure it is possible to parse ANSI C with
a parser like this (at least its not possible for me).

I found one problem in cdecl.py (it doesn't parse hex constants
correctly), and I had to extend it somewhat for MS specific keywords
like __stdcall or so. I also ran the header files through the MSVC
preprocessor, and hand-edit them somewhat before throwing them at it.

I'm not really sure if it's a good idea to automatically create ctypes
wrappers from windows.h...

But I finally gave up when I encountered some really strange errors...

Thomas
 
T

Thomas Heller

[Seo Sanghyeon]
To see is to believe.
import ctypes
loader = ctypes.cdll
dll = loader.msvcrt
sin = dll.sin
sin.argtypes = [ctypes.c_double]
sin.restype = ctypes.c_double
sin(3.14)
0.0015926529164868282

I love examples like this! And ctypes is very good, I downloaded the
.EXE installer and ran it and this example works "out of the box".

How do you know what functions are available in "dll"? Any general
strategy?

On windows, you use dependency walker, although it would also be
possible to write something similar in ctypes ;-)

http://www.dependencywalker.com/

On unix like systems, I don't know. Use nm(1) ?

Thomas
 

Ask a Question

Want to reply to this thread or ask your own question?

You'll need to choose a username for the site, which only take a couple of moments. After that, you can post your question and our members will help you out.

Ask a Question

Members online

No members online now.

Forum statistics

Threads
473,769
Messages
2,569,579
Members
45,053
Latest member
BrodieSola

Latest Threads

Top