gpt4 book ai didi

python - 如何构建 Python C 扩展,以便我可以从模块中导入它

转载 作者:IT老高 更新时间:2023-10-28 21:04:13 27 4
gpt4 key购买 nike

我有一个包含许多子模块的 Python 项目,这些子模块是用 distutils 打包的。我想在 C 中构建一些 Python 扩展以存在于其中一些子模块中,但我不明白如何让 Python 扩展存在于子模块中。以下是我正在寻找的最简单的示例:

这是我的 Python 扩展c_extension.c:

#include <Python.h>

static PyObject *
get_answer(PyObject *self, PyObject *args)
{
return Py_BuildValue("i", 42);
}

static PyMethodDef Methods[] = {
{"get_answer", get_answer, METH_VARARGS, "The meaning of life."},
{NULL, NULL, 0, NULL}
};

PyMODINIT_FUNC
initc_extension(void) {
(void) Py_InitModule("c_extension", Methods);
}

这是一个有效的 setup.py:

from distutils.core import setup
from distutils.extension import Extension

setup(name='c_extension_demo',
ext_modules = [Extension('c_extension', sources = ['c_extension.c'])])

在 virtualenv 中安装后,我可以这样做:

>>> import c_extension
>>> c_extension.get_answer()
42

但我想让 c_extension 存在于子模块中,例如 foo.bar。我需要在此管道中进行哪些更改才能使 Python shell 中的行为如下所示:

>>> import foo.bar.c_extension
>>> foo.bar.c_extension.get_answer()
42

最佳答案

只是改变

Extension('c_extension', ...)

Extension('foo.bar.c_extension', ...)

您需要像往常一样在每个 foobar 目录中使用 __init__.py 文件。要将这些与 setup.py 中的模块打包在一起,您需要添加

packages = ['foo', 'foo.bar'],

到你的 setup() 调用,你将需要目录结构

setup.py
foo/
__init__.py
bar/
__init__.py

在您的源目录中。

关于python - 如何构建 Python C 扩展,以便我可以从模块中导入它,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12097755/

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