使用 GitHub Actions 和 Nuitka 实现 Python 应用(customtkinter ui库)的自动化跨平台打包
目录
- 引言
- 前置准备
- 配置文件详解
- 实现细节
- CustomTkinter 打包注意事项
- 完整配置示例
- 常见问题
引言
在 Python 应用开发中,将源代码打包成可执行文件是一个常见需求。本文将详细介绍如何使用 GitHub Actions 和 Nuitka 实现自动化的跨平台打包流程,支持 Windows、Linux 和 macOS(包括 Intel 和 ARM 架构)。打包的过程中也是苦于找不到解决问题的文档,把自己的经历记录一下。
需要注意的是 windows 和 linux 的工作流我用了 Nuitka/Nuitka-Action 这个工作流的包,但是发现真的很慢,而且在打包macos老是报错。于是我把macos的工作流修改为我自己的 build.py 来实现。
下面主要是介绍我的流程,如果想要直接实现可以直接跳转到完整配置示例。当然 build.py 你不能直接使用,因为里面涉及到一些我自定义的配置,你需要甄别之后进行调整。然后配置 github action就可以实现自动化工作流。
前置准备
在开始之前,需要准备以下内容:
- Python 项目源代码
- requirements.txt 依赖文件
- GitHub 仓库
- 基本的 Python 开发环境
配置文件详解
本地构建脚本 (build.py)
首先,我们需要一个本地构建脚本来处理依赖检查和构建过程:
def check_and_install_dependencies():required_packages = {"customtkinter": "customtkinter","nuitka": "nuitka",}# ... 检查和安装依赖
这个脚本主要负责:
- 检查和安装必要的依赖
- 配置构建参数
- 处理跨平台差异
GitHub Actions 工作流配置
在 .github/workflows/build.yml
中配置自动化构建流程:
name: Build Executableson:push:tags:- 'v*' # 触发条件:创建新的版本标签
工作流包含四个主要任务:
- Windows 构建任务
build-windows:runs-on: windows-lateststeps:- uses: Nuitka/Nuitka-Action@main# ... Windows 特定配置
- Linux 构建任务
build-linux:runs-on: ubuntu-22.04steps:# ... Linux 特定配置
- macOS Intel 构建任务
build-macos-intel:runs-on: macos-latest# ... macOS Intel 特定配置
- macOS ARM 构建任务
build-macos-arm:runs-on: macos-15# ... macOS ARM 特定配置
实现细节
1. Nuitka 构建参数配置
关键的 Nuitka 构建参数包括:
--follow-imports
: 跟踪并包含所有导入--enable-plugin=tk-inter
: 启用 Tkinter 支持--include-package
: 包含特定包--include-data-dir
: 包含数据目录--macos-create-app-bundle
: macOS 特定选项--windows-console-mode
: Windows 特定选项
2. 平台特定配置
Windows
windows-console-mode: disable
windows-icon-from-ico: src/assets/app_icon.ico
macOS
- name: Install Tcl/Tk Dependenciesrun: |brew install tcl-tkTCL_PATH=$(brew --prefix tcl-tk)
Linux
- name: Install System Dependenciesuses: awalsh128/cache-apt-pkgs-action@latestwith:packages: python3-tk tk-dev
3. 构建产物处理
使用 GitHub Actions 的 artifacts 功能保存构建结果:
- name: Upload artifactuses: actions/upload-artifact@v4with:name: CursorMagic-Platformpath: dist/*.app # 或 .exe 等
CustomTkinter 打包注意事项
1. 必要的打包参数
使用 Nuitka 打包 CustomTkinter 应用时,需要特别注意以下参数:
- name: Build with Nuitkauses: Nuitka/Nuitka-Action@mainwith:nuitka-version: mainenable-plugins: tk-inter # 必须启用 tk-inter 插件include-package: customtkinter # 必须包含 customtkinter 包
2. 资源文件处理
CustomTkinter 的主题和样式文件需要正确打包:
-
主题文件
- CustomTkinter 的主题文件位于包内的
assets
目录 - 需要确保这些文件被正确包含在最终的可执行文件中
- CustomTkinter 的主题文件位于包内的
-
自定义资源
- 如果使用了自定义主题或图标,需要使用
include-data-dir
确保资源文件被打包
- 如果使用了自定义主题或图标,需要使用
3. 平台特定配置
Windows 平台
windows-console-mode: disable # 禁用控制台窗口
standalone: true # 确保所有依赖被打包
macOS 平台
macos-create-app-bundle: true # 创建 .app 包
enable-plugins: tk-inter
onefile: false # CustomTkinter 在 macOS 上不建议使用 onefile 模式
4. 依赖处理
-
版本控制
# requirements.txt customtkinter==5.2.1 # 建议指定具体版本 darkdetect>=0.7.1 # CustomTkinter 的依赖
-
依赖检查
def check_dependencies():required = {"customtkinter": "customtkinter>=5.2.0","darkdetect": "darkdetect>=0.7.1"}# ... 检查依赖
5. 常见问题解决
-
主题加载失败
- 症状:应用启动后显示默认 tkinter 样式
- 解决:确保添加
--include-package=customtkinter
参数
-
图片资源丢失
- 症状:自定义图标或图片无法显示
- 解决:使用
--include-data-dir
指定资源目录
-
暗色模式问题
- 症状:无法正确响应系统暗色模式
- 解决:确保
darkdetect
包被正确打包
-
macOS 特定问题
- name: Fix macOS Permissionsif: runner.os == 'macOS'run: |chmod +x dist/*.app/Contents/MacOS/*
完整配置示例
这里提供一个实际的跨平台打包配置示例,包含本地构建脚本和 GitHub Actions 工作流配置。
本地构建脚本 (build.py)
import os
import sys
import subprocess
import pkg_resourcesdef check_and_install_dependencies():required_packages = {"customtkinter": "customtkinter","nuitka": "nuitka",}print("检查依赖项...")for package, pip_name in required_packages.items():try:pkg_resources.require(package)print(f"✓ {package} 已安装")except pkg_resources.DistributionNotFound:print(f"安装 {package}...")subprocess.check_call([sys.executable, "-m", "pip", "install", pip_name])def run_command(command):try:subprocess.run(command, shell=True, check=True)print(f"成功执行命令: {command}")except subprocess.CalledProcessError as e:print(f"命令执行失败: {command}")print(f"错误信息: {str(e)}")sys.exit(1)def main():print("开始构建过程...")# 设置输出目录和文件名output_dir = "dist"app_name = "CursorMagic"# 基础命令行选项base_options = ["--follow-imports", # 跟踪导入"--enable-plugin=tk-inter", # 启用 Tkinter 支持"--include-package=customtkinter", # 包含 customtkinterf"--include-data-dir=src/utils/turnstilePatch=turnstilePatch", # 包含数据目录f"--include-data-files=src/core/names-dataset.txt=names-dataset.txt", # 包含具体的 txt 文件f"--include-data-dir=src/config=src/config", # 包含配置目录"--warn-unusual-code", # 警告不寻常的代码"--warn-implicit-exceptions", # 警告隐式异常"--nofollow-import-to=tkinter.test", # 排除测试模块"--nofollow-import-to=PIL.ImageQt", # 排除 Qt 相关"--remove-output", # 删除之前的输出f"--output-dir={output_dir}", # 输出目录f'--output-file="{app_name}"', # 输出文件名]# 根据操作系统添加特定选项if sys.platform == "darwin": # macOStcl_path = os.getenv("TCL_PATH")if not tcl_path:try:tcl_path = subprocess.check_output(["brew", "--prefix", "tcl-tk"]).decode().strip()except:print("警告: 无法找到 Tcl/Tk 路径")sys.exit(1)base_options.extend(["--macos-create-app-bundle", # 创建 macOS 应用包"--macos-app-icon=src/assets/app_icon.icns", # 设置应用图标f"--macos-app-name={app_name}.app", # 设置应用名称])elif sys.platform == "win32": # Windowsbase_options.extend(["--standalone", # 独立可执行文件"--mingw64", # 使用 MinGW64"--windows-console-mode=disable", # Windows 禁用控制台"--windows-icon-from-ico=src/assets/app_icon.ico", # Windows 应用图标])nuitka_command = "python -m nuitka " + " ".join(base_options) + " " + "CursorMagic.py"run_command(nuitka_command)print("\n构建过程完成!")if __name__ == "__main__":main()
GitHub Actions 工作流配置 (.github/workflows/build.yml)
name: Build Executableson:push:tags:- 'v*' # 添加标签触发条件,匹配 v1.0.0 这样的标签jobs:build-windows:runs-on: windows-lateststeps:- uses: actions/checkout@v4- name: Set up Pythonuses: actions/setup-python@v5with:python-version: '3.x'architecture: 'x64'cache: 'pip'cache-dependency-path: |**/requirements*.txt- name: Install Dependenciesrun: |pip install -r requirements.txt- name: Build Windows Executableuses: Nuitka/Nuitka-Action@mainwith:nuitka-version: mainscript-name: CursorMagic.pymode: onefileenable-plugins: tk-interinclude-package: customtkinterinclude-data-dir: |src/utils/turnstilePatch=turnstilePatchsrc/config=src/configinclude-data-files: src/core/names-dataset.txt=names-dataset.txtwindows-console-mode: disablewindows-icon-from-ico: src/assets/app_icon.icooutput-file: CursorMagic- name: Upload Windows artifactuses: actions/upload-artifact@v4with:name: CursorMagic-Windowspath: build/*.exeinclude-hidden-files: truebuild-linux:runs-on: ubuntu-22.04steps:- uses: actions/checkout@v4- name: Set up Pythonuses: actions/setup-python@v5with:python-version: '3.x'architecture: 'x64'cache: 'pip'cache-dependency-path: |**/requirements*.txt- name: Install System Dependenciesuses: awalsh128/cache-apt-pkgs-action@latestwith:packages: python3-tk tk-devversion: 1.0- name: Install Dependenciesrun: |pip install -r requirements.txt- name: Build Linux Executableuses: Nuitka/Nuitka-Action@mainwith:nuitka-version: mainscript-name: CursorMagic.pymode: onefileenable-plugins: tk-interinclude-package: customtkinterinclude-data-dir: |src/utils/turnstilePatch=turnstilePatchsrc/config=src/configinclude-data-files: src/core/names-dataset.txt=names-dataset.txtoutput-file: CursorMagic- name: Upload Linux artifactuses: actions/upload-artifact@v4with:name: CursorMagic-Linuxpath: build/CursorMagicinclude-hidden-files: truebuild-macos-intel:runs-on: macos-lateststeps:- uses: actions/checkout@v4- name: Set up Pythonuses: actions/setup-python@v5with:python-version: '3.11'architecture: 'x64'cache: 'pip'cache-dependency-path: |**/requirements*.txt- name: Install Tcl/Tk Dependenciesrun: |brew install tcl-tkTCL_PATH=$(brew --prefix tcl-tk)echo "TCL_PATH=$TCL_PATH" >> $GITHUB_ENVecho "LDFLAGS=-L$TCL_PATH/lib" >> $GITHUB_ENVecho "CPPFLAGS=-I$TCL_PATH/include" >> $GITHUB_ENVecho "PKG_CONFIG_PATH=$TCL_PATH/lib/pkgconfig" >> $GITHUB_ENVecho "Using Tcl/Tk from: $TCL_PATH"- name: Install Dependenciesrun: |pip install setuptoolspip install --upgrade nuitkapip install -r requirements.txtbrew install ccache- name: Clean Build Directoryrun: rm -rf build- name: Build with build.pyrun: python build.py- name: Upload MacOS Intel artifactuses: actions/upload-artifact@v4with:name: CursorMagic-MacOS-Intelpath: dist/*.appinclude-hidden-files: truebuild-macos-arm:runs-on: macos-15steps:- uses: actions/checkout@v4- name: Set up Pythonuses: actions/setup-python@v5with:python-version: '3.11'architecture: 'arm64'cache: 'pip'cache-dependency-path: |**/requirements*.txt- name: Install Tcl/Tk Dependenciesrun: |brew install tcl-tkTCL_PATH=$(brew --prefix tcl-tk)echo "TCL_PATH=$TCL_PATH" >> $GITHUB_ENVecho "LDFLAGS=-L$TCL_PATH/lib" >> $GITHUB_ENVecho "CPPFLAGS=-I$TCL_PATH/include" >> $GITHUB_ENVecho "PKG_CONFIG_PATH=$TCL_PATH/lib/pkgconfig" >> $GITHUB_ENVecho "Using Tcl/Tk from: $TCL_PATH"- name: Install Dependenciesrun: |pip install setuptoolspip install --upgrade nuitkapip install -r requirements.txtbrew install ccache- name: Clean Build Directoryrun: rm -rf build- name: Build with build.pyrun: python build.py- name: Upload MacOS ARM artifactuses: actions/upload-artifact@v4with:name: CursorMagic-MacOS-ARMpath: dist/*.appinclude-hidden-files: true
这个完整配置示例展示了:
-
本地构建脚本特点
- 自动检查和安装依赖
- 跨平台构建支持
- 详细的构建选项配置
- 错误处理和日志输出
-
GitHub Actions 工作流特点
- 支持四个平台的构建(Windows、Linux、macOS Intel、macOS ARM)
- 完整的依赖安装配置
- 构建缓存优化
- 统一的构建产物处理
-
关键配置点
- CustomTkinter 相关配置
- 平台特定的依赖处理
- 资源文件打包
- 构建产物管理
常见问题
-
依赖问题
- 确保 requirements.txt 完整且版本号正确
- 使用
--include-package
包含所有必要的包
-
TCL/TK 相关问题
- macOS 需要正确配置 TCL_PATH
- Linux 需要安装 python3-tk 和 tk-dev
-
路径问题
- 使用相对路径
- 正确配置
include-data-dir
和include-data-files
-
平台特定问题
- Windows: 注意图标和控制台模式配置
- macOS: 注意 ARM/Intel 架构差异内容已经更新完成,您可以查看完整的文档内容并进行必要的调整和修改。如果您有任何其他问题或需要进一步帮助,请随时告诉我。内容已经更新完成,您可以查看完整的文档内容并进行必要的调整和修改。如果您有任何其他问题或需要进一步帮助,请随时告诉我。
- Linux: 注意系统依赖
结语
通过合理配置 GitHub Actions 和 Nuitka,我们可以实现 Python 应用的自动化跨平台打包。这不仅提高了开发效率,也确保了构建过程的一致性和可靠性。
参考资料
- Nuitka 官方文档
- GitHub Actions 文档
- Python 打包指南
相关文章:
使用 GitHub Actions 和 Nuitka 实现 Python 应用(customtkinter ui库)的自动化跨平台打包
目录 引言前置准备配置文件详解实现细节CustomTkinter 打包注意事项完整配置示例常见问题 引言 在 Python 应用开发中,将源代码打包成可执行文件是一个常见需求。本文将详细介绍如何使用 GitHub Actions 和 Nuitka 实现自动化的跨平台打包流程,支持 W…...
【Part 2安卓原生360°VR播放器开发实战】第一节|通过传感器实现VR的3DOF效果
《VR 360全景视频开发》专栏 将带你深入探索从全景视频制作到Unity眼镜端应用开发的全流程技术。专栏内容涵盖安卓原生VR播放器开发、Unity VR视频渲染与手势交互、360全景视频制作与优化,以及高分辨率视频性能优化等实战技巧。 📝 希望通过这个专栏&am…...
【1】云原生,kubernetes 与 Docker 的关系
Kubernetes?K8s? Kubernetes经常被写作K8s。其中的数字8替代了K和s中的8个字母——这一点倒是方便了发推,也方便了像我这样懒惰的人。 什么是云原生? 云原生: 它是一种构建和运行应用程序的方法,它包含&am…...
基于Redis实现RAG架构的技术解析与实践指南
一、Redis在RAG架构中的核心作用 1.1 Redis作为向量数据库的独特优势 Redis在RAG架构中扮演着向量数据库的核心角色,其技术特性完美契合RAG需求: 特性技术实现RAG应用价值高性能内存存储基于内存的键值存储架构支持每秒百万级的向量检索请求分布式架构…...
trivy开源安全漏洞扫描器——筑梦之路
开源地址:https://github.com/aquasecurity/trivy.git 可扫描的对象 容器镜像文件系统Git存储库(远程)虚拟机镜像Kubernetes 在容器镜像安全方面使用广泛,其他使用相对较少。 能够发现的问题 正在使用的操作系统包和软件依赖项…...
pnpm确认全局下载安装了还是显示cnpm不是内部或外部命令,也不是可运行的程序
刚开始是正常使用的。突然开始用不了了一直报错 1.在确保自己node和npm都一直正常使用并且全局安装pnpm的情况下 打开cmd查看npm的环境所在位置 npm config get prefix 2.接着打开高级系统设置 查看自己的path配置有没有问题 确认下载了之后pnpm -v还报错说明没有查询到位置 …...
基于 pnpm + Monorepo + Turbo + 无界微前端 + Vite 的企业级前端工程实践
基于 pnpm Monorepo Turbo 无界微前端 Vite 的企业级前端工程实践 一、技术演进:为什么引入 Vite? 在微前端与 Monorepo 架构落地后,构建性能成为新的优化重点: Webpack 构建瓶颈:复杂配置导致开发启动慢&#…...
软考高级系统架构设计师-第15章 知识产权与标准化
【本章学习建议】 根据考试大纲,本章主要考查系统架构设计师单选题,预计考3分左右,较为简单。 15.1 标准化基础知识 1. 标准的分类 分类 内容 国际标准(IS) 国际标准化组织(ISO)、国际电工…...
MySQL 视图
核心目标: 学习如何创建和使用视图,以简化复杂的查询、提供数据访问控制、实现逻辑数据独立性,并通过 WITH CHECK OPTION 保证数据一致性。 什么是视图? 视图(View)是一种虚拟表,其内容由一个 …...
[操作系统] 信号
信号 vs IPC 板书最后提到了 “信号 vs IPC”,暗示了信号也是一种进程间通信 (Inter-Process Communication, IPC) 的机制。虽然信号的主要目的是事件通知,但它也可以携带少量的信息(即信号的类型)。 初探“信号”——操作系统的“…...
网络基础(协议,地址,OSI模型、Socket编程......)
目录 一、计算机网络发展 二、协议 1.认识协议 2.OSI七层模型 3.TCP/IP 五层(或四层)模型 4.协议本质 三、网络传输流程 1.MAC地址 2.协议栈 3.IP地址 IP地址 vs MAC地址 1. 核心区别 2. 具体通信过程类比 3. 关键总结 为什么需要两者? 4.协议栈图解…...
产品经理学习过程
一:扫盲篇(初始产品经理) 阶段1:了解产品经理 了解产品经理是做什么的、产品经理的分类、产品经理在实际工作中都会接触什么样的岗位、以及产品经理在实际工作中具体要做什么事情。 二:准备篇 阶段2:工…...
深入理解Java包装类:自动装箱拆箱与缓存池机制
深入理解Java包装类:自动装箱拆箱与缓存池机制 对象包装器 Java中的数据类型可以分为两类:基本类型和引用类型。作为一门面向对象编程语言, 一切皆对象是Java语言的设计理念之一。但基本类型不是对象,无法直接参与面向对象操作&…...
Linux中的信号量
目录 信号量概念 定义 操作 类型 应用 信号量封装 一、创建信号量 头文件 函数原型 参数说明 返回值 示例 二、设置信号量初始值 头文件 函数原型 参数解释 返回值 示例 三、信号量的P操作 头文件 函数原型 参数解释 返回值 示例 四、信号量的V操作 示…...
深入理解linux操作系统---第15讲 Web 服务器 Nginx
15.1 Nginx 概述 核心特性与历史背景 Nginx由俄罗斯工程师Igor Sysoev于2002年开发,2004年正式发布,旨在解决传统服务器(如Apache)的C10K问题(即单机万级并发连接处理)。其采用事件驱动(Event…...
深度解析算法之前缀和
25.【模版】一维前缀和 题目链接 描述 输入描述 输出描述 输出q行,每行代表一次查询的结果. 示例 输入: 3 2 1 2 4 1 2 2 3 复制 输出: 3 6 这个题的话就是下面的样子,我们第一行输入 3 2的意思即是这个数组是3个元素大小的数组&…...
混合精度训练中的算力浪费分析:FP16/FP8/BF16的隐藏成本
在大模型训练场景中,混合精度训练已成为降低显存占用的标准方案。然而,通过NVIDIA Nsight Compute深度剖析发现,精度转换的隐藏成本可能使理论算力利用率下降40%以上。本文基于真实硬件测试数据,揭示不同精度格式的计算陷阱。…...
6.8 Python定时任务实战:APScheduler+Cron实现每日/每周自动化调度
Python定时任务实战:APScheduler+Cron实现每日/每周自动化调度 实现每日和每周定时任务 关键词:定时任务调度、Python 原生调度器、Cron 脚本、异常重试机制、任务队列管理 1. 定时任务架构设计 采用 分层调度架构 实现灵活的任务管理: #mermaid-svg-PnZcDOgOklVieQ8X {f…...
[Android] 豆包爱学v4.5.0小学到研究生 题目Ai解析
[Android] 豆包爱学 链接:https://pan.xunlei.com/s/VOODT6IclGPsC7leCzDFz521A1?pwdjxd8# 拍照解析答案 【应用名称】豆包爱学 【应用版本】4.5.0 【软件大小】95mb 【适用平台】安卓 【应用简介】豆包爱学,一般又称河马爱学教育平台app,河马爱学。 关…...
swift-12-Error处理、关联类型、assert、泛型_
一、错误类型 开发过程常见的错误 语法错误(编译报错) 逻辑错误 运行时错误(可能会导致闪退,一般也叫做异常) 2.1 通过结构体 第一步 struct MyError : Errort { var msg: String } 第二步 func divide(_ …...
每日定投40刀BTC(14)20250409 - 20250419
定投 坚持 《磨剑篇》浮生多坎壈,志业久盘桓。松柏凌霜易,骅骝涉险难。砺锋临刃缺,淬火取金残。但使精魂在,重开万象端。...
【刷题Day20】TCP和UDP(浅)
TCP 和 UDP 有什么区别? TCP提供了可靠、面向连接的传输,适用于需要数据完整性和顺序的场景。 UDP提供了更轻量、面向报文的传输,适用于实时性要求高的场景。 特性TCPUDP连接方式面向连接无连接可靠性提供可靠性,保证数据按顺序…...
大数据建模与评估
文章目录 实战案例:电商用户分群与价值预测核心工具与库总结一、常见数据挖掘模型原理及应用(一)决策树模型(二)随机森林模型(三)支持向量机(SVM)模型(四)K - Means聚类模型(五)K - Nearest Neighbors(KNN)模型二、运用Python机器学习知识实现数据建模与评估(一…...
Python语法系列博客 · 第6期[特殊字符] 文件读写与文本处理基础
上一期小练习解答(第5期回顾) ✅ 练习1:字符串反转模块 string_tools.py # string_tools.py def reverse_string(s):return s[::-1]调用: import string_tools print(string_tools.reverse_string("Hello")) # 输出…...
Pandas取代Excel?
有人在知乎上提问:为什么大公司不用pandas取代excel? 而且列出了几个理由:Pandas功能比Excel强大,运行速度更快,Excel除了简单和可视化界面外,没有其他更多的优势。 有个可怕的现实是,对比Exce…...
《解锁图像“高清密码”:超分辨率重建之路》
在图像的世界里,高分辨率意味着更多细节、更清晰的画面,就像用高清望远镜眺望远方,一切都纤毫毕现。可现实中,我们常被低分辨率图像困扰,模糊的监控画面、老旧照片里难以辨认的面容……不过别担心,图像超分…...
杨校老师课堂之C++入门练习题梳理
采用C完成下列题目,要求每题目的时间限制:1秒 内存限制:128M 1. 交换个位与十位的数字 时间限制:1秒 内存限制:128M 题目描述 试编写一个程序,输入一个两位数,交换十位与个位上的数字并输出。 …...
基于springboot的老年医疗保健系统
博主介绍:java高级开发,从事互联网行业六年,熟悉各种主流语言,精通java、python、php、爬虫、web开发,已经做了六年的毕业设计程序开发,开发过上千套毕业设计程序,没有什么华丽的语言࿰…...
数据分析与挖掘
一 Python 基本语法 变量与数据类型 : Python 中变量无需声明,直接赋值即可。 常见的数据类型有数值型(整型 int、浮点型 float、复数型 complex)、字符串型(str,用单引号、双引号或三引号括起来ÿ…...
RoBoflow数据集的介绍
https://public.roboflow.com/object-detection(该数据集的网址) 可以看到一些基本情况 如果我们想要下载,直接点击 点击图像可以看到一些基本情况 可以点击红色箭头所指,右边是可供选择的一些yolo模型的格式 如果你想下载…...
大模型Rag - 两大检索技术
一、稀疏检索:关键词匹配的经典代表 稀疏检索是一种基于关键词统计的传统检索方法。其基本思想是:通过词频和文档频率来衡量一个文档与查询的相关性。 核心原理 文档和查询都被表示为稀疏向量(如词袋模型),只有在词…...
【T型三电平仿真】SVPWM调制
目录 仿真模型分析 克拉克变换 大扇区判断编辑 小区域判断 计算基本电压矢量作用时间 确定基本电压矢量的作用顺序 作用时间和矢量作用顺序对应 七段式化生成阶梯图 矢量状态分布 本人学习过程中提出的问题和解释 SVPWM调制实现了什么功能 SVPWM的算法步骤是什么…...
树莓派5-开发应用笔记
0.树莓派系统目录 /home:用户目录。 除了root用户外,其他所有的使用者的数据都存放在这个目录下,在树莓派的系统中,/home目录中有一个pi的子目录,这个就是pi用户的默认目录。 /bin: 主要放置系统的必备执行文件目录。 …...
[Java实战经验]异常处理最佳实践
一些好的异常处理实践。 目录 异常设计自定义异常为异常设计错误代码(状态码)设计粒度全局异常处理异常日志信息保留 异常处理时机资源管理try-with-resources异常中的事务 异常设计 自定义异常 自定义异常设计,如业务异常定义BusinessExce…...
AOSP的Doze模式-LightIdle初识
前言 从Android 6.0开始,谷歌引入了Doze模式(打盹模式)的省电技术延长电池使用时间。根据第三方测试显示,两台同样的Nexus 5,开启的Doze的一台待机能达到533小时,而未开启Doze的一台待机只能达到200小时。Doze省电效果十分明显。…...
QML动画--ParticleSystem
ParticleSystem 是 QML 中用于创建和管理粒子系统的组件,可以制作各种粒子效果如火焰、烟雾、爆炸等。 基本用法 qml import QtQuick.Particles 2.15ParticleSystem {id: particleSystemImageParticle {source: "particle.png"color: "red"a…...
Win 11 重装 Ubuntu 双系统方法
有时候 Ubuntu 环境崩溃了,或者版本过低,需要卸载重装。本文介绍重装的方法,默认已经有一个双系统。 1. 删除原先 Ubuntu 分区 首先打开 Win 的磁盘管理,找到 Ubuntu 的分区,右键删除分区(注意不要错删 wi…...
单例模式:懒汉式的两种优化写法
单例模式:全局唯一实例 懒汉式:获取时才初始化 ①静态局部变量实现(Meyer’s Singleton)【推荐】 /* 类内创建自身实例的可行性分析:在C中,类可以通过静态成员函数创建自身实例。这种机制的核心在于&…...
详细解释浏览器是如何渲染页面的?
渲染流程概述 渲染的目标:将HTML文本转化为可以看到的像素点 当浏览器的网络线程收到 HTML 文档后,会产生一个渲染任务,并将其传递给渲染主线程的消息队列。在事件循环机制的作用下,渲染主线程取出消息队列中的渲染任务࿰…...
高速系统设计简介
1.1 PCB 设计技术回顾 1981 年 8 月 12 日,IBM 正式发布了历史上第一台个人电脑,自此之后,个人电脑融入了人们生活和工作的各个角落,人类从此进入了个人电脑时代。个人电脑的出现,不仅促进了电子产品在消费领域的发展…...
不规则曲面上两点距离求取
背景 在CT中求皮肤上两点间的弧长。由于人体表面并不是规则的曲面,不可能用圆的弧长求取方法来计算出两点间的弧长。 而在不规则的曲面上求两点的距离,都可以用类似测地线距离求取的方式来求取(积分),而转化为搜索路…...
用usb网卡 虚拟机无法开到全双工的解决办法
今天突发奇想 给unraid宿主机插了两个一摸一样的usb网卡 2.5g的 直通给不同的虚拟机 这里unraid需要安装"USB Manager" 请给unraid自备环境 直通的时候 第一次还没生效 看不到网卡 我又在unraid的管理界面 顶部可以看到多出来一个 "usb"页面 打开可…...
webpack 中 chunks详解
webpack 中 chunks详解 在 Webpack 项目中,webpack.config.js 是核心配置文件,而非 webpack.json。chunks 的概念与 Webpack 的代码分割(Code Splitting)功能密切相关,通过 optimization.splitChunks 配置项可以实现对…...
Java @Serial 注解深度解析
Java Serial 注解深度解析 1. 注解本质 Serial 是 Java 14 引入的编译时校验注解,用于标记序列化相关成员,帮助开发者避免常见的序列化错误。 2. 核心作用 (1) 主要用途 标记序列化相关的特殊方法/字段 提供编译时检查 替代传统的命名约定验证 (…...
齐次坐标变换+Unity矩阵变换
矩阵变换 变换(transform):指的是我们把一些数据,如点,方向向量甚至是颜色,通过某种方式(矩阵运算),进行转换的过程。 变换类型 线性变换:保留矢量加和标量乘的计算 f(x)…...
Python语法系列博客 · 第9期[特殊字符] 函数参数进阶:*args、**kwargs 与参数解包技巧
上一期小练习解答(第8期回顾) ✅ 练习1:整数转字符串列表 nums [1, 2, 3, 4, 5] str_list list(map(str, nums))✅ 练习2:筛选回文字符串 words ["madam", "hello", "noon", "python&qu…...
Python语法系列博客 · 第4期[特殊字符] 函数的定义与使用:构建可复用的模块
上一期小练习解答(第3期回顾) ✅ 练习1:创建一个列表,添加5个名字,并用循环打印 names ["Alice", "Bob", "Charlie", "David", "Eva"] for name in names:print…...
6547网:2025年3月 Python编程等级考试一级真题试卷
2025年3月青少年软件编程Python等级考试(一级)真题试卷 题目总数:37 总分数:100 选择题 第 1 题 单选题 下列哪个软件不能运行Python程序?( ) A.JupyterNotebook B.Pycharm C.原版…...
微前端框架Module Federation
以下是 Module Federation 的核心知识点,并结合微前端架构的设计思想,帮助我们构建完整的知识体系: 一、Module Federation 基础概念 1. 什么是 Module Federation? 定义:Webpack 5 引入的一项革命性功能,允许在运行时动态加载其他独立构建的应用模块(微前端),实现跨…...
AUTOSAR图解==>AUTOSAR_SWS_IntrusionDetectionSystemManager
AUTOSAR 入侵检测系统管理器 (IdsM) 详解 AUTOSAR安全框架的核心组件 1. 概述 AUTOSAR 入侵检测系统管理器(Intrusion Detection System Manager, IdsM)是AUTOSAR标准中安全防护框架的关键组成部分,专门负责处理车载安全事件。IdsM模块提供了…...