PyInstaller打包Python项目时处理JSON等数据文件的完整指南
1. 项目缘起一个看似简单却暗藏玄机的需求最近在做一个Python小工具功能不复杂就是读取一个本地的config.json配置文件然后根据里面的参数执行一些自动化操作。开发过程很顺利用PyInstaller打包成单个exe文件准备发给同事测试。结果同事双击运行直接报错FileNotFoundError: [Errno 2] No such file or directory: ‘config.json’。我当时就懵了config.json明明和脚本放在同一个目录下怎么找不到了检查了一下同事的电脑发现打包后的exe文件运行时其“当前工作目录”并不是exe文件所在的目录而是可能受启动方式比如从快捷方式、任务管理器影响的其他路径。更关键的是PyInstaller默认并不会将你的数据文件如.json,.txt, 图片等自动打包进最终的exe中。这就引出了我们今天要深入探讨的核心问题如何在使用PyInstaller打包Python项目时正确、可靠地处理并访问项目所依赖的JSON等数据文件。这绝不仅仅是加个参数那么简单。它涉及到PyInstaller的打包机制、运行时环境、文件路径获取、以及不同场景下的最佳实践。网上搜到的很多教程只给一句--add-data但实际用起来坑不少比如路径格式写错、开发环境和打包后环境路径获取方式不同、文件被解压到临时目录导致只读等问题。接下来我将结合自己的踩坑经验从原理到实践把PyInstaller打包JSON文件的几种方法及其适用场景彻底讲透。2. 理解PyInstaller的打包逻辑你的文件去哪了在动手之前我们必须先搞清楚PyInstaller是怎么工作的。很多人误以为打包就是把所有东西“塞”进一个exe其实不完全准确。PyInstaller的核心工作流程是分析你的主脚本比如main.py找到所有import的模块包括标准库和第三方库将这些模块的字节码.pyc文件以及Python解释器本身一起捆绑到一个可执行文件或一个文件夹中。当你运行这个exe时它会先在一个临时目录例如Windows下是C:\Users\用户名\AppData\Local\Temp\_MEIxxxxxx这样的随机命名文件夹中解压这些资源然后在这个临时环境中启动Python解释器并执行你的脚本。那么你的config.json文件呢默认情况下它被排除在这个捆绑包之外。这就是为什么直接使用相对路径./config.json会找不到文件的原因——你的脚本在临时目录里运行而config.json还孤零零地待在原来的发布目录里。因此我们的目标很明确告诉PyInstaller请把config.json这个数据文件也当作资源一起捆绑到最终的可执行程序中并在运行时能让我们的脚本找到它。主要有两种策略1. 作为数据文件捆绑2. 将文件内容编码进脚本本身。3. 方法一使用--add-data参数进行文件捆绑最通用这是最常用、最直接的方法。通过命令行参数或spec文件明确指定哪些额外的文件需要被打包。3.1 命令行直接打包假设你的项目结构如下my_project/ ├── main.py └── config.json你希望在打包时将config.json放在exe的同级目录。在my_project目录下打开命令行执行pyinstaller --onefile --add-data “config.json;.” main.py这里有几个关键点--onefile: 生成单个exe文件。如果不加则生成一个包含exe和依赖库的文件夹。--add-data “SRC;DEST”: 这是核心参数。SRC: 源文件路径相对于你执行打包命令的目录。这里就是config.json。DEST: 目标路径这是相对于打包后exe运行时所在的临时解压目录的根目录而言的。.表示根目录你也可以指定子目录如data。分隔符在Windows上是;在Linux/macOS上是:。这是最容易出错的地方之一。执行后PyInstaller会在dist文件夹生成main.exe。此时config.json的二进制内容已经被捆绑进exe。当用户运行main.exe时config.json会被解压到临时目录的根位置因为我们在DEST指定了.。3.2 如何在运行时找到被捆绑的文件文件是打包进去了但你的代码不能再用./config.json或config.json这样的相对路径去读了因为运行时的工作目录是变化的。我们需要一种方法来定位临时解压目录中文件的绝对路径。PyInstaller提供了一个运行时变量sys._MEIPASS。当你的脚本在打包后的环境中运行时这个变量会被设置成临时解压目录的路径。如果不在打包环境中即直接python main.py运行这个变量则不存在。因此一个健壮的路径获取方法如下import sys import os import json def get_resource_path(relative_path): 获取资源的绝对路径。在打包后和开发环境下都能工作。 try: # PyInstaller会创建一个临时文件夹并将路径存储在 _MEIPASS 中 base_path sys._MEIPASS except AttributeError: # 如果不是打包环境则使用当前文件的目录作为基础路径 base_path os.path.abspath(“.”) # 如果资源文件在子目录中这里需要拼接。我们假设文件在根目录所以直接join。 return os.path.join(base_path, relative_path) # 使用示例 config_path get_resource_path(“config.json”) with open(config_path, ‘r’, encoding‘utf-8’) as f: config json.load(f) print(config)这段代码的精髓在于get_resource_path函数。它首先尝试获取sys._MEIPASS成功则说明在打包环境中资源在临时目录失败则说明在开发环境资源就在当前工作目录或脚本所在目录。这样就实现了开发/发布环境的一体化访问。注意使用--onefile模式时每次启动exe都会解压到新的临时目录上次运行解压的文件会被系统清理。因此被捆绑的数据文件在运行时是只读的。如果你需要写入配置必须将写入目标指向另一个固定的用户目录如AppData而不是尝试覆盖临时目录中的文件。3.3 使用Spec文件进行高级配置对于复杂项目或者需要重复打包使用spec文件更专业。首先生成一个基础spec文件pyinstaller --onefile main.py这会生成一个main.spec文件。用文本编辑器打开它找到datas[]这一行并进行修改# -*- mode: python ; coding: utf-8 -*- a Analysis( [‘main.py’], pathex[], binaries[], datas[(‘config.json’, ‘.’)], # 修改这一行格式是 (源, 目标) hiddenimports[], hookspath[], hooksconfig{}, runtime_hooks[], excludes[], noarchiveFalse, ) ...datas是一个列表每个元素是一个元组(源路径, 目标相对路径)。这里的‘.’含义与命令行参数中的DEST相同。修改并保存spec文件后直接使用spec文件进行打包不再需要冗长的命令行参数pyinstaller main.spec使用spec文件的好处是配置可保存、可版本控制并且可以配置更多高级选项比如加密、图标、版本信息等。4. 方法二将JSON内容内嵌为代码适用于小文件如果你的JSON配置文件很小比如只有几KB内容也很固定另一种更“干净”的方法是直接将JSON内容作为字典dict写入到你的Python脚本中或者作为一个字符串常量。步骤1转换JSON为Python数据结构假设你的config.json内容如下{ “app_name”: “MyTool”, “version”: “1.0”, “max_workers”: 4 }你可以创建一个新的Python文件比如config_data.py# config_data.py CONFIG_DATA { “app_name”: “MyTool”, “version”: “1.0”, “max_workers”: 4 }步骤2在主脚本中导入使用# main.py from config_data import CONFIG_DATA def main(): app_name CONFIG_DATA[“app_name”] max_workers CONFIG_DATA[“max_workers”] print(f”启动 {app_name}, 使用 {max_workers} 个工作线程。”) # … 其他逻辑 if __name__ “__main__”: main()然后正常打包main.py即可PyInstaller会自动分析导入关系将config_data.py一并打包。你完全不需要处理--add-data和路径问题。优点部署极其简单只有一个exe文件没有外部依赖。访问速度最快因为数据已经在内存中的字典里。避免了文件路径和文件读写的所有问题。缺点配置无法在不修改代码的情况下更新。用户想改个参数必须找你重新打包。不适合大文件或二进制文件。JSON内容如果有复杂转义字符如包含大量双引号、换行手动转换成Python字典或字符串容易出错。自动化转换技巧你可以写一个简单的构建脚本在打包前自动将config.json转换成config_data.py。# build.py import json with open(‘config.json’, ‘r’, encoding‘utf-8’) as f: data json.load(f) with open(‘config_data.py’, ‘w’, encoding‘utf-8’) as f: f.write(f”CONFIG_DATA {repr(data)}\n”)运行python build.py生成config_data.py然后再打包。这样你只需维护config.json但交付物中配置仍是硬编码的。5. 方法三结合使用实现配置分层推荐架构在实际项目中我通常采用一种混合策略兼顾灵活性和便利性内置默认配置将一份最基础的、保证程序能运行的默认配置使用方法二内嵌的方式打包进exe。外部用户配置程序首次运行时在用户目录如%APPDATA%\YourApp生成一份完整的配置文件。如果该外部配置文件存在则优先读取外部配置如果不存在则使用内置默认配置并可选地将默认配置写入外部文件供用户修改。这样做的优势非常明显开箱即用用户拿到exe直接就能运行无需准备配置文件。用户可配置高级用户可以在指定位置修改配置文件自定义行为而无需重新打包。便于更新你可以通过更新外部配置模板来调整程序行为甚至实现简单的自动更新配置功能。示例代码框架import sys import os import json from pathlib import Path # —- 第一部分内置默认配置 (打包在代码内) —- DEFAULT_CONFIG { “theme”: “light”, “language”: “zh-CN”, “server_port”: 8080 } # —- 第二部分获取用户配置目录 —- def get_user_config_dir(): “”“返回跨平台的用户配置目录路径。”“” home Path.home() # 例如在Windows上是 C:\Users\用户名\AppData\Roaming\YourAppName # 在Linux/macOS上是 /home/用户名/.config/YourAppName app_name “YourAppName” if sys.platform “win32”: config_dir home / “AppData” / “Roaming” / app_name else: config_dir home / “.config” / app_name config_dir.mkdir(parentsTrue, exist_okTrue) # 确保目录存在 return config_dir # —- 第三部分配置加载逻辑 —- def load_config(): user_config_path get_user_config_dir() / “config.json” # 优先级1读取用户外部配置文件 if user_config_path.exists(): try: with open(user_config_path, ‘r’, encoding‘utf-8’) as f: user_config json.load(f) # 用用户配置覆盖默认配置浅合并深合并更复杂些 final_config {**DEFAULT_CONFIG, **user_config} print(f”从用户配置加载: {user_config_path}”) return final_config except json.JSONDecodeError: print(f”用户配置文件格式错误将使用默认配置。”) return DEFAULT_CONFIG # 优先级2没有用户配置使用默认配置并尝试创建一份用户配置模板 else: try: with open(user_config_path, ‘w’, encoding‘utf-8’) as f: json.dump(DEFAULT_CONFIG, f, indent4, ensure_asciiFalse) print(f”未找到用户配置已创建默认模板在: {user_config_path}”) except IOError: print(“无法创建用户配置文件将仅使用内置默认配置。”) return DEFAULT_CONFIG if __name__ “__main__”: config load_config() print(f”最终配置: {config}”)这种架构在实践中非常稳健它清晰地分离了“程序默认行为”和“用户个性化设置”是很多专业桌面应用采用的方式。6. 实战避坑指南与高级技巧掌握了基本方法我们来看看实际打包和分发过程中会遇到哪些坑以及如何解决。坑1路径分隔符错误与跨平台兼容前面提到--add-data的参数中源路径和目标路径之间的分隔符Windows用;而Linux/macOS用:。如果你写的脚本需要在不同平台打包这会导致问题。解决方案在spec文件中配置datas因为spec文件中的元组格式是平台无关的。或者在你的打包脚本中动态判断平台# build.py import platform import subprocess sep “;” if platform.system() “Windows” else “:” cmd f’pyinstaller --onefile --add-data “config.json{sep}.” main.py’ subprocess.run(cmd, shellTrue)坑2访问打包后的资源文件时权限不足在--onefile模式下资源被解压到临时目录。在某些严格的企业安全策略下程序可能没有权限在临时目录创建或读取文件虽然解压是PyInstaller自己完成的。解决方案如果遇到此类问题可以考虑放弃--onefile改用--onedir生成一个目录。这样所有资源文件会直接放在目录里路径稳定权限问题也更容易排查。牺牲一点便利性换来更好的兼容性。坑3需要打包整个目录的JSON文件如果你的项目有一个data/目录里面存放了多个JSON文件如何打包命令行不太方便需要为每个文件写--add-data。Spec文件这是最佳选择。可以使用通配符或循环添加。# 在spec文件的Analysis中 import glob # 添加data目录下所有.json文件并保持目录结构 data_files [(file, ‘data’) for file in glob.glob(‘data/*.json’)] # 或者添加整个data目录 # data_files [(‘data/’, ‘data’)] # 注意源路径后的’/‘表示这是个目录 a Analysis( ... datasdata_files, ... )运行时你可以用get_resource_path(‘data/some_file.json’)来访问。坑4JSON文件编码问题Windows记事本默认用GBK编码保存文件而你的代码用utf-8读取会导致UnicodeDecodeError。解决方案在代码中打开文件时始终明确指定编码encoding‘utf-8’并确保你的JSON文件也是用UTF-8保存的推荐使用VS Code、Notepad等编辑器。对于可能由用户提供的配置文件可以增加编码检测和容错逻辑。坑5反编译风险与代码保护用PyInstaller打包的exe并不能真正防止反编译。有工具可以解包exe提取出你的字节码.pyc文件进而被反编译成可读性较高的源代码。你的JSON配置文件如果包含敏感信息如API密钥、数据库连接串也会随之暴露。解决方案最小化敏感信息不要将真正的密钥硬编码在配置或代码中。使用环境变量或在首次运行时由用户输入。加密配置文件将JSON内容用对称加密算法如AES加密后保存。程序运行时用一个内置的或从外部获取的密钥解密。这增加了反编译者的难度但密钥本身仍需保护。使用PyInstaller的--key参数需安装tinyaes这会对字节码进行加密增加反编译难度但并非绝对安全。关键逻辑用C/C扩展将最核心的、涉及敏感信息的逻辑用Cython编译或写成C扩展模块。记住没有绝对的安全。对于桌面应用更重要的是确保客户端与服务器通信的安全使用HTTPS、临时令牌等而不是试图完全隐藏客户端内的信息。7. 完整工作流示例从开发到分发让我们用一个完整的例子串联所有步骤。项目一个简单的词汇查询工具从一个words.json文件中读取词汇数据。1. 项目结构vocabulary_tool/ ├── src/ │ ├── main.py │ └── data/ │ └── words.json (包含大量词汇数据) ├── build.py (构建脚本) └── vocab_tool.spec (PyInstaller spec文件)2. 核心代码 (src/main.py)import sys import os import json from pathlib import Path def resource_path(relative_path): “”“获取打包后资源的绝对路径”“” if hasattr(sys, ‘_MEIPASS’): base_path sys._MEIPASS else: base_path os.path.abspath(“.”) return os.path.join(base_path, relative_path) def load_vocabulary(): “”“加载词汇数据”“” # 数据文件在打包后被放在临时目录的根目录我们把它放在‘data’子目录下 data_path resource_path(os.path.join(‘data’, ‘words.json’)) try: with open(data_path, ‘r’, encoding‘utf-8’) as f: return json.load(f) except FileNotFoundError: print(f”错误未找到数据文件在 {data_path}”) print(“请确保程序已正确打包或‘data/words.json’存在于当前目录。”) sys.exit(1) except json.JSONDecodeError as e: print(f”错误数据文件格式无效 - {e}”) sys.exit(1) def main(): print(“词汇查询工具启动...”) vocab load_vocabulary() # 示例打印第一个词条 first_word list(vocab.keys())[0] print(f”示例词条 ‘{first_word}‘: {vocab[first_word]}”) # … 这里应该是你的GUI或CLI交互逻辑 input(“按回车键退出...”) if __name__ “__main__”: main()3. 构建脚本 (build.py)#!/usr/bin/env python3 import platform import subprocess import shutil from pathlib import Path def main(): project_root Path(__file__).parent src_dir project_root / “src” spec_file project_root / “vocab_tool.spec” print(“正在清理旧的构建文件...”) for item in [‘build’, ‘dist’]: dir_path project_root / item if dir_path.exists(): shutil.rmtree(dir_path) print(“生成spec文件...”) # 使用pyi-makespec生成初始spec文件并添加数据文件 # 注意这里我们选择生成文件夹模式(--onedir)便于管理数据文件 subprocess.run([ ‘pyi-makespec’, ‘--onedir’, ‘--name’, ‘VocabTool’, ‘--add-data’, f”{src_dir/‘data/words.json’}{‘;’ if platform.system()‘Windows’ else ‘:’}data”, str(src_dir / ‘main.py’) ], cwdproject_root, checkTrue) # 重命名生成的spec文件可选 if (project_root / ‘main.spec’).exists(): (project_root / ‘main.spec’).rename(spec_file) print(“开始打包...”) subprocess.run([‘pyinstaller’, ‘--clean’, str(spec_file)], cwdproject_root, checkTrue) print(“\n打包完成”) dist_dir project_root / ‘dist’ / ‘VocabTool’ if dist_dir.exists(): print(f”可执行文件及资源位于: {dist_dir}”) print(f”主程序: {dist_dir / ‘VocabTool.exe’ (or VocabTool on macOS/Linux)}”) print(f”数据文件: {dist_dir / ‘data’ / ‘words.json’}”) if __name__ “__main__”: main()4. 执行与分发运行python build.py最终会在dist/VocabTool目录下生成一个包含VocabTool.exe和data/words.json的文件夹。你可以将这个整个文件夹压缩分发给用户。用户解压后直接运行VocabTool.exe即可所有依赖和数据都在文件夹内。这个工作流展示了从项目组织、路径处理、自动化构建到最终分发的完整闭环适用于大多数带数据文件的Python桌面工具项目。

