如何在Linux C程序中调用Python脚本?

在Linux环境下,使用C语言调用Python代码可以通过多种方法实现,主要包括直接调用Python语句、调用无参和有参Python函数,以下是详细的步骤和示例:

环境安装与检测

如何在Linux C程序中调用Python脚本?插图1
(图片来源网络,侵删)

1、安装libpython3的dev依赖库

不同版本的Ubuntu可能需要不同的Python版本,例如Ubuntu 22.04中是libpython3.10-dev

验证是否已安装Python3的dev包:

```bash

dpkg -l | grep libpython3

如何在Linux C程序中调用Python脚本?插图3
(图片来源网络,侵删)

```

输出示例:

```

ii libpython3.10-dev:amd64 3.10.12-1~22.04.2 amd64 Header files and a static library for Python (v3.10)

```

如何在Linux C程序中调用Python脚本?插图5
(图片来源网络,侵删)

若未安装,可通过以下命令进行安装:

```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

(0)
上一篇 2024年10月1日 07:19
下一篇 2024年10月1日 07:29

相关推荐