如何将我的Python C模块放入包中?

本文介绍了在Python中将C编写的模块整合进包结构的问题。作者遇到的问题是C模块无法以`foopkg.foo`的形式被导入,而重命名模块为`foo`则可以正常工作。解决办法是在`foopkg`目录下添加`__init__.py`文件,使得Python能够识别它为一个包。在`setup.py`文件的`packages`参数中添加相应的包名,从而成功将C模块纳入包内。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

我想在一个程序包下收集多个Python模块,因此它们不会在python程序包和模块的全局集合中保留太多名称。但是我用C编写的模块有问题。
在这里插入图片描述
这是一个非常简单的示例,直接来自官方Python文档。

-------欢迎加入python学习交流扣扣裙851211580-------
from distutils.core import setup
from distutils.extension import Extension
setup(name='foobar',
      version='1.0',
      ext_modules=[Extension('foopkg.foo', ['foo.c'])],
      )

我的foo.c文件看起来像这样

#include <Python.h>

static PyObject *
foo_bar(PyObject *self, PyObject *args);

static PyMethodDef FooMethods[] = {
    {
        "bar",
        foo_bar,
        METH_VARARGS,
        ""
    },
    {NULL, NULL, 0, NULL}
};

static PyObject *
foo_bar(PyObject *self, PyObject *args)
{
    return Py_BuildValue("s", "foobar");
}

PyMODINIT_FUNC
initfoo(void)
{
    (void)Py_InitModule("foo", FooMethods);
}

int
main(int argc, char *argv[])
{
    // Pass argv[0] to the Python interpreter
    Py_SetProgramName(argv[0]);

    // Initialize the Python interpreter.  Required.
    Py_Initialize();

    // Add a static module
    initfoo();

    return 0;
}

它可以正常构建和安装,但是我无法导入foopkg.foo!如果我将其重命名为“ foo”,则效果很好。

有什么想法可以使“ foopkg.foo”工作吗?例如,将“ foo”从C代码中的Py_InitModule()更改为“ foopkg.foo”无济于事。

在这里插入图片描述
解决方案

__ init__.py文件foopkg夹中必须有一个文件,否则Python无法识别为软件包。

foopkg在其中创建一个文件夹setup.py,然后在其中放置一个空文件__init__.py,并在以下packages行添加一行setup.py:

from distutils.core import setup
from distutils.extension import Extension
setup(name='foobar',
      version='1.0',
      packages=['foopkg'],
      ext_modules=[Extension('foopkg.foo', ['foo.c'])],
      )

最后多说一句,小编是一名python开发工程师,这里有我自己整理了一套最新的python系统学习教程,包括从基础的python脚本到web开发、爬虫、数据分析、数据可视化、机器学习等。想要这些资料的可以关注小编,并在后台私信小编:“01”即可领取。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值