在C中创建Python扩展时出错

2024-04-18 01:21:57 发布

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

因此,我尝试使用c为python创建一个基本扩展。在使用设置.py文件,我有个错误说

helloworld.c(14):  error C2099: initializer is not a constant

下面是我的“helloworld.c”文件的代码。。。你知道吗

#include <stdio.h>
#include <Python.h>

static PyObject* helloworld(PyObject* self, PyObject* args) {
    printf("Hello World");
    return Py_None;
}

static PyMethodDef myMethods[] = {
    { "helloworld", helloworld, METH_NOARGS, "Prints Hello World" },
    { NULL, NULL, 0, NULL }
};

static struct PyMethodDef myModule = {
    PyMethodDef_HEAD_INIT,
    "myModule",
    "Test Module",
    -1,
    myMethods
};

PyMODINIT_FUNC PyInit_myModule(void) {
    return PyModule_Create(&myModule);
} 

这是我的名字设置.py'文件。。。你知道吗

from distutils.core import setup, Extension

setup(name = "myModule", version = '1.0', \
    ext_modules = [Extension('myModule', ['helloworld.c'])])

为什么会导致此错误,我如何修复它?谢谢。你知道吗


Tags: 文件pyhelloworldreturninclude错误setup
1条回答
网友
1楼 · 发布于 2024-04-18 01:21:57

你的问题很简单。对于模块实例,使用了错误的类型struct PyMethodDef而不是struct PyModuleDef,并且还使用了不存在的标识符PyMethodDef_HEAD_INIT而不是PyModuleDef_HEAD_INIT来初始化其第一个元素。你知道吗

我不知道为什么你的编译器会告诉你这不是一个常量初始值设定项,而不是告诉你它根本不存在(clang和gcc都是这样做的,我不记得MSVC的错误消息有那么糟糕……),但这才是真正的问题:没有PyMethodDef_HEAD_INIT这样的东西。你知道吗

如果同时修复这两个问题:

static struct PyModuleDef myModule = {
    PyModuleDef_HEAD_INIT,
    "myModule",
    "Test Module",
    -1,
    myMethods
};

…它构建:

$ python3 setup.py build_ext  inplace
running build_ext
building 'myModule' extension
/usr/bin/clang -fno-strict-aliasing -Wsign-compare -fno-common -dynamic -DNDEBUG -g -fwrapv -O3 -Wall -Wstrict-prototypes -arch i386 -arch x86_64 -g -I/Library/Frameworks/Python.framework/Versions/3.6/include/python3.6m -c helloworld.c -o build/temp.macosx-10.6-intel-3.6/helloworld.o
/usr/bin/clang -bundle -undefined dynamic_lookup -arch i386 -arch x86_64 -g build/temp.macosx-10.6-intel-3.6/helloworld.o -o /Users/abarnert/src/hellopy/myModule.cpython-36m-darwin.so

…而且,尽管您可能想给它起个像helloworld_helloworld这样的名字,而不是myModule,但它是有效的:

$ python3
>>> import myModule
>>> myModule.helloworld()
Hello World>>>

(您可能也想在字符串的末尾加一个\n。)

相关问题 更多 >

    热门问题