python modules
Mike Meyer
mwm-keyword-freebsdhackers2.e313df at mired.org
Fri Jul 13 20:58:03 UTC 2007
On Fri, 13 Jul 2007 22:34:20 +0200 "Mathieu Prevot" <mathieu.prevot at gmail.com> wrote:
> 2007/7/13, Mike Meyer <mwm at mired.org>:
> > On Fri, 13 Jul 2007 21:12:33 +0200 "Mathieu Prevot" <mathieu.prevot at gmail.com> wrote:
> > > 2007/7/13, Mathieu Prevot <mprevot at freebsd.org>:
> > > > I learn that modules loaded with import fall into 4 general categories:
> > > > - code written in Python (.py)
> > > > - C or C++ extensions that have been compiled into shared libraries (or DLLs)
> >
> > These are *Python extensions* written in C or C++ (among other
> > things), not arbitrary shared object libraries (or .so's).
> >
> > > > - Packages containing collection of modules
> > > > - Built-in modles writen in C and linked into the Python interpreter
> > > > Why don't we use directly the libpmc library in C instead of rewritting
> > > > things in python ?
> >
> > Are you writing in Python now and want to use libpmc? Doing that is
> > one approach.
>
> I'm doing this. This approach _seems_ to be the easier way.
>
> > > I copied libpmc.so and tryed 'import libpmc'. I have:
> > > ImportError: dynamic module does not define init function (initlibpmc)
> >
> > To be expected. The init function is part of what turns it into a
> > Python extension library.
> >
> > > Are we really far from having a libpmc module ?
> >
> > There are at least two other approaches to getting access to libpmc
> > from Python:
> >
> > 1) Write a wrapper library that is a Python extensions and translates
> > calls.
>
> This work is in progress in fact, but I wanted to have ASAP access to
> pmc(3) with a minimum of (keyboard) effort. I don't care of
> docstrings.
>
> > 2) Use the ctypes python module to access libpmc. ctypes has been
> > bundled into 2.5, so that would be my preference. Just one less
> > thing to install.
> >
> > This is probably more appropriate in c.l.python, but it's hard to say
> > without context.
>
> I didn't tryed this module, rather (a bit) the ezpyinline module,
> coupled to `gcc -E /usr/src/lib/libpmc/libpmc.c` (no preprocessing
> with the module, only compilation).
ezpyline could do the job - if you can get the dlopen magic to happen
so libpmc is loaded and it's functions are available.
> The ezpyinline module work like this:
>
> ----
> #!/usr/bin/python
> import ezpyinline
>
> #step 1
> code = r"""
> int helloworld() {
> printf("hello ezpyinline!
> ");
> }
> """
> #step 2
> ezc = ezpyinline.C(code)
>
> #step 3
> ezc.helloworld()
> ----
>
> I'll give ctypes a chance (when I have time :) )... thanks
I suspect ctypes is your best bet - it was designed for doing the kind
of thing:
>>> from ctypes import *
>>> pmc = cdll.LoadLibrary('libpmc.so')
>>> pmc.pmc_init()
-1
[Ok, it failed - but I'm not familiar with the library, so probably
screwed something in the environment up...]
Pyrex might also be of interest, but I suspect it's going to have the
same issues that ezpyinline does.
<mike
--
Mike Meyer <mwm at mired.org> http://www.mired.org/consulting.html
Independent Network/Unix/Perforce consultant, email for more information.
More information about the freebsd-hackers
mailing list