CMake:检测python模块和包

news2024/9/23 21:29:20

CMake:检测python模块和包

  • 导言
  • 项目结构
  • CMakeLists.txt
  • 相关源码

导言

上一篇,我们基本了解了如何去检测python的解释器和python库。通常,代码是依赖于特定的python模块,无论是python工具、嵌入python的程序,还是扩展python的库。例如,numpy包。依赖于python模块或包的项目中,确定满足对这些python模块的依赖非常重要。

项目结构

.
├── CMakeLists.txt
├── py3_pure_embedding.cpp
└── use_numpy.py

项目地址:

https://gitee.com/jiangli01/tutorials/tree/master/cmake-tutorial/chapter3/03

CMakeLists.txt

在这里插入图片描述

execute_process(
    COMMAND ${PYTHON_EXECUTABLE} "-c" "import re, numpy; print(re.compile('/__init__.py.*').sub('',numpy.__file__))"
    RESULT_VARIABLE numpy_status
    OUTPUT_VARIABLE numpy_location
    ERROR_QUIET
    OUTPUT_STRIP_TRAILING_WHITESPACE
)

使用了CMakeexecute_process函数来运行一个python脚本。该脚本导入了renumpy模块,然后使用re.compile函数来替换numpy模块路径中的一个模式。RESULT_VARIABLE用于捕获python脚本执行的状态,而OUTPUT_VARIABLE用于捕获修改后的numpy模块文件的位置。通过使用ERROR_QUIET来抑制进程生成的任何错误,并且使用OUTPUT_STRIP_TRAILING_WHITESPACE来移除输出中的尾随空格。

if(NOT numpy_status)
    set(NumPy ${numpy_location} CACHE STRING "Location of NumPy")
endif()

如果numpy_status不为空,那么设置了一个名为NumPy的CMake缓存变量,其值为numpy_location,这个变量用于存储NumPy库的位置信息。这个操作允许在CMake配置过程中指定NumPy的位置,以便后续的构建过程可以使用它。如果numpy_status为空,则不进行任何操作。

execute_process(
    COMMAND ${PYTHON_EXECUTABLE} "-c" "import numpy; print(numpy.__version__)"
    OUTPUT_VARIABLE numpy_version
    ERROR_QUIET
    OUTPUT_STRIP_TRAILING_WHITESPACE
)

这段代码使用execute_process命令来执行一个python脚本。

  • ${PYTHON_EXECUTABLE} 是一个CMake变量,用于指定python可执行文件的路径。
  • -c 选项告诉python解释器后面紧跟着的字符串是要执行的python代码。
  • 在这个python代码中,首先导入了numpy库,然后使用print函数输出了numpy库的版本号。
  • OUTPUT_VARIABLE 选项用于捕获python代码的输出,即numpy库的版本号。
  • ERROR_QUIET 选项用于忽略可能的错误信息。
  • OUTPUT_STRIP_TRAILING_WHITESPACE 选项用于移除输出字符串末尾的空格。

通过这个操作,可以在CMake配置过程中获取并保存numpy库的版本号,以便后续的构建过程可以使用。

add_custom_command(
  OUTPUT
      ${CMAKE_CURRENT_BINARY_DIR}/use_numpy.py
  COMMAND
      ${CMAKE_COMMAND} -E copy_if_different ${CMAKE_CURRENT_SOURCE_DIR}/use_numpy.py
      ${CMAKE_CURRENT_BINARY_DIR}/use_numpy.py
  DEPENDS
      ${CMAKE_CURRENT_SOURCE_DIR}/use_numpy.py
)

使用 CMake 中的 add_custom_command 命令,用于定义自定义的构建步骤,以及生成相应的输出文件。

  • OUTPUT 指定了生成的输出文件,这里是 ${CMAKE_CURRENT_BINARY_DIR}/use_numpy.py
  • COMMAND 指定了生成输出文件所需要执行的命令,这里是将 ${CMAKE_CURRENT_SOURCE_DIR}/use_numpy.py 复制到 ${CMAKE_CURRENT_BINARY_DIR}/use_numpy.py
  • DEPENDS 列出了生成输出文件所依赖的文件,这里是 ${CMAKE_CURRENT_SOURCE_DIR}/use_numpy.py

