IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> Python知识库 -> cmake的项目c++调用python方法 -> 正文阅读

[Python知识库]cmake的项目c++调用python方法

项目下载

cpp用cmake调用python方法的demo-C++文档类资源-CSDN下载

1. 使用

python3.6-config --ldflags 命令取得参数
#在控制台运行python3.6-config --ldflags 取得参数
#-L/usr/lib/python3.6/config-3.6m-x86_64-linux-gnu -L/usr/lib -lpython3.6m -lpthread -ldl  -lutil -lm  -Xlinker -export-dynamic -Wl,-O1 -Wl,-Bsymbolic-functions

2. 新建一个project,名字是cppCallPythonFunc(范例里放在/home/hao/Documents下)

3. cmake里添加头文件和动态库位置

cmake_minimum_required(VERSION 3.19)
project(cppCallPythonFunc)

#set(CMAKE_CXX_STANDARD 14)

# 用locate Python.h 取得头文件的位置之后可以使用 #include <Python.h>
include_directories(
   "/usr/include/python3.6m"
)


#在控制台运行python3.6-config --ldflags 取得参数
#-L/usr/lib/python3.6/config-3.6m-x86_64-linux-gnu -L/usr/lib -lpython3.6m -lpthread -ldl  -lutil -lm  -Xlinker -export-dynamic -Wl,-O1 -Wl,-Bsymbolic-functions

# 添加动态库的位置
LINK_DIRECTORIES("/usr/lib/python3.6/config-3.6m-x86_64-linux-gnu")
# LINK_DIRECTORIES("/usr/lib")

add_executable(runpy src/runpy.cpp src/runpy.h)
target_link_libraries(runpy -lpython3.6m)

4. 在项目下新建script文件夹,新建pyUtil.py

def multiply(a,b):
    print("python multiply will compute", str(a), "times", str(b))
    res=a*b
    print("python multiply result:", res)
    return res

5. 在项目下新建src文件夹,放入

runpy.h

#ifndef DEMO_RUNPY_H
#define DEMO_RUNPY_H


#include <Python.h>

void run_from_simple_str();
double run_with_return();

#endif //DEMO_RUNPY_H

runpy.cpp

//
// Created by hao on 2022/5/5.
//

#include "runpy.h"
double run_with_return();
void run_from_simple_str();


int main()
{
    run_from_simple_str();
    double result=run_with_return();
    printf("Result of call: %f\n", result);

}

void run_from_simple_str() {
    Py_Initialize();
//    如果无需接收返回值可以直接用PyRun_SimpleString
    PyRun_SimpleString("import sys\n"
                       "sys.path.append('/home/hao/Documents/cppCallPythonFunc/script')\n"
                       "import pyUtil\n"
                       "print(pyUtil.multiply(1, 2))");
    Py_Finalize();
}

double run_with_return() {
    PyObject *pName, *pModule, *pFunc;
    PyObject *pArgs, *param_value1, *param_value2, *pValue_result;
    double result;
    //初始化
    Py_Initialize();

//    init_numpy();
    if ( !Py_IsInitialized() )
    {
        fprintf(stderr, "Py_Initialize Failed ");
        return -1;
    }


    // 导入文件目录
    PyRun_SimpleString("import sys");
    PyRun_SimpleString("sys.path.append('/home/hao/Documents/cppCallPythonFunc/script')");
//    PyRun_SimpleString("print(sys.path)");

    const char * module_name="pyUtil";

//    优先使用这个方法取得module
    pModule = PyImport_ImportModule(module_name);
    
//    以下2个方法是备用的
    if (pModule == NULL)
        pModule = PyImport_Import(PyUnicode_FromString(module_name));

    if (pModule == NULL)
        pModule = PyImport_Import(PyBytes_FromString(module_name));

    if (pModule == NULL) {
        PyErr_Print();
        fprintf(stderr, "检查sys.path是否包含模块的路径");
        return 1;
    }
    else{
        // 从模块中获取函数
        const char * func_name="multiply";
        pFunc = PyObject_GetAttrString(pModule,func_name);


        if (pFunc && PyCallable_Check(pFunc)) {
            // 创建参数元组
//            2 个参数,输入第一个参数2.8,第二个参数7.2。7预期返回2.8*7.2=
            pArgs = PyTuple_New(2);
            param_value1=PyFloat_FromDouble(2.8);
            param_value2=PyFloat_FromDouble(7.2);
//            param_value2=PyLong_FromLong(7.2);
            PyTuple_SetItem(pArgs, 0, param_value1);
            PyTuple_SetItem(pArgs, 1, param_value2);

            pValue_result = PyObject_CallObject(pFunc, pArgs);

            Py_DECREF(pArgs);
            if (pValue_result != NULL) {
//                long result =PyLong_AsLong(pValue_result);
                result = PyFloat_AsDouble(pValue_result);
//                printf("Result of call: %f\n", result);
                Py_DECREF(pValue_result);
            }
            else {
                Py_DECREF(pFunc);
                Py_DECREF(pModule);
                PyErr_Print();
                fprintf(stderr,"Call failed\n");
                result=-1;
            }
        }
        else {
            if (PyErr_Occurred())
                PyErr_Print();
            fprintf(stderr, "Cannot find func");
        }
        Py_XDECREF(pFunc);
        Py_DECREF(pModule);
    }

    // 反初始化
    Py_Finalize();
    return result;
}

  Python知识库 最新文章
Python中String模块
【Python】 14-CVS文件操作
python的panda库读写文件
使用Nordic的nrf52840实现蓝牙DFU过程
【Python学习记录】numpy数组用法整理
Python学习笔记
python字符串和列表
python如何从txt文件中解析出有效的数据
Python编程从入门到实践自学/3.1-3.2
python变量
上一篇文章      下一篇文章      查看所有文章
加:2022-05-08 08:03:10  更:2022-05-08 08:03:54 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/15 15:30:57-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码