在Linux环境下,使用C语言调用Python代码可以通过多种方法实现,主要包括直接调用Python语句、调用无参和有参Python函数,以下是详细的步骤和示例:
环境安装与检测
(图片来源网络,侵删)
1、安装libpython3的dev依赖库:
不同版本的Ubuntu可能需要不同的Python版本,例如Ubuntu 22.04中是libpython3.10-dev
。
验证是否已安装Python3的dev包:
```bash
dpkg -l | grep libpython3
(图片来源网络,侵删)
```
输出示例:
```
ii libpython3.10-dev:amd64 3.10.12-1~22.04.2 amd64 Header files and a static library for Python (v3.10)
```
(图片来源网络,侵删)
若未安装,可通过以下命令进行安装:
```bash
sudo apt install libpython3.10-dev
```
C语言调用Python语句
1. 直接调用Python语句
示例代码(simpledemo.c):
#include <Python.h> int main() { Py_Initialize(); // 初始化Python解释器 PyRun_SimpleString("print('funny')"); // 执行Python语句 Py_Finalize(); // 释放资源 return 0; }
编译运行:
gcc simpledemo.c -o simpledemo -I/usr/include/python3.10 -lpython3.10 ./simpledemo
输出:
funny
2. 调用无参Python函数
假设有一个Python文件nopara.py:
def say_funny(): print('funny')
C语言调用示例(nopara.c):
#include <Python.h> int main() { Py_Initialize(); // 初始化Python解释器 // 将当前路径添加到sys.path中 PyObject *sys = PyImport_ImportModule("sys"); PyObject *path = PyObject_GetAttrString(sys, "path"); PyList_Append(path, PyUnicode_FromString(".")); // 导入nopara模块 PyObject *pModule = PyImport_ImportModule("nopara"); if (!pModule) { PyErr_Print(); printf("ERROR: failed to load nopara.py "); return 1; } // 获取say_funny函数对象 PyObject *pFunc = PyObject_GetAttrString(pModule, "say_funny"); if (!pFunc || !PyCallable_Check(pFunc)) { PyErr_Print(); printf("ERROR: function say_funny not found or not callable "); return 1; } // 调用函数并获取返回值 PyObject *pValue = PyObject_CallObject(pFunc, NULL); if (!pValue) { PyErr_Print(); printf("ERROR: function call failed "); return 1; } Py_DECREF(pValue); Py_DECREF(pFunc); Py_DECREF(pModule); Py_Finalize(); // 关闭Python解释器 return 0; }
编译运行:
gcc nopara.c -o nopara -I/usr/include/python3.10 -lpython3.10 ./nopara
输出:
funny
3. 调用有参Python函数
假设有一个Python文件para.py:
def say_funny(category): print(category) return category
C语言调用示例(para.c):
#include <Python.h> int main() { Py_Initialize(); // 初始化Python解释器 // 将当前路径添加到sys.path中 PyObject *sys = PyImport_ImportModule("sys"); PyObject *path = PyObject_GetAttrString(sys, "path"); PyList_Append(path, PyUnicode_FromString(".")); // 导入para模块 PyObject *pModule = PyImport_ImportModule("para"); if (!pModule) { PyErr_Print(); printf("ERROR: failed to load para.py "); return 1; } // 获取say_funny函数对象 PyObject *pFunc = PyObject_GetAttrString(pModule, "say_funny"); if (!pFunc || !PyCallable_Check(pFunc)) { PyErr_Print(); printf("ERROR: function say_funny not found or not callable "); return 1; } // 构造参数并调用函数 PyObject *pArgs = PyTuple_New(1); PyTuple_SetItem(pArgs, 0, PyUnicode_FromString("hello")); PyObject *pValue = PyObject_CallObject(pFunc, pArgs); if (!pValue) { PyErr_Print(); printf("ERROR: function call failed "); return 1; } // 打印返回值并释放资源 printf("Return value: %s ", PyUnicode_AsUTF8(pValue)); Py_DECREF(pValue); Py_DECREF(pArgs); Py_DECREF(pFunc); Py_DECREF(pModule); Py_Finalize(); // 关闭Python解释器 return 0; }
编译运行:
gcc para.c -o para -I/usr/include/python3.10 -lpython3.10 ./para
输出:
hello Return value: hello
以上就是关于“linux c 调用python”的问题,朋友们可以点击主页了解更多内容,希望可以够帮助大家!
本文来源于互联网,如若侵权,请联系管理员删除,本文链接:https://www.9969.net/64705.html