C语言调用python

1、linux中安装libpython3.10-dev

通过C语言调用python代码,需要先安装libpython3的dev依赖库(不同的ubuntu版本下,python版本可能会有差异, 比如ubuntu 22.04里是libpython3.10-dev)。

首先可以通过以下命令验证是否是否已经存在python3的dev包:

bash 复制代码
dpkg -l | grep libpython3 | grep dev

如果已经安装,则会出现以下界面:

如果没有,则输入以下指令进行安装:

bash 复制代码
sudo apt-get update
sudo apt install libpython3.10-dev

2、直接调用python语句

cpp 复制代码
#include "Python.h"

int main()
{
    Py_Initialize(); // 初始化
    PyRun_SimpleString("print ('funny')");
    Py_Finalize(); //释放资源
}

编译、运行

bash 复制代码
gcc simpledemo.c -o simpledemo -I /usr/include/python3.10 -l python3.10
//-I 指定解释器的路径 -l 指定解释器的版本

./simpledemo

3、调用无参python函数

cpp 复制代码
#if 0
1、包含Python.h头文件,以便使用Python API。
2、使用void Py_Initialize()初始化Python解释器,
3、使用PyObject *PyImport_ImportModule(const char *name)和PyObject
*PyObject_GetAttrString(PyObject *o, const char *attr_name)获取sys.path对象,并利用
int PyList_Append(PyObject *list, PyObject *item)将当前路径.添加到sys.path中,以便加载
当前的Python模块(Python文件即python模块)。
4、使用PyObject *PyImport_ImportModule(const char *name)函数导入Python模块,并检查是否
有错误。
5、使用PyObject *PyObject_GetAttrString(PyObject *o, const char *attr_name)函数获取
Python函数对象,并检查是否可调用。
6、使用PyObject *PyObject_CallObject(PyObject *callable, PyObject *args)函数调用
Python函数,并获取返回值。
7、使用void Py_DECREF(PyObject *o)函数释放所有引用的Python对象。
8、结束时调用void Py_Finalize()函数关闭Python解释器。
相关的函数参数说明参考网站(网站左上角输入函数名即可开始搜索):
https://docs.python.org/zh-cn/3/c-api/import.html
#endif

编译

bash 复制代码
gcc -o nopara nopara.c -I /usr/include/python3.10 -l python3.10

4、调用有参python函数

cpp 复制代码
#if 0
1、包含Python.h头文件,以便使用Python API。
2、使用void Py_Initialize()初始化Python解释器,
3、使用PyObject *PyImport_ImportModule(const char *name)和PyObject
*PyObject_GetAttrString(PyObject *o, const char *attr_name)获取sys.path对象,并利用
int PyList_Append(PyObject *list, PyObject *item)将当前路径.添加到sys.path中,以便加载
当前的Python模块(Python文件即python模块)。
4、使用PyObject *PyImport_ImportModule(const char *name)函数导入Python模块,并检查是否
有错误。
5、使用PyObject *PyObject_GetAttrString(PyObject *o, const char *attr_name)函数获取
Python函数对象,并检查是否可调用。
6、使用PyObject *Py_BuildValue(const char *format, ...)函数将C类型的数据结构转换成
Python对象,作为Python函数的参数,没有参数不需要调用
7、使用PyObject *PyObject_CallObject(PyObject *callable, PyObject *args)函数调用
Python函数,并获取返回值。
8、使用int PyArg_Parse(PyObject *args, const char *format, ...)函数将返回值转换为C类
型,并检查是否有错误,没有返回值时不需要调用。
9、使用void Py_DECREF(PyObject *o)函数释放所有引用的Python对象。
10、结束时调用void Py_Finalize()函数关闭Python解释器。
相关的函数参数说明参考网站(网站左上角输入函数名即可开始搜索):
https://docs.python.org/zh-cn/3/c-api/import.html
#endif

C对应的Python的数据类型转换对应的格式

|-------------|-------------|----------------|
| Format Code | Python Type | C/C++ Type |
| s | str | char* |
| z | str/None | char*/NULL |
| i | int | int |
| l | long | long |
| c | str | char |
| d | float | double |
| D | complex | Py_Complex* |
| O | (any) | Pyobject* |
| S | str | PyStringObject |

编译

bash 复制代码
gcc para.c -o para -I /usr/include/python3.10 -l python3.10
相关推荐
gfdgd xi16 小时前
deepin 终端,但是版本是 deepin 15 的
linux·python·架构·ssh·bash·shell·deepin
王六岁16 小时前
🐍 前端开发 0 基础学 Python 入门指南:条件语句篇
前端·python
java1234_小锋16 小时前
PyTorch2 Python深度学习 - 初识PyTorch2,实现一个简单的线性神经网络
开发语言·python·深度学习·pytorch2
高洁0116 小时前
大模型-模型压缩:量化、剪枝、蒸馏、二值化 (4)
人工智能·python·深度学习·aigc·transformer
王六岁16 小时前
# 🐍 前端开发 0 基础学Python小结 Python数据类型使用场景与用途指南
前端·python
luoganttcc16 小时前
用Python的trimesh库计算3DTiles体积的具体代码示例
开发语言·python·3d
Python私教17 小时前
C 语言进制转换全景指南
c语言·开发语言·arm开发
zhilin_tang19 小时前
Linux IPC 为什么要这么架构
linux·c语言·架构
小莞尔19 小时前
【51单片机】【protues仿真】基于51单片机自动售货机系统
c语言·单片机·嵌入式硬件·物联网·51单片机
我狸才不是赔钱货19 小时前
Python的“环境之殇”:从Venv到Conda的终极抉择
开发语言·python·conda