积分C和的Python:ValueError异常:模块的功能不能设置METH_CLASS或METH_

2019-09-19 22:16发布

我在做我的第一次创业到整合C和Python的2.7.3。 对于初学者来说,我只是想编写Python中的I2C模块,可以做到基本的加法。 (据npfind叫,因为一旦我想出解决办法,我想写一个numpy的查找方法)

npfind.h:

#include <math.h>

extern int add(int a, int b);

npfind.c:

#include "npfind.h"

int add(int a, int b)
{
    return a + b;
}

pynpfind.c:

#include "Python.h"
#include "npfind.h"

static char* py_add_doc = "Adds two numbers.";
static PyObject* py_add(PyObject* self, PyObject* args)
{
    int a, b, r;

    if (!PyArg_ParseTuple(args, "ii", &a, &b))
    {
        return NULL;
    }

    r = a + b;

    return Py_BuildValue("i", r);
}

static PyMethodDef* _npfindmethods = {
    {"add", py_add, METH_VARARGS, py_add_doc},
    {NULL, NULL, 0, NULL}
};

void init_npfind(void)
{
    PyObject* mod;
    mod = Py_InitModule("_npfind", _npfindmethods);
}

npfind.py:

from _npfind import *

#Do stuff with the methods

npfindsetup.py

from distutils.core import setup, Extension

setup(name="npfind", version="1.0", py_modules = ['npfind.py'],
      ext_modules=[Extension("_npfind", ["pynpfind.c", "npfind.c"])])

毕竟是,在Windows 7中,I型

python npfindsetup.py build_ext --inplace --compiler=mingw32

这似乎工作。 当我再试图找到npfind.py,我得到这个错误:

Traceback (most recent call last):
  File "npfind.py", line 1, in <module>
    from _npfind import *
ValueError: module functions cannot set METH_CLASS or METH_STATIC

我无法弄清楚它是什么说什么。 什么是METH_CLASS和METH_STATIC,为什么我在我试图设置呢?

Answer 1:

您在声明_npfindmethods为指针,并试图将其初始化数组。 当我从建立你的代码片段复制代码,我得到了很多类似的警告:

a.c:24:5: warning: braces around scalar initializer [enabled by default]
a.c:24:5: warning: (near initialization for '_npfindmethods') [enabled by default]
a.c:24:5: warning: initialization from incompatible pointer type [enabled by default]
a.c:24:5: warning: (near initialization for '_npfindmethods') [enabled by default]
(...)

的变量被初始化的值不正确,因此Python的内部发现的随机数据。


你应该声明_npfindmethods作为数组来代替:

static PyMethodDef _npfindmethods[] = {
    {"add", py_add, METH_VARARGS, py_add_doc},
    {NULL, NULL, 0, NULL}
};

现在,当你希望它会被初始化。 此外,因为现在py_add_doc需要有固定的地址,你必须做出一个数组,以及:

static char py_add_doc[] = "Adds two numbers.";

所以,你最终pynpfind.c会是什么样子:

#include "Python.h"
#include "npfind.h"

static char py_add_doc[] = "Adds two numbers.";
static PyObject* py_add(PyObject* self, PyObject* args)
{
    int a, b, r;

    if (!PyArg_ParseTuple(args, "ii", &a, &b))
    {
        return NULL;
    }

    r = a + b;

    return Py_BuildValue("i", r);
}

static PyMethodDef _npfindmethods[] = {
    {"add", py_add, METH_VARARGS, py_add_doc},
    {NULL, NULL, 0, NULL}
};

void init_npfind(void)
{
    PyObject* mod;
    mod = Py_InitModule("_npfind", _npfindmethods);
}


文章来源: Integrating C and Python: ValueError: module functions cannot set METH_CLASS or METH_STATIC