赞
踩
通过C语言调用python代码,需要先安装libpython3的dev依赖库(不同的ubuntu版本下,python版本可能会有差异, 比如ubuntu 22.04里是libpython3.10-dev)。
首先可以通过以下命令验证是否是否已经存在python3的dev包:
dpkg -l | grep libpython3 | grep dev
如果已经安装,则会出现以下界面:
如果没有,则输入以下指令进行安装:
- sudo apt-get update
- sudo apt install libpython3.10-dev
- #include "Python.h"
-
- int main()
- {
- Py_Initialize(); // 初始化
- PyRun_SimpleString("print ('funny')");
- Py_Finalize(); //释放资源
- }
编译、运行
- gcc simpledemo.c -o simpledemo -I /usr/include/python3.10 -l python3.10
- //-I 指定解释器的路径 -l 指定解释器的版本
-
- ./simpledemo
- #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
编译
gcc -o nopara nopara.c -I /usr/include/python3.10 -l python3.10
- #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 |
编译
gcc para.c -o para -I /usr/include/python3.10 -l python3.10
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。