[C++-sig] Multiple modules in a single pyd

Jérôme Laheurte fraca7 at free.fr
Tue Nov 15 15:51:23 CET 2011


Le 15 nov. 2011 à 15:24, Jim Bosch a écrit :

> On Nov 15, 2011 8:53 AM, "Olivier Voyer" <olivier.voyer at gmail.com> wrote:
> >
> > Hi everyone,
> >
> > Is it possible to have multiple modules linking to one single pyd file? I'm using SWIG with VS2010 and I can't find a way of doing that.
> >
> 
> I believe this is not supported by the Python C-API itself, regardless of what wrapper generator or library you use.  The name of the module import function needs to be related to the loadable module file name, and you generally can't have two functions for which that's true.

But you can put several submodules in an extension module, as a workaround (see code below). I always wondered if that was possible with boost::python or SWIG ?


#include <Python.h>

static PyObject *myfunc(PyObject *self, PyObject *args)
{
    if (!PyArg_ParseTuple(args, "|myfunc"))
        return NULL;

    printf("Hello, world\n");

    Py_INCREF(Py_None);
    return Py_None;
}

static PyMethodDef functions[] = {
    { "myfunc", (PyCFunction)myfunc, METH_VARARGS, "" },
    { NULL }
};

static PyMethodDef nofunctions[] = {
    { NULL }
};

void inittestmod()
{
    PyObject *mdl, *submdl;

    if (!(mdl = Py_InitModule3("testmod", nofunctions, "")))
        return;

    if (!(submdl = Py_InitModule3("foo", functions, "")))
        return;

    Py_INCREF(submdl);
    PyModule_AddObject(mdl, "foo", submdl);
}

After building,

>>> import testmod
>>> testmod.foo.myfunc()
Hello, world
>>>



More information about the Cplusplus-sig mailing list