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

目录
相关文章
|
3月前
|
Python
探索Python中的魔法方法:打造你自己的自定义对象
【8月更文挑战第29天】在Python的世界里,魔法方法如同神秘的咒语,它们赋予了对象超常的能力。本文将带你一探究竟,学习如何通过魔法方法来定制你的对象行为,让你的代码更具魔力。
43 5
|
3月前
|
算法框架/工具 C++ Python
根据相机旋转矩阵求解三个轴的旋转角/欧拉角/姿态角 或 旋转矩阵与欧拉角(Euler Angles)之间的相互转换,以及python和C++代码实现
根据相机旋转矩阵求解三个轴的旋转角/欧拉角/姿态角 或 旋转矩阵与欧拉角(Euler Angles)之间的相互转换,以及python和C++代码实现
223 0
|
3天前
|
存储 JSON API
如何自定义Python环境变量?
如何自定义Python环境变量?
11 3
|
4月前
|
编译器 开发工具 C++
【Python】已解决error: Microsoft Visual C++ 14.0 or greater is required. Get it with “Microsoft C++ Build
【Python】已解决error: Microsoft Visual C++ 14.0 or greater is required. Get it with “Microsoft C++ Build
1902 0
|
1月前
|
C++ Python
探索Python与C/C++混合编程的艺术
探索Python与C/C++混合编程的艺术
36 1
|
2月前
|
jenkins 持续交付 Docker
docker之自定义制作镜像(python程序)
docker之自定义制作镜像(python程序)
|
2月前
|
Linux UED iOS开发
Python中的自定义进度条:从零开始
Python中的自定义进度条:从零开始
|
1月前
|
程序员 开发者 Python
深度解析Python中的元编程:从装饰器到自定义类创建工具
【10月更文挑战第5天】在现代软件开发中,元编程是一种高级技术,它允许程序员编写能够生成或修改其他程序的代码。这使得开发者可以更灵活地控制和扩展他们的应用逻辑。Python作为一种动态类型语言,提供了丰富的元编程特性,如装饰器、元类以及动态函数和类的创建等。本文将深入探讨这些特性,并通过具体的代码示例来展示如何有效地利用它们。
35 0
|
3月前
|
前端开发 Python
使用Python+openpyxl实现导出自定义样式的Excel文件
本文介绍了如何使用Python的openpyxl库导出具有自定义样式的Excel文件,包括设置字体、对齐方式、行列宽高、边框和填充等样式,并提供了完整的示例代码和运行效果截图。
120 1
使用Python+openpyxl实现导出自定义样式的Excel文件
WK
|
2月前
|
机器学习/深度学习 Java 程序员
为什么Python比C++慢很多?
Python相较于C++较慢主要体现在:动态类型系统导致运行时需解析类型,增加开销;作为解释型语言,逐行转换字节码的过程延长了执行时间;自动内存管理和垃圾回收机制虽简化操作但也带来了额外负担;全局解释器锁(GIL)限制了多线程性能;尽管Python库方便灵活,但在性能上往往不及C++底层库。然而,Python在某些领域如数据分析、机器学习中,凭借其高级别抽象和简洁语法仍表现出色。选语言需依据具体应用场景和需求综合考量。
WK
72 1