这段代码的作用是在构建过程中,如果 ${CMAKE_CURRENT_SOURCE_DIR}/use_numpy.py 发生变化,就执行指定的命令来将该文件复制到构建目录 ${CMAKE_CURRENT_BINARY_DIR} 下的相同路径。这可以确保在构建过程中,始终使用最新的 use_numpy.py 文件。

target_sources(pure-embedding
  PRIVATE ${CMAKE_CURRENT_BINARY_DIR}/use_numpy.py
)

CMake 的构建过程中为名为 pure-embedding 的目标(通常是一个可执行文件或库)指定了源文件。在这里,并没有直接添加 C++ 源代码,而是添加了一个 python 脚本文件 ${CMAKE_CURRENT_BINARY_DIR}/use_numpy.py

这意味着在构建 pure-embedding 目标时,CMake 会将 ${CMAKE_CURRENT_BINARY_DIR}/use_numpy.py 视为目标的源文件之一,并确保在构建过程中该文件已经生成。

相关源码

py3_pure_embedding.cpp
在这里插入图片描述
use_numpy.py
在这里插入图片描述
最后:希望大家都勇于向邪恶势力作斗争!!!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/854907.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Spring Boot 项目应用消息服务器RabbitMQ(简单介绍)

一、背景 本章讲述的是在用户下单环节,消息服务器RabbitMQ 的应用 1.1 消息服务器的应用 在写一个电商项目的小demo,在电商项目中,消息服务器的应用: 1、订单状态通知:当用户下单、支付成功、订单发货、订单完成等…

训练、验证和测试一句话搞懂

文章目录 训练集(training dataset)验证集(validation dataset)测试集(test dataset)训练集可划分为训练集和验证集二二六,一一八,一一一百 训练集(training dataset) 类比课堂知识,训练模型得…

Python中enumerate用法详解

目录 1.简介 2.语法 3.参数 4.返回值 5.详解 6.实例 7.补充 1.简介 enumerate() 函数用于将一个可遍历的数据对象(如列表、元组或字符串)组合为一个索引序列,同时列出数据和数据下标,一般用在 for 循环当中。 2.语法 以下是 enumerate() 方法的语…

勘探开发人工智能应用:人工智能概述

0 提纲 机器学习、深度学习、计算机视觉等技术已在勘探开发、油气生产、炼油炼化、经营管理等重点环节进行应用与推广。请思考: 输入:数据是什么(数字、文本、图)?如何理解数据?如何清洗数据?(需要专业领域知识)输出&…

鉴权服务-天G报错引发的感想:一定要有如果报错的预案

今天是HW第一天,下午运维人员说鉴权服务上不去了,看了眼天宫,结果重启了,后来的情况就是20多分钟半小时一重启,真么神奇。开始排查原因: 1、前两天发版换的agent版本发布,但是不知道有没有这个…

【Winform学习笔记(六)】warning MSB3274:引用dll版本冲突

warning MSB3274:引用dll版本冲突 前言正文1、解决方法 前言 在本文中主要介绍 解决 类库编译 Warning MSB3274 的方法; 在项目中引用了自定义控件库,界面设计时可以正常放置删除控件,但启动时会报异常; 编译提示&…

Selenium 是什么?简单明了的介绍

Selenium Selenium 是什么 Selenium 是一款 Web UI 测试工具,是一款 自动化测试 工具,使用 Selenium 测试工具进行的测试通常被称为 Selenium Testing,各种支持如下列表: UI 元素的支持与管理:自写代码实现浏览器支…

(八)穿越多媒体奇境:探索Streamlit的图像、音频与视频魔法

文章目录 1 前言2 st.image:嵌入图像内容2.1 图像展示与描述2.2 调整图像尺寸2.3 使用本地文件或URL 3 st.audio:嵌入音频内容3.1 播放音频文件3.2 生成音频数据播放 4 st.video:嵌入视频内容4.1 播放视频文件4.2 嵌入在线视频 5 结语&#x…

c语言每日一练(4)

五道选择题 1、有以下代码&#xff0c;程序的输出结果是( ) #include <stdio.h> int main() {int a 0, b 0;for (a 1, b 1; a < 100; a){if (b > 20) break;//1if (b % 3 1)//2{b b 3;continue;}b b-5;//3}printf("%d\n", a);return 0; } A.1…

