## 检测python解释器 ```txt cmake_minimum_required(VERSION 3.5 FATAL_ERROR) project(wang5) #找到python解释器 find_package(PythonInterp REQUIRED) #执行python命令并捕获它的输出和返回值 execute_process(COMMAND ${PYTHON_EXECUTABLE} "-c" "print('wangyuedong')" RESULT_VARIABLE _status OUTPUT_VARIABLE _output ERROR_QUIET OUTPUT_STRIP_TRAILING_WHITESPACE ) #将输出打印到屏幕 message(STATUS "RESULT_VARIABLE is: ${_status}") message(STATUS "OUTPUT_VARIABLE is: ${_output}") ``` ## 检测python库 以上使用python解释器来操作程序的输出,然后可以更高级一点,将解释语言python和编译语言C++组合到一起使用。有两种做法,第一种是扩展python,通过编译成共享库的C和C++模块提供新类型和方法。第二种是将python解释器嵌入到C和C++的程序中。两种方式都需要一些条件才可以实现。 - Python解释器的工作版本; - Python头文件python.h可用; - Python运行时库libpython。 这三个组件使用的python版本必须相同。 下面演示一下第二种方式,将python解释器嵌入到C程序中,程序wang_embedded_python.c。此代码将在程序中初始化Python解释器的实例,并使用Python的`time`模块,打印日期。 ```c #include int main(int argc, wchar_t *argv[]) { Py_SetProgramName(argv[0]); Py_Initialize(); PyRun_SimpleString("from time import time, ctime\n" "print('Today is', ctime(time()))"); Py_Finalize(); return 0; } ``` 编写 CMakeLists.txt ```bash cmake_minimum_required(VERSION 3.5 FATAL_ERROR) project(wang5 LANGUAGES C) set(CMAKE_C_STANDARD 99) set(CMAKE_C_EXTENSIONS OFF) set(CMAKE_C_STANDARD_REQUIRED ON) find_package(PythonInterp 3.5) find_package(PythonLibs ${PYTHON_VERSION_MAJOR}.${PYTHON_VERSION_MINOR} EXACT REQUIRED) add_executable(wang5 wang_embedded_python.c) target_include_directories(wang5 PRIVATE ${PYTHON_INCLUDE_DIRS}) target_link_libraries(wang5 PRIVATE ${PYTHON_LIBRARIES}) ``` cmake配置,make编译后的生成可执行文件 wang5。 ```bash ./wang5 Today is Thu Apr 14 16:17:01 2022 ``` ## 检测Python模块和包 前面的示例中,我们演示了如何检测Python解释器,以及如何编译一个简单的C程序(嵌入Python解释器)。通常,代码将依赖于特定的Python模块,无论是Python工具、嵌入Python的程序,还是扩展Python的库。科学界非常流行使用NumPy处理矩阵问题。依赖于Python模块或包的项目中,确定满足对这些Python模块的依赖非常重要。本示例将展示如何探测用户的环境,以找到特定的Python模块和包。