集成C和Python:值错误:模块函数无法设置METH_CLASS或METH_STATIC

2024-10-03 09:10:04 发布

您现在位置:Python中文网/ 问答频道 /正文

我第一次尝试集成C和Python2.7.3。对于初学者来说,我只想为Python编写一个可以进行基本加法的C模块。(它被称为npfind,因为一旦我弄明白了这一点,我想为numpy编写一个find方法)

npfind.h:

#include <math.h>

extern int add(int a, int b);

npfind.c:

^{pr2}$

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"])])

毕竟,在Windows7上,我打字

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

我搞不懂它在说什么。什么是冰毒类和冰毒静电,为什么我要设置它们?在


Tags: frompyimportadddocreturnincludeargs
1条回答
网友
1楼 · 发布于 2024-10-03 09:10:04

您正在将_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声明为数组:

^{pr2}$

现在它将按您的期望进行初始化。另外,因为现在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);
}

相关问题 更多 >