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

目录
相关文章
|
16天前
|
存储 开发者 Python
Python中的collections模块与UserDict:用户自定义字典详解
【4月更文挑战第2天】在Python中,`collections.UserDict`是用于创建自定义字典行为的基类,它提供了一个可扩展的接口。通过继承`UserDict`,可以轻松添加或修改字典功能,如在`__init__`和`__setitem__`等方法中插入自定义逻辑。使用`UserDict`有助于保持代码可读性和可维护性,而不是直接继承内置的`dict`。例如,可以创建一个`LoggingDict`类,在设置键值对时记录操作。这样,开发者可以根据具体需求定制字典行为,同时保持对字典内部管理的抽象。
|
2月前
|
C++ 计算机视觉 Python
我在Python中丢的面子被我用C++找回来了
我在Python中丢的面子被我用C++找回来了
28 0
|
2月前
|
存储 计算机视觉 异构计算
使用python&C++对bubbliiiing的yolo系列进行opencv.dnn进行推理部署
使用python&C++对bubbliiiing的yolo系列进行opencv.dnn进行推理部署
36 0
|
11天前
|
人工智能 机器人 C++
【C++/Python】Windows用Swig实现C++调用Python(史上最简单详细,80岁看了都会操作)
【C++/Python】Windows用Swig实现C++调用Python(史上最简单详细,80岁看了都会操作)
|
28天前
|
编译器 测试技术 C++
【Python 基础教程 01 全面介绍】 Python编程基础全攻略:一文掌握Python语法精髓,从C/C++ 角度学习Python的差异
【Python 基础教程 01 全面介绍】 Python编程基础全攻略:一文掌握Python语法精髓,从C/C++ 角度学习Python的差异
157 0
|
16天前
|
C++ Python
【C++/Python】C++调用python文件
【C++/Python】C++调用python文件
|
1月前
|
数据采集 存储 搜索推荐
使用Python构建自定义搜索引擎:从数据抓取到索引与搜索
使用Python构建自定义搜索引擎:从数据抓取到索引与搜索
51 0
|
2月前
|
存储 Java Go
对比 C++ 和 Python,谈谈指针与引用
对比 C++ 和 Python,谈谈指针与引用
55 1
|
2月前
|
机器学习/深度学习 JSON 自然语言处理
python自动化标注工具+自定义目标P图替换+深度学习大模型(代码+教程+告别手动标注)
python自动化标注工具+自定义目标P图替换+深度学习大模型(代码+教程+告别手动标注)
46 0
|
2月前
|
C++ 计算机视觉 Python
【Py调用C++】使用使用python调用C++生成dll处理图像(OPENCV)
【Py调用C++】使用使用python调用C++生成dll处理图像(OPENCV)
37 0
【Py调用C++】使用使用python调用C++生成dll处理图像(OPENCV)

热门文章

最新文章