C++调用Python自定义函数

简介: C++调用Python自定义函数

环境

C++ 14,Python 3.1 ,使用CMake构建

CMakeLists.txt:

cmake_minimum_required(VERSION 3.22)
project(pythonTest)
# Python环境配置
find_package(Python3 COMPONENTS Interpreter Development REQUIRED)
include_directories(${PYTHON_INCLUDE_DIR})

set(CMAKE_CXX_STANDARD 14)
add_executable(pythonTest main.cpp)

# 不加会导致运行时找不到定义
target_include_directories(${PROJECT_NAME} PRIVATE ${Python3_INCLUDE_DIRS})
target_link_libraries(${PROJECT_NAME} ${Python3_LIBRARIES})

调用

main.cpp

#include <iostream>
#include <Python.h>

int main() {
    //初始化Python环境
    Py_Initialize();
    std::string result;
    //追加python文件路径至Python环境
    PyObject *sysPath = PySys_GetObject("path");
    PyList_Append(sysPath, PyUnicode_FromString("D:/"));
    //导入Python文件
    PyObject *pModule = PyImport_ImportModule("c_plus_test");
    if (pModule != NULL) {
        //获取函数
        PyObject *pFunc = PyObject_GetAttrString(pModule, "call_python");
        if (pFunc != NULL) {
            PyObject *myResult = PyObject_CallObject(pFunc, NULL);
            //转换结果至c++字符串
            result = PyUnicode_AsUTF8(myResult);
            Py_DECREF(myResult);
        } else {
            std::cout << "call python function fail!!!!" << std::endl;
        }
        Py_DECREF(pFunc);
    } else {
        std::cout << "import module fail!!!!" << std::endl;
    }
    std::cout << "get python reault:" << result << std::endl;
    //释放资源
    Py_DECREF(sysPath);
    Py_DECREF(pModule);
    Py_Finalize();
    return 0;
}
Python3中去掉了PyString_AsString使用PyUnicode_AsUTF8转换字符串

c_plus_test.py

import os

def call_python():
    helloStr = "Hello in Python";
    print('Hello in Python');
    return helloStr;

参考资料

https://zhuanlan.zhihu.com/p/149887203

https://blog.csdn.net/iamqianrenzhan/article/details/86516440

目录
相关文章
|
9月前
|
jenkins Java Shell
Java、Python、C++支持jenkins和SonarQube(全集)
Jenkins 是一个开源的持续集成(CI)和持续交付(CD)工具,用于自动化构建、测试和部署软件项目。它基于 Java 开发,支持跨平台运行,并拥有丰富的插件生态系统,可以灵活地扩展功能
781 1
|
9月前
|
jenkins Shell 测试技术
|
9月前
|
jenkins Java 持续交付
Java、Python、C++支持Jenkins和SonarQube(三)
Python与Jenkins和SonarQube
439 1
|
9月前
|
jenkins Java 测试技术
|
9月前
|
缓存 监控 供应链
唯品会自定义 API 自定义操作深度分析及 Python 实现
唯品会开放平台提供丰富API,支持商品查询、订单管理、促销活动等电商全流程操作。基于OAuth 2.0认证机制,具备安全稳定的特点。通过组合调用基础接口,可实现数据聚合、流程自动化、监控预警及跨平台集成,广泛应用于供应链管理、数据分析和智能采购等领域。结合Python实现方案,可高效完成商品搜索、订单分析、库存监控等功能,提升电商运营效率。
|
9月前
|
安全 jenkins Java
Java、Python、C++支持jenkins和SonarQube(一)
Jenkins 是一个开源的 持续集成(CI)和持续交付(CD) 工具,用于自动化构建、测试和部署软件项目。它基于 Java 开发,支持跨平台运行,并拥有丰富的插件生态系统,可以灵活地扩展功能
521 5
|
9月前
|
缓存 监控 供应链
京东自定义 API 操作深度分析及 Python 实现
京东开放平台提供丰富API接口,支持商品、订单、库存等电商全链路场景。通过自定义API组合调用,可实现店铺管理、数据分析、竞品监控等功能,提升运营效率。本文详解其架构、Python实现与应用策略。
缓存 监控 供应链
299 0
缓存 监控 数据挖掘
208 0
|
缓存 Shell 开发工具
[oeasy]python071_我可以自己做一个模块吗_自定义模块_引入模块_import_diy
本文介绍了 Python 中模块的导入与自定义模块的创建。首先,我们回忆了模块的概念,即封装好功能的部件,并通过导入 `__hello__` 模块实现了输出 &quot;hello world!&quot; 的功能。接着,尝试创建并编辑自己的模块 `my_file.py`,引入 `time` 模块以获取当前时间,并在其中添加自定义输出。
461 5

推荐镜像

更多