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
相关推荐
开源技术8 分钟前
深入了解Turso,这个“用Rust重写的SQLite”
人工智能·python
u0109272711 小时前
RESTful API设计最佳实践(Python版)
jvm·数据库·python
我材不敲代码5 小时前
Python实现打包贪吃蛇游戏
开发语言·python·游戏
0思必得07 小时前
[Web自动化] Selenium处理动态网页
前端·爬虫·python·selenium·自动化
韩立学长7 小时前
【开题答辩实录分享】以《基于Python的大学超市仓储信息管理系统的设计与实现》为例进行选题答辩实录分享
开发语言·python
qq_192779877 小时前
高级爬虫技巧:处理JavaScript渲染(Selenium)
jvm·数据库·python
u0109272718 小时前
使用Plotly创建交互式图表
jvm·数据库·python
爱学习的阿磊8 小时前
Python GUI开发:Tkinter入门教程
jvm·数据库·python
Imm7778 小时前
中国知名的车膜品牌推荐几家
人工智能·python
tudficdew8 小时前
实战:用Python分析某电商销售数据
jvm·数据库·python