如何构建Python C扩展以便从modu导入

2024-04-28 08:10:40 发布

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

我有一个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

Tags: 模块answerpyimportgetfoosetupextension
1条回答
网友
1楼 · 发布于 2024-04-28 08:10:40

只是改变

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

在源目录中。

相关问题 更多 >