当前位置: 首页 > 面试题库 >

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

裴焱
2023-03-14
问题内容

我有一个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外壳中的行为如下所示:

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

问题答案:

只是改变

Extension('c_extension', ...)

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

与往常一样,您将__init__.pyfoobar目录中都需要文件。要将这些文件与setup.py中的模块打包在一起,您需要添加

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

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

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

在您的源目录中。



 类似资料:
  • 问题内容: 我有一个C扩展模块,很高兴分发内置的二进制文件。SetupTools使得在OS X和GNU / Linux上构建扩展模块变得很容易,因为那些OS随GCC一起提供,但是我不知道如何在Windows中进行。 我需要购买Visual Studio的副本,还是可以使用Visual Studio Express?我可以只使用Cygwin或MinGW吗? 问题答案: 您可以同时使用MinGW和VC

  • 我正在用Python开发一个包。我使用虚拟环境。我在我的虚拟环境中的. pth路径中设置了模块的根路径,这样我就可以在开发代码和进行测试的同时导入包的模块(问题1:这是一个好方法吗?)。这工作正常(这里有一个例子,这是我想要的行为): 但是,如果我尝试使用PyTest,则会收到一些导入错误消息: 我有点困惑,看起来这表明了一个导入错误,但是Python做得很好,那么为什么PyTest会有问题呢?对

  • 问题内容: 我在python中有自己的软件包,并且经常使用。我应该在哪里放置软件包,以便在不使用PYTHONPATH或sys.path的情况下将其导入,这是什么最优雅或传统的目录? 例如,网站包呢? 。 在python中复制并粘贴软件包是否很常见? 问题答案: 我通常将要准备导入的内容放在用户站点目录中: 要显示适合您平台的目录,可以使用 编辑:创建后将显示在其中:

  • 问题内容: 通过实验,我验证了当同一目录中同时存在编译的(或)和Plain时,首先导入文件;的,如果只输入文件未找到: 是否保证所有版本的Python都相同,并且我可以依靠它向仅在未找到文件时执行的文件添加逻辑吗? 问题答案: FWIW,我找不到参考说明,必须在py文件之前加载扩展,因此将其作为实现细节可能更安全(除非有人提供参考)。即使此细节对于所有版本都稳定到至少2.7。 导入模块时,它将首先

  • 问题内容: 我已经通读了Apple的Swift文档,却对如何创建模块或如何将类或结构成员定义为私有或公共一无所知。 语法中有对import语句的引用,但找不到有关它做什么或如何使用的信息。 有谁知道我在哪里可以找到这个? 问题答案: 更新资料 您可以使用框架对快速项目进行模块化。 我们通过为每个模块创建单独的框架项目并通过Xcode工作区将它们链接来实现模块化。当我们将组件分为不同的项目时,它看起

  • 问题内容: 是否可以使用Java 而非 JavaScript 构建Chrome扩展程序?(我在Eclipse IDE中使用Java SE。) 问题答案: Chrome扩展程序必须运行JavaScript。但是,您可以使用Google Web Toolkit 将Java编译为JavaScript。