如何构建Python C扩展,以便从模块导入?

内容来源于 Stack Overflow,并遵循CC BY-SA 3.0许可协议进行翻译与使用

  • 回答 (1)
  • 关注 (0)
  • 查看 (33)

我有一个包含许多子模块的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', ...)

你需要__init__.py每个文件中的每个foobar和往常一样。要将这些包与setup.py中的模块一起打包,你需要添加

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

调用时,将需要目录结构。

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

在你的源目录里。

所属标签

可能回答问题的人

  • 天使的炫翼

    16 粉丝531 提问35 回答
  • 富有想象力的人

    2 粉丝0 提问26 回答
  • 旺仔小小鹿

    社区 · 运营 (已认证)

    48 粉丝0 提问26 回答
  • 发条丶魔灵1

    6 粉丝525 提问25 回答

扫码关注云+社区

领取腾讯云代金券