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