You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何为C编写的Python模块添加Python函数?

为C编写的Python模块添加Python函数的方法

下面介绍几种实用的实现方式,覆盖不同场景需求:

方法1:将C模块作为子模块,在Python主模块中扩展

这是最直观且易维护的方案,把编译好的C模块作为内部子模块,通过Python文件对外暴露所有功能并添加新函数。

步骤:

  1. 编译你的C代码为Python扩展模块,命名为_mycmodule(前缀下划线表示内部模块),生成对应平台的后缀文件(如.so、.pyd)。
  2. 创建同名的Python文件mycmodule.py,内容如下:
# 导入编译好的C子模块
from . import _mycmodule

# 把C模块的公开属性导入当前模块,保持原有C功能的可访问性
__all__ = [attr for attr in dir(_mycmodule) if not attr.startswith('_')]
for attr in __all__:
    globals()[attr] = getattr(_mycmodule, attr)

# 添加你需要的Python函数
def python_func():
    return "这是Python实现的函数,可与C模块功能共存"

# 将新函数加入公开列表
__all__.append('python_func')

用户使用时只需import mycmodule,就能同时调用C实现的函数和Python实现的python_func。

方法2:在C模块初始化时动态添加Python函数

如果需要在C模块加载时直接注入Python函数,可以在模块的初始化函数中执行Python代码,将函数绑定到模块命名空间。

C代码示例:

#include <Python.h>

// 你的C函数实现
static PyObject* c_func(PyObject* self, PyObject* args) {
    return PyUnicode_FromString("这是C实现的函数");
}

static PyMethodDef CModuleMethods[] = {
    {"c_func", c_func, METH_VARARGS, "C实现的示例函数"},
    {NULL, NULL, 0, NULL}
};

static struct PyModuleDef mycmodule = {
    PyModuleDef_HEAD_INIT,
    "mycmodule",
    NULL,
    -1,
    CModuleMethods
};

PyMODINIT_FUNC PyInit_mycmodule(void) {
    PyObject* module = PyModule_Create(&mycmodule);
    if (!module) return NULL;

    // 定义Python函数的代码片段
    const char* py_code = 
        "def python_func():\n"
        "    return '这是从C模块动态添加的Python函数'\n";
    
    // 执行代码并将函数绑定到模块
    if (PyRun_SimpleString(py_code) != 0) {
        Py_DECREF(module);
        return NULL;
    }

    return module;
}

编译后,导入mycmodule即可直接使用python_func。

方法3:通过setuptools打包合并C与Python代码

如果需要发布成正规的Python包,可以用setuptools同时管理C扩展和Python代码。

  1. 项目结构:
mycmodule/
    __init__.py
    _mycmodule.c
setup.py
  1. setup.py内容:
from setuptools import setup, Extension

# 定义C扩展
c_ext = Extension(
    'mycmodule._mycmodule',
    sources=['mycmodule/_mycmodule.c'],
)

setup(
    name='mycmodule',
    packages=['mycmodule'],
    ext_modules=[c_ext],
)
  1. mycmodule/__init__.py内容:
from ._mycmodule import *

def python_func():
    return "这是Python编写的函数,属于正式包的一部分"

用户安装包后,import mycmodule就能同时使用C和Python的功能。

注意事项

  • 方法1是日常开发的首选,分离C和Python代码,便于各自维护和调试。
  • 方法2适合需要动态生成Python逻辑的场景,但调试C中的Python代码相对复杂。
  • 方法3适合发布公开包,符合Python包的标准结构。

内容的提问来源于stack exchange,提问作者SU3

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.21 16:40:15