2

我有一个 C 代码,它调用一个名为 SetFlags 的 Fortran 子例程。我想把这个 C 代码变成一个 python 模块。它创建一个 .so 文件,但我无法将此模块导入 python。我不确定我的错误是在使用 distutils 创建模块还是在链接到 fortran 库时出错。这是我的 setflagsmodule.c 文件

#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;
}

这是我的设置文件 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'])],
    )

我使用以下方法构建模块:

python setflags.py build_ext --inplace

当我尝试将模块导入 python 时,结果如下:

>>> import setflags
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
ImportError: dynamic module does not define init function (initsetflags)

有人对如何解决此 ImportError 有建议吗?

任何帮助将不胜感激,并提前感谢您的宝贵时间。

4

1 回答 1

3

问题很简单,但很容易错过。

注意你得到的错误:

ImportError: dynamic module does not define init function (initsetflags)

现在看看你的代码:

PyMODINIT_FUNC init_setflags(void)

您已定义init_setflags而不是initsetflags. 只需删除多余的下划线,它应该可以工作。


模块的方法表和初始化函数的文档中:

初始化函数必须命名initname(),模块的名字在哪里name...</p>


您经常在示例中看到init函数命名的原因init_foo是它们通常初始化一个模块_foo.so,然后将由纯 Python 模块包装foo.py

于 2013-06-06T21:56:05.660 回答