22

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

1 回答 1

16

只是改变

Extension('c_extension', ...)

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

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

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

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

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

在您的源目录中。

于 2012-08-23T18:29:33.533 回答