JavaWeb(11)——前端综合案例5(小黑记事本)

一、实例需求 ⌛ 功能需求&#xff1a; ① 列表渲染 ② 删除功能 ③ 添加功能 ④ 底部统计 和 清空任务 二、代码实现 ☕ <!DOCTYPE html> <html lang"en"> <head> <meta charset"UTF-8" /> <meta http-equiv"X-UA-Compa…

intelJ IDEA\PHPStorm \WebStorm\PyCharm 通过ssh连接远程Mysql\Postgresql等数据库

最容易出错的地方是在general面板下的host&#xff0c;不应该填真实的host地址&#xff0c;而应该填localhost或者127.0.0.1 具体操作步骤见下图

swagger 3.0 学习笔记

引入pom <dependency><groupId>io.springfox</groupId><artifactId>springfox-boot-starter</artifactId><version>3.0.0</version></dependency>配置 import io.swagger.models.auth.In; import io.swagger.v3.oas.annotati…

SpringBoot Thymeleaf模板引擎

Thymeleaf 模板引擎 前端交给我们的页面&#xff0c;是html页面。如果是我们以前开发&#xff0c;我们需要把他们转成jsp页面&#xff0c;jsp好处就是当我们查出一些数据转发到JSP页面以后&#xff0c;我们可以用jsp轻松实现数据的显示&#xff0c;及交互等。 jsp支持非常强大…

1077 Kuchiguse

PTA | 程序设计类实验辅助教学平台 一个测试点没过&#xff0c;不知道哪的原因 #include<bits/stdc.h> using namespace std; const int N210; int n; string s[N]; string str[N]; string ans; int main() {int len300;scanf("%d",&n);getchar();for(int…

[C初阶笔记]P1

什么是C语言 1、机器语言&#xff08;二进制&#xff09;>汇编语言&#xff08;助记符&#xff09;>高级语言&#xff08;C、C等&#xff09; 2、c语言擅长底层软件开发&#xff08;操作系统、驱动程序&#xff09;&#xff0c;并不意味着不能开发其他。 C语言更贴近操作…

linux挂载sd卡

1、确定设备名&#xff1a;打开终端窗口&#xff0c;运行以下命令来查看已连接的存储设备列表 rootws:/# lsblk NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINTmmcblk1 179:0 0 7.3G 0 disk |-mmcblk1p1 179:1 0 70M 0 part -mmcblk1p2 179:2 0…

用datagrip远程连接mysql超时怎么解决【连接mysql会遇到的坑】

目录 一.开放端口 【1】在linux打开防火墙或开放3306端口&#xff08;其实一般情况下服务器里的防火墙并没有开启&#xff09;​编辑 【2】在控制台的云安全组里开放端口 二.修改datagrip连接时高级的useSSL属性 先填好主机&#xff08;就是IP地址&#xff09;和端口&#…

ProComponent 用法学习

相信很多同学都用过 Ant Design 这一 react 著名组件库&#xff0c;而 ProComponents 则是在 antd 之上进行封装的页面级组件库&#xff08;指一个组件就可以搞定一个页面&#xff09;。它同时也是 Ant Design Pro 中后台框架所用的主要组件库。如果你手上有要用 react 开发的中…

Pytorch深度学习-----现有网络模型的使用及修改(VGG16模型)

系列文章目录 PyTorch深度学习——Anaconda和PyTorch安装 Pytorch深度学习-----数据模块Dataset类 Pytorch深度学习------TensorBoard的使用 Pytorch深度学习------Torchvision中Transforms的使用&#xff08;ToTensor&#xff0c;Normalize&#xff0c;Resize &#xff0c;Co…

photoshop PS 查看像素坐标、像素颜色、像素HSB颜色

方法一 photoshop 菜单栏 窗口菜单->信息菜单项(F8), 在信息窗口里会有当前的 x&#xff0c;y坐标 方法二 photoshop 菜单栏 视图菜单->标尺菜单项&#xff08;ctrlR&#xff09; 宽度和高度边上都有标尺&#xff0c;默认的是厘米&#xff0c;右键单机宽度和高度边上…