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
相关推荐
用户277844910499314 小时前
借助DeepSeek智能生成测试用例:从提示词到Excel表格的全流程实践
人工智能·python
JavaEdge在掘金16 小时前
ssl.SSLCertVerificationError报错解决方案
python
我不会编程55517 小时前
Python Cookbook-5.1 对字典排序
开发语言·数据结构·python
老歌老听老掉牙17 小时前
平面旋转与交线投影夹角计算
python·线性代数·平面·sympy
满怀101517 小时前
Python入门(7):模块
python
无名之逆17 小时前
Rust 开发提效神器:lombok-macros 宏库
服务器·开发语言·前端·数据库·后端·python·rust
你觉得20517 小时前
哈尔滨工业大学DeepSeek公开课:探索大模型原理、技术与应用从GPT到DeepSeek|附视频与讲义下载方法
大数据·人工智能·python·gpt·学习·机器学习·aigc
似水এ᭄往昔17 小时前
【C语言】文件操作
c语言·开发语言
啊喜拔牙17 小时前
1. hadoop 集群的常用命令
java·大数据·开发语言·python·scala
蒙奇D索大18 小时前
【数据结构】第六章启航:图论入门——从零掌握有向图、无向图与简单图
c语言·数据结构·考研·改行学it