首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >如何构建Python C扩展以便从模块中导入

如何构建Python C扩展以便从模块中导入
EN

Stack Overflow用户
提问于 2012-08-24 02:17:13
回答 1查看 7.2K关注 0票数 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
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2012-08-24 02:29:34

只要改变就好

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

在您的源目录中。

票数 16
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/12097755

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档