检测python解释器
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
| 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
模块,打印日期。
1 2 3 4 5 6 7 8 9 10 11 12
| #include <Python.h>
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
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
| 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。
1 2
| ./wang5 Today is Thu Apr 14 16:17:01 2022
|
检测Python模块和包
前面的示例中,我们演示了如何检测Python解释器,以及如何编译一个简单的C程序(嵌入Python解释器)。通常,代码将依赖于特定的Python模块,无论是Python工具、嵌入Python的程序,还是扩展Python的库。科学界非常流行使用NumPy处理矩阵问题。依赖于Python模块或包的项目中,确定满足对这些Python模块的依赖非常重要。本示例将展示如何探测用户的环境,以找到特定的Python模块和包。