我有一个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
发布于 2012-08-24 02:29:34
只要改变就好
Extension('c_extension', ...)
至
Extension('foo.bar.c_extension', ...)
像往常一样,您需要在foo
和bar
目录中的每个目录中使用__init__.py
文件。要将这些与setup.py中的模块打包在一起,您需要添加
packages = ['foo', 'foo.bar'],
添加到setup()调用中,您将需要目录结构
setup.py
foo/
__init__.py
bar/
__init__.py
在您的源目录中。
https://stackoverflow.com/questions/12097755
复制相似问题