Velocity Reviews

Velocity Reviews (http://www.velocityreviews.com/forums/index.php)
-   Python (http://www.velocityreviews.com/forums/f43-python.html)
-   -   [Dream] A meta-wrapper module to interface any C dynamic library (http://www.velocityreviews.com/forums/t319236-dream-a-meta-wrapper-module-to-interface-any-c-dynamic-library.html)

Francesco Bochicchio 07-04-2003 10:59 AM

[Dream] A meta-wrapper module to interface any C dynamic library
 
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
-----
FB


Thomas Heller 07-04-2003 11:33 AM

Re: [Dream] A meta-wrapper module to interface any C dynamiclibrary
 
"Francesco Bochicchio" <bockman@virgilio.it> writes:

> 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

Simon Burton 07-04-2003 12:54 PM

Re: [Dream] A meta-wrapper module to interface any C dynamic library
 
On Fri, 04 Jul 2003 10:59:39 +0000, Francesco Bochicchio wrote:


> Did anybody ever attempted to do something like this?
>
> Ciao
> -----
> FB


yeah,

http://arrowtheory.com/software/python/index.html

it's hard :)

Simon.


Seo Sanghyeon 07-04-2003 02:56 PM

Re: [Dream] A meta-wrapper module to interface any C dynamic library
 
Use ctypes.

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

To see is to believe. The following is an actual IDLE session on WinXP.
However, ctypes is cross-platform -- it rusn on Windows, Linux, MacOS X.

>>> 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
>>>


Francesco Bochicchio 07-04-2003 03:10 PM

Re: [Dream] A meta-wrapper module to interface any C dynamic library
 
On Fri, 04 Jul 2003 13:33:27 +0200, Thomas Heller wrote:

>
> Yes, it already exists (to some degree).
>
> http://starship.python.net/crew/theller/ctypes/
>
> Thomas


Thanks for the pointer. Is more or less what I had in mind, and lead me to
find out about libffi, which is also quite interesting.

This proves a theory of mine: whatever piece of software you can think of,
there is always some developer in the world that already did it :-)

Ciao
-----
FB

Thomas Heller 07-04-2003 03:15 PM

Re: [Dream] A meta-wrapper module to interface any C dynamiclibrary
 
"Simon Burton" <simonb@webone.com.au> writes:

> On Fri, 04 Jul 2003 10:59:39 +0000, Francesco Bochicchio wrote:
>
>
>> Did anybody ever attempted to do something like this?
>>
>> Ciao
>> -----
>> FB

>
> yeah,
>
> http://arrowtheory.com/software/python/index.html
>
> it's hard :)
>

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

Thomas Heller 07-04-2003 05:39 PM

Re: [Dream] A meta-wrapper module to interface any C dynamiclibrary
 
hwlgw@hotmail.com (Will Stuyvesant) writes:

>> [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


All times are GMT. The time now is 07:13 PM.

Powered by vBulletin®. Copyright ©2000 - 2014, vBulletin Solutions, Inc.
SEO by vBSEO ©2010, Crawlability, Inc.