相关新闻

数学建模实战:最大覆盖模型求解交通可达率问题

数学建模实战:最大覆盖模型求解交通可达率问题

1. 从“未来新城”到“可达率”:一个数学建模者的实战视角 五一数学建模竞赛的B题,把场景设定在了一个充满科幻感的“未来新城”。题目名字听起来宏大,但核心其实非常具体: 交通需求规划与可达率问题 。这几乎是所有城市交通规划…

2026/8/26 12:09:18 阅读更多 →
B站漫画爬虫实战:从API逆向到异步下载的完整实现

B站漫画爬虫实战:从API逆向到异步下载的完整实现

1. 项目缘起:从“追更”到“备份”的刚需作为一名老二次元,我追B站漫画(BiliBili漫画)也有好几年了。平台体验确实不错,正版高清、更新及时,但有两个痛点一直让我如鲠在喉:一是网络波动时加载慢…

2026/8/26 12:09:18 阅读更多 →
RabbitMQ安装与配置全攻略:Windows/Linux环境详解与避坑指南

RabbitMQ安装与配置全攻略:Windows/Linux环境详解与避坑指南

1. 项目概述:为什么RabbitMQ安装是微服务架构的“第一公里” 如果你正在搭建一个微服务系统,或者准备处理异步任务、削峰填谷,那么RabbitMQ几乎是一个绕不开的名字。它就像一个高度可靠、智能的邮局,负责在不同服务(生…

2026/8/26 12:09:18 阅读更多 →

最新新闻

共享单车调度优化建模实战:从问题解构到三层决策框架

共享单车调度优化建模实战:从问题解构到三层决策框架

1. 这不是“标准答案”,而是一份可直接上手的建模路线图 “2024年第九届数维杯大学生数学建模挑战赛B题思路1.0版本”——这个标题背后,藏着一群大二大三学生在赛前72小时反复刷新官网、对照往届题型、翻烂《数学建模算法与应用》第3版的真实状态。我带过…

2026/8/26 12:39:01 阅读更多 →
从零手搓Linux GPIO驱动:深入内核数据通路与字符设备开发实践

从零手搓Linux GPIO驱动:深入内核数据通路与字符设备开发实践

1. 项目概述:为什么我们要手搓一个驱动? 搞嵌入式或者玩树莓派的朋友,肯定都干过用Python或者C语言,通过 wiringPi 、 bcm2835 这类库去控制GPIO口的事情。点个灯、读个按键,几行代码就搞定了,感觉驱动…

2026/8/26 12:39:01 阅读更多 →
Copula变分推断(CVB):解决非椭圆依赖建模的聚类新范式

Copula变分推断(CVB):解决非椭圆依赖建模的聚类新范式

1. 这不是又一个“高斯混合模型”复刻:CVB到底在解决什么真实痛点? 我第一次看到“Copula VB(CVB)性能优于VB、EM和k均值”这个结论时,下意识点开了论文附录里的Matlab代码——结果发现它根本没调用任何现成的 fitgmd…

2026/8/26 12:39:01 阅读更多 →
基于AgentScope的企业级AI智能体平台:架构设计与工程实践

基于AgentScope的企业级AI智能体平台:架构设计与工程实践

简介:随着大语言模型向智能体(Agent)演进,企业级AI平台的构建已从单一对话转向多智能体协作与全生命周期管理。AgentScope作为分布式智能体编排框架,凭借Actor模型的通信机制、灵活的模型接入和内置可观测性&#xff0…

2026/8/26 12:39:01 阅读更多 →
豆瓣电影分析Python课设:从数据清洗到打包交付全流程指南

豆瓣电影分析Python课设:从数据清洗到打包交付全流程指南

简介:数据分析课程设计考察的往往不只是代码能力,更是对不干净数据的处理和对结论的完整表达。以豆瓣电影分析为例,从数据获取、缺失值处理、字段类型转换,到基于pandas的分组聚合与matplotlib的可视化呈现,再到最终项…

2026/8/26 12:39:01 阅读更多 →
Harris角点+ORB匹配在工业视觉定位中的工程实践

Harris角点+ORB匹配在工业视觉定位中的工程实践

1. 这不是“过时技术”,而是机器人定位与视觉导航的底层锚点 你可能在刷技术社区时看到过类似描述:“Harris角点检测早就被SIFT、ORB甚至深度学习特征取代了”——这话放在手机拍照增强或电商图像搜索场景里,确实成立。但如果你正在调试一台室…

2026/8/26 12:38:00 阅读更多 →

日新闻

Python random 模块常用函数详解:从入门到实战

Python random 模块常用函数详解:从入门到实战

目录 1. 引言2. 准备工作3. 基础随机函数4. 序列相关函数5. 随机种子与复现6. 实战案例7. 注意事项8. 常见问题与排查9. 总结 1. 引言 摘要: 本文系统介绍 Python 标准库 random 模块中最常用的随机数生成函数。内容涵盖基础随机函数(random()、unifor…

2026/8/26 0:00:40 阅读更多 →
《Microsoft Sql server 2008 Internals》读书笔记--第三章Databases and Database Files(2)

《Microsoft Sql server 2008 Internals》读书笔记--第三章Databases and Database Files(2)

《Microsoft Sql server 2008 Internals》索引目录: 《Microsoft Sql server 2008 Internals》读书笔记--目录索引 在上篇文章中,主要介绍了创建数据库的基本语法和FileGroup的初步知识。需要注意的是: 关于FileGroup 如果你的系统是用Raid设备直接存…

2026/8/26 1:18:18 阅读更多 →
政务AI智能体怎么建?三种模式、三步路径与四个误区

政务AI智能体怎么建?三种模式、三步路径与四个误区

政务AI智能体已经从概念试点阶段,转入了政务服务的常态化落地应用;在实际使用过程中,它能自主理解办事需求、辅助完成填报申报、开展材料预审,并联动多个系统协同作业,真正嵌入到政务办理的全流程当中。但在落地推进过…

2026/8/26 1:18:18 阅读更多 →

周新闻

[光学原理与应用-521]:对光的错误理解与纠偏

[光学原理与应用-521]:对光的错误理解与纠偏

首先光是一种能量的载体和形态,宏观上观察到的光是由无数个微观的光量子组成的,每个光子在产生的瞬间,其在真空的空间中以确定不变的速度沿着一个初始的方向一直向前,在微观层面,每个光量子的运动轨迹是以波函数所展现…

2026/8/25 3:38:12 阅读更多 →
SIP通话转接原理与REFER方法实战解析

SIP通话转接原理与REFER方法实战解析

1. 通话转接不是“挂断再拨号”,而是SIP会话的动态重定向你有没有遇到过这样的场景:客服坐席A正在和客户通电话,突然需要把这通对话无缝转给专家坐席B,客户完全感知不到中间的断连——既没听到忙音,也没被要求重新拨号…

2026/8/25 3:38:18 阅读更多 →
Kolla-ansible单节点OpenStack部署实战:从环境准备到排坑指南

Kolla-ansible单节点OpenStack部署实战:从环境准备到排坑指南

1. 为什么选择Kolla-ansible来部署单节点OpenStack?如果你正在寻找一种能把OpenStack从“概念”快速变成“可用的实验环境”的方法,那么Kolla-ansible几乎是当前最主流、最省心的选择。我见过太多人卡在手动编译依赖、配置服务、处理版本冲突的泥潭里&am…

2026/8/25 3:38:23 阅读更多 →

月新闻

免费解锁百度网盘SVIP加速:macOS用户必备的下载提速终极指南

免费解锁百度网盘SVIP加速:macOS用户必备的下载提速终极指南

免费解锁百度网盘SVIP加速:macOS用户必备的下载提速终极指南 【免费下载链接】BaiduNetdiskPlugin-macOS For macOS.百度网盘 破解SVIP、下载速度限制~ 项目地址: https://gitcode.com/gh_mirrors/ba/BaiduNetdiskPlugin-macOS 还在为百度网盘macOS版的龟速下…

2026/8/26 3:50:20 阅读更多 →
终极ncmdump指南:3分钟实现网易云NCM音乐解密与格式转换

终极ncmdump指南:3分钟实现网易云NCM音乐解密与格式转换

终极ncmdump指南:3分钟实现网易云NCM音乐解密与格式转换 【免费下载链接】ncmdump 项目地址: https://gitcode.com/gh_mirrors/ncmd/ncmdump 还在为网易云音乐下载的NCM格式文件无法在其他播放器播放而烦恼吗?ncmdump解密工具帮你轻松解决这个困…

2026/8/25 10:31:12 阅读更多 →
HarmonyOS 应用开发《掌上英语》第81篇: 智能体卡片:为英语学习 App 打造桌面级学习助手

HarmonyOS 应用开发《掌上英语》第81篇: 智能体卡片:为英语学习 App 打造桌面级学习助手

AgentCard 智能体卡片:为英语学习 App 打造桌面级学习助手适用平台:HarmonyOS 7.0 (API 26 Beta)一、引言 HarmonyOS 7.0(API 26 Beta)新增了 AgentCard 智能体卡片能力,这是继 HMAF(鸿蒙智能体框架&#x…

2026/8/26 1:24:05 阅读更多 →