CMake:检测python模块和包
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_statusOUTPUT_VARIABLE numpy_locationERROR_QUIETOUTPUT_STRIP_TRAILING_WHITESPACE
)
使用了CMake的execute_process函数来运行一个python脚本。该脚本导入了re和numpy模块,然后使用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_versionERROR_QUIETOUTPUT_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.pyCOMMAND${CMAKE_COMMAND} -E copy_if_different ${CMAKE_CURRENT_SOURCE_DIR}/use_numpy.py${CMAKE_CURRENT_BINARY_DIR}/use_numpy.pyDEPENDS${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-embeddingPRIVATE ${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

最后:希望大家都勇于向邪恶势力作斗争!!!
相关文章:
CMake:检测python模块和包
CMake:检测python模块和包 导言项目结构CMakeLists.txt相关源码 导言 上一篇,我们基本了解了如何去检测python的解释器和python库。通常,代码是依赖于特定的python模块,无论是python工具、嵌入python的程序,还是扩展python的库。…...
02Mysql之多表查询--例题讲解
一、题目详情,以及表的建立 新增员工表emp和部门表deptcreate table dept (dept1 int ,dept_name varchar(11));create table emp (sid int ,name varchar(11),age int,worktime_start date,incoming int,dept2 int);insert into dept values(101,财务),(102,销售)…...
虹科方案 | 汽车总线协议转换解决方案
汽车总线: 汽车总线是一种用于在车辆电子系统中传输数据和控制信息的通信系统。它允许不同的电子控制单元(ECU)在车辆中相互通信,协调各个系统的操作,以实现功能的集成和协同工作。 在现代汽车中,综合通信…...
Mr. Cappuccino的第59杯咖啡——简单手写SpringIOC框架
简单手写SpringIOC框架 环境搭建基于XML方式项目结构项目代码运行结果 基于注解方式项目结构项目代码运行结果 简单手写SpringIOC框架核心原理基于XML方式原理项目结构项目代码运行结果 基于注解方式原理项目结构项目代码运行结果 环境搭建 基于XML方式 项目结构 项目代码 p…...
爬虫 学习HTML标签和元素的基本概念,了解网页的结构和内容
HTML(Hypertext Markup Language)是一种用于创建网页的标记语言,由一系列的标签组成。标签使用尖括号(< 和 >)包围,并且通常成对出现,一个是开始标签,一个是结束标签。 HTML文…...
mysql将id重新修改为递增
文章目录 场景解决,排序的话可以先按照一定大小改一下,然后将id字段删掉,再重新生成即可清空表数据,并将自增id改为1开始 场景 好比我有个配置表: CREATE TABLE config (id int NOT NULL AUTO_INCREMENT,config_key varchar(20) NOT NULL,config_value varchar(500) NOT NU…...
http、https笔记
目录 HTTP 基本概念状态码:get和post的区别:http 常⻅字段:http的缺点: HTTP/1.1HTTP/3HTTPSHTTPS和HTTP区别对称加密和⾮对称加密⾮对称加密 HTTP 基本概念 状态码: 1xx 中间状态,比如post的continue 20…...
飞凌嵌入式「国产」嵌入式核心板大盘点(三)——龙芯中科、赛昉科技
为了帮助各位工程师朋友详细了解飞凌嵌入式推出的“国产化”产品,小编专门开设了「国产平台大盘点专题」。上周,已经带大家盘点了飞凌嵌入式联合瑞芯微电子和全志科技两个国产处理器品牌打造的平台,今天,将继续为大家介绍龙芯和赛…...
以vue2为例,用npm开发环境在后端部署vue2项目(更推荐使用nginx部署)
因为之前一致出现的跨域问题,从而想到了这个办法,属于偏方。推荐使用nginx部署,再去解决跨域问题。 接下来聊一聊本文所使用的方法。 首先将你的前端vue项目拷贝一份到服务器,准备一个dockerfile文件,用这个进行部署首…...
docker容器监控:Cadvisor +Prometheus+Grafana的安装部署
目录 Cadvisor PrometheusGrafana的安装部署 一、安装docker: 1、安装docker-ce 2、阿里云镜像加速器 3、下载组件镜像 4、创建自定义网络 二、部署Cadvisor 1、被监控主机上部署Cadvisor容器 2、访问cAdvisor页面 三、安装prometheus 1、部署Prometheus…...
前端食堂技术周刊第 93 期:7 月登陆 Web 平台的新功能、Node.js 工具箱、Nuxt3 开发技巧、MF 重构方案
美味值:🌟🌟🌟🌟🌟 口味:橙橙冰萃美式 食堂技术周刊仓库地址:https://github.com/Geekhyt/weekly 大家好,我是童欧巴。欢迎来到前端食堂技术周刊,我们先来…...
获取 Android 的 SHA1 值
1、调试版,可以直接在 Android studio 中的 gradle 中查看。也可以用下面方法进行 前提要先确定签名文件所在的路径:调试版默认使用的签名文件是debug.keystore,文件处于 C 盘用户目录下的.android文件夹下。打开命令行工具, 1、…...
! [remote rejected] develop -> develop (pre-receive hook declined)
问题 git push 远程提交dao develop 分支失败,出现下面错误信息 remote: GitLab: You are not allowed to push code to protected branches on this project. To https://xxx.com.cn/xxx/xxx/xxx/xxx.git/! [remote rejected] develop -> develop (pre-receiv…...
最强的表格组件—AG Grid使用以及License Key Crack
PS: 想要官方 License Key翻到最后面 Ag Grid简介 Ag-Grid 是一个高级数据网格,适用于JavaScript/TypeScript应用程序,可以使用React、Angular和Vue等流行框架进行集成。它是一种功能强大、灵活且具有高度可定制性的表格解决方案,提供了丰富…...
【算法】逆波兰表达式
文章目录 定义求法代码思想: 定义 逆波兰表达式也称为“后缀表达式”,是将运算符写在操作数之后的运算式。 求法 *如:(ab)c-(ab)/e的转换过程: 先加上所有的括号。 (((ab)*c)-((ab)/e))将所有的运算符移到括号外面 (((ab) c)* …...
添加SQLCipher 到项目中
文章目录 一、克隆下载SQLCipher二、手动导入1. 生成sqlite3.c2. 在项目中添加命令3. 添加 Security.framework 三、CocoaPods导入 SQLCipher官方地址 一、克隆下载SQLCipher $ cd ~/Documents/code $ git clone https://github.com/sqlcipher/sqlcipher.git二、手动导入 1.…...
轻松预约,尽享美食,详解餐厅预约小程序的设计与实现
随着智能手机的普及和人们生活水平的提高,餐厅预约已经成为人们日常生活中的一部分。为了更好地满足人们的需求,许多餐厅开始使用小程序来提供更方便快捷的预约服务。本文将介绍如何制作一款餐厅预约小程序的详细步骤。 1. 进入乔拓云网后台,…...
数据结构--栈和队列3.1(栈-顺序结构)
目录 栈(Stack)栈顶(top)栈底(bottom)空栈(不含任何元素) 创建栈 入栈操作 出栈操作 销毁一个栈 计算栈的当前容量 实例分析 栈的插入操作叫做进栈(Push…...
pdf怎么压缩到1m?这样做压缩率高!
PDF是目前使用率比较高的一种文档格式,因为它具有很高的安全性,还易于传输等,但有时候当文件体积过大时,会给我们带来不便,这时候简单的解决方法就是将其压缩变小。 想要将PDF文件压缩到1M,也要根据具体的情…...
AttentionFreeTransformer 源码解析(一):AFTFull、AFTSimple、AFTLocal
我觉得源码写的很好懂,我就不加注释了,直接上计算流程图。 AFTFull class AFTFull(nn.Module):def __init__(self, max_seqlen, dim, hidden_dim64):super().__init__()max_seqlen: the maximum number of timesteps (sequence length) to be fed indim…...
【稀缺首发】2024 Dev Containers兼容性矩阵图:Node.js 20/Python 3.12/Rust 1.78全版本支持状态+已验证镜像清单
更多请点击: https://intelliparadigm.com 第一章:Dev Containers兼容性矩阵图的权威发布与核心价值 Dev Containers(开发容器)正成为现代云原生开发工作流的关键基础设施。为统一生态标准、降低环境配置成本,OpenDev…...
完美世界第一季营收11.7亿:同比降42% 实控人池宇峰套现5.8亿
雷递网 雷建平 4月28日完美世界股份有限公司(证券代码:002624 证券简称:完美世界)昨日发布2025年及2026年第一季度的财报,年报显示,完美世界2026年第一季营收11.71亿,较上年同期的20.23亿元下降…...
TurboDiffusion应用解析:广告设计、内容创作,降低视频制作门槛
TurboDiffusion应用解析:广告设计、内容创作,降低视频制作门槛 1. 视频制作的新革命 想象一下这样的场景:早上开会确定创意方向,中午就能看到成片效果,下午已经开始投放测试。这在传统视频制作流程中几乎不可能实现&…...
YOLOv9训练避坑大全:从data.yaml配置到val.py报错,一次解决所有常见问题
YOLOv9训练避坑大全:从data.yaml配置到val.py报错,一次解决所有常见问题 刚接触YOLOv9时,你可能已经感受到这个目标检测模型的强大性能,但在实际训练过程中,各种报错信息往往让人措手不及。从数据集配置到训练参数调整…...
保姆级教程:用ROS2 Humble + Gazebo Classic 从零搭建一个能键盘控制的差分AGV模型
从零构建ROS2差分AGV:模型搭建、Gazebo仿真与键盘控制实战指南 刚接触ROS2时,最令人头疼的莫过于那些看似简单却暗藏玄机的机器人仿真环节。你是否也曾在深夜盯着Gazebo里纹丝不动的小车模型,反复检查URDF文件却找不到问题所在?本…...
tabulate多语言支持与UTF-8处理完全指南
tabulate多语言支持与UTF-8处理完全指南 【免费下载链接】tabulate Table Maker for Modern C 项目地址: https://gitcode.com/gh_mirrors/ta/tabulate tabulate是一款面向现代C的表格生成库,提供了强大的多语言支持与完善的UTF-8字符处理能力,帮…...
Rust Web开发避坑指南:用Sea-ORM连接MySQL数据库的完整配置流程(含日志调试)
Rust Web开发避坑指南:用Sea-ORM连接MySQL数据库的完整配置流程(含日志调试) 如果你正在用Rust构建Web服务,数据库连接是绕不开的坎。Sea-ORM作为Rust生态中备受关注的ORM工具,确实能大幅提升开发效率——前提是你得先…...
Java服务网格可观测性断层如何破局?Prometheus+OpenTelemetry+Jaeger三体协同诊断手册
更多请点击: https://intelliparadigm.com 第一章:Java服务网格可观测性断层的根源与挑战 分布式追踪的上下文丢失问题 在基于 Spring Cloud 或 Quarkus 构建的 Java 微服务中,当请求穿越 Istio Envoy 代理与应用容器时,OpenTr…...
5个颠覆性虚拟显示应用场景:Windows虚拟桌面革命
5个颠覆性虚拟显示应用场景:Windows虚拟桌面革命 【免费下载链接】virtual-display-rs A Windows virtual display driver to add multiple virtual monitors to your PC! For Win10. Works with VR, obs, streaming software, etc 项目地址: https://gitcode.com…...
昆仑万维第一季营收25.7亿:同比增46% 净亏8.9亿 艾捷科芯刚融资5.5亿
雷递网 乐天 4月28日昆仑万维(股票代码:300418.SZ)今日发布截至2026年第一季度的财报。财报显示,昆仑万维2026年第一季度营收为25.7亿元,较上年同期的17.64亿元增长45.69%。昆仑万维2026年第一季度净亏损为8.87亿元&am…...
