检测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模块和包。