如何建立一个Python C扩展,所以我可以从一个模块导入(How to build a Pytho

2019-06-27 08:02发布

我有许多子模块Python项目,我用的distutils包起来。 我想建立一些Python扩展用C生活在其中的一些子模块,但我不明白如何让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壳的行为是这样的:

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

Answer 1:

只是改变

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

源目录中。



文章来源: How to build a Python C Extension so I can import it from a module