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

目录
相关文章
|
21天前
|
缓存 Shell 开发工具
[oeasy]python071_我可以自己做一个模块吗_自定义模块_引入模块_import_diy
本文介绍了 Python 中模块的导入与自定义模块的创建。首先,我们回忆了模块的概念,即封装好功能的部件,并通过导入 `__hello__` 模块实现了输出 &quot;hello world!&quot; 的功能。接着,尝试创建并编辑自己的模块 `my_file.py`,引入 `time` 模块以获取当前时间,并在其中添加自定义输出。
23 4
|
1月前
|
算法 Serverless 数据处理
从集思录可转债数据探秘:Python与C++实现的移动平均算法应用
本文探讨了如何利用移动平均算法分析集思录提供的可转债数据,帮助投资者把握价格趋势。通过Python和C++两种编程语言实现简单移动平均(SMA),展示了数据处理的具体方法。Python代码借助`pandas`库轻松计算5日SMA,而C++代码则通过高效的数据处理展示了SMA的计算过程。集思录平台提供了详尽且及时的可转债数据,助力投资者结合算法与社区讨论,做出更明智的投资决策。掌握这些工具和技术,有助于在复杂多变的金融市场中挖掘更多价值。
60 12
|
2月前
|
数据挖掘 数据处理 开发者
Python3 自定义排序详解:方法与示例
Python的排序功能强大且灵活,主要通过`sorted()`函数和列表的`sort()`方法实现。两者均支持`key`参数自定义排序规则。本文详细介绍了基础排序、按字符串长度或元组元素排序、降序排序、多条件排序及使用`lambda`表达式和`functools.cmp_to_key`进行复杂排序。通过示例展示了如何对简单数据类型、字典、类对象及复杂数据结构(如列车信息)进行排序。掌握这些技巧可以显著提升数据处理能力,为编程提供更强大的支持。
61 10
|
7月前
|
Python
探索Python中的魔法方法:打造你自己的自定义对象
【8月更文挑战第29天】在Python的世界里,魔法方法如同神秘的咒语,它们赋予了对象超常的能力。本文将带你一探究竟,学习如何通过魔法方法来定制你的对象行为,让你的代码更具魔力。
76 5
|
7月前
|
算法框架/工具 C++ Python
根据相机旋转矩阵求解三个轴的旋转角/欧拉角/姿态角 或 旋转矩阵与欧拉角(Euler Angles)之间的相互转换,以及python和C++代码实现
根据相机旋转矩阵求解三个轴的旋转角/欧拉角/姿态角 或 旋转矩阵与欧拉角(Euler Angles)之间的相互转换,以及python和C++代码实现
552 0
|
4月前
|
Python
在Python中,自定义函数可以抛出自定义异常
在Python中,自定义函数可以抛出自定义异常
96 5
|
4月前
|
存储 开发者 Python
自定义Python的异常
自定义Python的异常
48 5
|
4月前
|
存储 JSON API
如何自定义Python环境变量?
如何自定义Python环境变量?
97 3
|
5月前
|
C++ Python
探索Python与C/C++混合编程的艺术
探索Python与C/C++混合编程的艺术
120 1
|
6月前
|
jenkins 持续交付 Docker
docker之自定义制作镜像(python程序)
docker之自定义制作镜像(python程序)

热门文章

最新文章