c++调用python和numpy混合编程

目录

  • 1. cmake 配置
  • 2. python脚本
  • 3. c++头文件初始化
  • 4. c++调用python中的函数,实现功能
  • 参考

在现代软件开发中,跨语言编程和混合编程的需求日益增长。C++作为一种高效、强大的编程语言,广泛应用于底层开发、游戏引擎、高性能计算等领域。而Python则因其简洁的语法、丰富的库和易于学习的特性,在数据科学、机器学习、Web开发等领域占据重要地位。NumPy是Python中一个用于数值计算的库,提供了大量的数学函数以及多维数组和矩阵运算的功能,是数据科学领域的核心工具之一。

为了满足在C++项目中利用Python和NumPy能力的需求,开发者们可以采用混合编程的方式,即让C++代码调用Python脚本,并在Python脚本中利用NumPy库进行数值计算。这种编程方式结合了C++和Python的优势,使得开发者能够在一个项目中同时利用C++的高性能和Python的丰富功能。

实现方式:

使用Python/C API:Python提供了一套C API,允许C/C++代码直接调用Python代码。开发者可以通过这些API来初始化Python解释器、加载Python模块、调用Python函数等。但是,这种方式需要开发者对Python的内部机制有较深的了解,编程难度较大。

在C++调用Python并使用NumPy的场景中,开发者通常需要在Python脚本中定义好需要使用的NumPy函数,并在C++代码中通过API或第三方库来加载和执行这些脚本。这样,C++代码就可以通过Python脚本间接地利用NumPy库的功能了。

应用场景:

高性能计算:在某些高性能计算场景中,C++代码负责处理大量数据,而Python和NumPy则用于进行复杂的数学运算或数据分析。通过混合编程,可以将这两者的优势结合起来,提高整体计算效率。
机器学习:在机器学习中,Python和NumPy是常用的工具。但是,在某些情况下,需要使用C++进行底层优化或与其他系统进行交互。通过混合编程,可以在保持Python和NumPy便利性的同时,利用C++的优势来提升性能或实现特定的功能。
数据可视化:在数据可视化领域,Python有许多优秀的库(如Matplotlib)可以用于生成高质量的图表。而C++则常用于实时渲染和交互式界面开发。通过混合编程,可以将C++的界面与Python的数据可视化功能结合起来,为用户提供更好的体验。

1. cmake 配置

# main CMakeLists.txt
cmake_minimum_required(VERSION 3.20 FATAL_ERROR)

project(TEST)
# set(CMAKE_BUILD_TYPE "Debug") # 用于debug
set(CMAKE_CXX_STANDARD 14)

set(MPI_C_COMPILER_INCLUDE_DIRS /opt/hpcx/ompi/include CACHE PATH "")

add_subdirectory(src)

add_executable(TEST main.cpp)

target_link_libraries(TEST mycpp pthread stdc++fs)
target_include_directories(TEST PUBLIC ${MYCPP_INCLUDE_DIR})
target_link_directories(TEST PUBLIC ${VTK_LIBRARY_DIRS} ${OPENCV_LIBRARY_DIRS} ${PCLFUNCTION_DIR} ${PCL_INCLUDE_DIRS})
# sub CMakeLists.txt
project(TEST)

set(MYCPP_INCLUDE_DIR ${CMAKE_CURRENT_SOURCE_DIR} CACHE PATH "")
message(STATUS "MYCPP_INCLUDE_DIR : ${MYCPP_INCLUDE_DIR }")
find_package( OpenCV REQUIRED )
find_package(VTK REQUIRED)
find_package(PCL REQUIRED)

# set(Python3_ROOT_DIR "/opt/conda/envs/xxx/bin/python")
find_package(Python3 3.10 COMPONENTS Interpreter Development NumPy REQUIRED)

set(Python3_EXECUTABLE Python3::Interpreter)

message(STATUS "Python3_ROOT_DIR: ${Python3_ROOT_DIR}")
message(STATUS "Python3_INCLUDE_DIRS: ${Python3_INCLUDE_DIRS}")
message(STATUS "Python3_LIBRARIES: ${Python3_LIBRARIES}")
message(STATUS "Python3_LIBRARY_DIRS: ${Python3_LIBRARY_DIRS}")
message(STATUS "Python3_NumPy_FOUND: ${Python3_NumPy_FOUND}")
message(STATUS "Python3_NumPy_INCLUDE_DIRS: ${Python3_NumPy_INCLUDE_DIRS}")
message(STATUS "Python3_NumPy_VERSION: ${Python3_NumPy_VERSION}")


add_library(mycpp SHARED mycpp.cpp mycpp.h)
target_link_libraries(mycpp ${OpenCV_LIBS} pclFunction pthread ${Python3_LIBRARIES} Python3::NumPy) # ${PYTHON_LIBRARIES} ${Boost_LIBRARIES}
target_include_directories(mycpp PUBLIC ${PCL_INCLUDE_DIRS} ${PCLFUNCTION_DIR} ${Python3_INCLUDE_DIRS})

2. python脚本

python接收c++传入,并返回计算后的结果给c

你可能感兴趣的:(c++,python,c++,python,numpy)