在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