gpt4 book ai didi

python - 在Mac上编译Python 3扩展模块

转载 作者:行者123 更新时间:2023-12-01 06:44:47 26 4
gpt4 key购买 nike

我正在尝试写一个 Python extension module我正在运行 macOS Catalina 并安装了 Python 3 的 Homebrew(使用默认安装设置)。当我尝试编译以下文件时:

#include <Python/Python.h>

static PyObject* world(PyObject* self, PyObject* args)
{
printf("Hello world!\n");
Py_RETURN_NONE;
}

static PyMethodDef methods[] = {
{"world", world, METH_VARARGS, "Prints \"Hello world!\""},
{NULL, NULL, 0, NULL}
};

static struct PyModuleDef module = {
PyModuleDef_HEAD_INIT,
"name for the module",
"docstring for the module",
-1,
methods
};

PyMODINIT_FUNC PyInit_hello(void)
{
return PyModule_Create(&module);
}

通过在我的终端中运行 gcc hello.c,我收到以下消息:

hello.c:15:5: error: use of undeclared identifier
'PyModuleDef_HEAD_INIT'
PyModuleDef_HEAD_INIT,
^
hello.c:14:27: error: variable has incomplete type
'struct PyModuleDef'
static struct PyModuleDef module = {
^
hello.c:14:15: note: forward declaration of 'struct PyModuleDef'
static struct PyModuleDef module = {
^
hello.c:24:12: warning: implicit declaration of function
'PyModule_Create' is invalid in C99
[-Wimplicit-function-declaration]
return PyModule_Create(&module);
^
1 warning and 2 errors generated.

有办法解决这个问题吗?我尝试使用 -L-I 标志但无济于事。我认为这种情况可能会发生,因为它使用的是 Python 2 而不是 Python 3 的 header 。

最佳答案

使用 distutils

创建setup.py。例如

from distutils.core import setup, Extension

def main():
setup(name="hello",
version="1.0.0",
description="desc",
author="<your name>",
author_email="a@b.com",
ext_modules=[Extension("hello",["hello.c"])])

if __name__ == "__main__":
main()

在 c 文件中将内容更改为:

#include <Python.h>

假设你的c文件名为hello.c和setup.py放在同一目录下:

python3 setup.py install

根据您的情况,请验证它是“python3”还是“python”。这应该构建您的模块并安装它,您应该能够看到编译器和链接器命令

关于python - 在Mac上编译Python 3扩展模块,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59278688/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com