Reputation: 23
I have a C code which calls a Fortran subroutine called SetFlags. I would like to turn this C code into a python module. It creates a .so file, but I cannot import this module into python. I am not sure if my error is in the creation of the module using distutils or in linking to the fortran library. Here is my setflagsmodule.c file
#include <Python/Python.h>
#include "/Users/person/program/x86_64-Darwin/include/Cheader.h"
#include <stdlib.h>
#include <stdio.h>
static char module_docstring[] =
"This module provides an interface for Setting Flags in C";
static char setflags_docstring[] =
"Set the Flags for program";
static PyObject * setflags(PyObject *self, PyObject *args)
{
int *error;
const int mssmpart;
const int fieldren;
const int tanbren;
const int higgsmix;
const int p2approx;
const int looplevel;
const int runningMT;
const int botResum;
const int tlcplxApprox;
if (!PyArg_ParseTuple(args, "iiiiiiiiii", &error,&mssmpart,&fieldren,&tanbren,&higgsmix,&p2approx,&looplevel,&runningMT,&botResum,&tlcplxApprox))
return NULL;
FSetFlags(error,mssmpart,fieldren,tanbren,higgsmix,p2approx,looplevel,runningMT,botResum,tlcplxApprox); //Call fortran subroutine
return Py_None;
}
static PyMethodDef setflags_method[] = {
{"FSetFlags", setflags, METH_VARARGS, setflags_docstring},
{NULL,NULL,0,NULL}
};
PyMODINIT_FUNC init_setflags(void)
{
PyObject *m;
m = Py_InitModule3("setflags", setflags_method, module_docstring);
if (m == NULL)
return;
}
Here is my setup file called setflags.py:
from distutils.core import setup, Extension
setup(
ext_modules=[Extension("setflags",["setflagsmodule.c"], include_dirs=['/Users/person/program/x86_64-Darwin'],
library_dirs=['/Users/person/program/x86_64-Darwin/lib/'], libraries=['FH'])],
)
I build the module using:
python setflags.py build_ext --inplace
When I try to import the module into python this is the result:
>>> import setflags
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
ImportError: dynamic module does not define init function (initsetflags)
Does anyone have a recommendation on how to solve this ImportError?
Any help would be greatly appreciated and thank you in advance for your time.
Upvotes: 2
Views: 196
Reputation: 365975
The problem is very simple, but easy to miss.
Notice the error you get:
ImportError: dynamic module does not define init function (initsetflags)
Now look at your code:
PyMODINIT_FUNC init_setflags(void)
You've defined init_setflags
instead of initsetflags
. Just remove the extra underscore, and it should work.
From the documentation on The Module's Method Table and Initialization Function:
The initialization function must be named
initname()
, wherename
is the name of the module…
The reason you often see init
functions named init_foo
in examples is that they're usually initializing a module _foo.so
, which will then be wrapped by a pure-Python module foo.py
.
Upvotes: 3