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
相关推荐
Sandman6z2 小时前
uv python 卸载
开发语言·python·uv
三道杠卷胡2 小时前
【AI News | 20250521】每日AI进展
人工智能·python·计算机视觉·语言模型·aigc
Chocolate_men3 小时前
ftp、http下载远程文件(多线程、断点续传)
python·网络协议·http
看到我,请让我去学习4 小时前
数据结构—排序(斐波那契数列,冒泡,选择,插入,快速,归并,图,广度优先算法)
c语言·开发语言·数据结构·后端
时时三省4 小时前
【时时三省】(C语言基础)数组习题
c语言
测试19984 小时前
Selenium无法定位元素的几种解决方案详解
自动化测试·软件测试·python·selenium·测试工具·职场和发展·测试用例
花菜会噎住5 小时前
Python 计算机网络TCP网络应用程序开发
网络·python·tcp/ip·计算机网络·客户端·服务端
牛马的人生5 小时前
使用亮数据代理IP+Python爬虫批量爬取招聘信息训练面试类AI智能体(手把手教学版)
爬虫·python·tcp/ip·其他
leo_hush5 小时前
python查询elasticsearch 获取指定字段的值的list
python·elasticsearch