欢迎来到尧图网

客户服务 关于我们

您的位置:首页 > 健康 > 美食 > Python 调用 C 和 C 调用 Python 方法

Python 调用 C 和 C 调用 Python 方法

2025/6/15 5:49:09 来源:https://blog.csdn.net/Ephemeroptera/article/details/139581301  浏览:    关键词:Python 调用 C 和 C 调用 Python 方法

在这篇博客中,我们将探讨如何在 Python 中调用 C 函数,以及如何在 C 中调用 Python 函数。利用这两种方法,你可以在项目中充分发挥 Python 的简洁性和 C 的高性能优势。

目录

  1. Python 调用 C 函数
    • 使用 ctypes
    • 使用 Cython
  2. C 调用 Python 函数
    • 使用 Python C API

Python 调用 C 函数

使用 ctypes

ctypes 是 Python 的一个外部函数库,允许调用动态链接库(DLL 或共享库)的函数。

例子:简单的 C 函数

首先,我们编写一个简单的 C 函数,并将其编译成共享库。

hello.c

#include <stdio.h>void say_hello(const char* name) {printf("Hello, %s!\n", name);
}

编译这个 C 文件生成共享库:

gcc -shared -o libhello.so -fPIC hello.c

然后,我们使用 ctypes 在 Python 中调用这个 C 函数。

call_hello.py

import ctypes# 加载共享库
lib = ctypes.CDLL('./libhello.so')# 定义函数原型
lib.say_hello.argtypes = [ctypes.c_char_p]
lib.say_hello.restype = None# 调用 C 函数
lib.say_hello(b"World")

使用 Cython

Cython 是一种使得 C 代码可以无缝集成到 Python 的工具。它允许你在 Python 代码中嵌入 C 代码,从而提升性能。

例子:简单的 C 函数

我们编写一个简单的 Cython 文件。

hello.pyx

cdef extern from "hello.h":void say_hello(const char* name)def call_hello(name):say_hello(name.encode('utf-8'))

编写一个 C 头文件。

hello.h

void say_hello(const char* name);

编写一个 C 文件。

hello.c

#include <stdio.h>
#include "hello.h"void say_hello(const char* name) {printf("Hello, %s!\n", name);
}

编写一个 setup 文件来编译 Cython 代码。

setup.py

from setuptools import setup
from setuptools.extension import Extension
from Cython.Build import cythonizeextensions = [Extension("hello", ["hello.pyx", "hello.c"])
]setup(ext_modules=cythonize(extensions)
)

编译 Cython 代码:

python setup.py build_ext --inplace

编写一个 Python 文件调用 Cython 代码。

call_hello.py

import hellohello.call_hello("World")

C 调用 Python 函数

使用 Python C API

Python 提供了一个 C API,使得 C 代码可以嵌入到 Python 中。

例子:调用 Python 函数

首先,我们编写一个简单的 Python 函数。

script.py

def greet(name):return f"Hello, {name}!"

然后,我们编写一个 C 文件来调用这个 Python 函数。

call_python.c

#include <Python.h>int main(int argc, char *argv[]) {// 初始化 Python 解释器Py_Initialize();// 添加当前目录到模块搜索路径PyRun_SimpleString("import sys");PyRun_SimpleString("sys.path.append('.')");// 导入 Python 脚本PyObject *pName = PyUnicode_DecodeFSDefault("script");PyObject *pModule = PyImport_Import(pName);Py_DECREF(pName);if (pModule != NULL) {// 获取函数PyObject *pFunc = PyObject_GetAttrString(pModule, "greet");if (PyCallable_Check(pFunc)) {// 创建参数PyObject *pArgs = PyTuple_Pack(1, PyUnicode_FromString("World"));// 调用函数PyObject *pValue = PyObject_CallObject(pFunc, pArgs);Py_DECREF(pArgs);if (pValue != NULL) {printf("Result of call: %s\n", PyUnicode_AsUTF8(pValue));Py_DECREF(pValue);} else {Py_DECREF(pFunc);Py_DECREF(pModule);PyErr_Print();fprintf(stderr, "Call failed\n");return 1;}} else {if (PyErr_Occurred())PyErr_Print();fprintf(stderr, "Cannot find function \"greet\"\n");}Py_XDECREF(pFunc);Py_DECREF(pModule);} else {PyErr_Print();fprintf(stderr, "Failed to load \"script\"\n");return 1;}// 结束 Python 解释器Py_Finalize();return 0;
}

编译并运行这个 C 文件:

gcc -o call_python call_python.c -I/usr/include/python3.8 -lpython3.8
./call_python

结论

在这篇博客中,我们展示了如何在 Python 中调用 C 函数,以及如何在 C 中调用 Python 函数。通过这两种方法,可以在项目中利用 Python 的简洁性和 C 的高性能优势。希望这篇教程对你有所帮助!

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com

热搜词