Python脚本封装成可复用库:从setuptools到PyPI发布的完整指南
这次我们来看一个Python开发者经常遇到的实际问题如何把写好的Python脚本封装成可复用的库。无论是个人项目中的工具脚本还是团队协作中的功能模块封装成库都能显著提升代码的可维护性和复用性。封装库的核心价值在于标准化接口、简化依赖管理、便于版本控制。一个设计良好的Python库可以让其他开发者通过简单的pip install就能使用你的功能而不需要关心内部实现细节。本文将从最简单的单文件脚本开始逐步讲解如何构建完整的Python包包括项目结构设计、依赖管理、打包发布和版本控制。对于Python开发者来说掌握库封装技术是职业成长的关键一步。无论你是想将内部工具分享给团队还是计划将优秀项目开源正确的封装方法都能让你的代码更加专业和易用。1. 核心能力速览能力项说明支持场景单文件脚本封装、多模块包构建、依赖自动管理、版本控制核心工具setuptools、poetry、flit现代打包工具输出格式源码包(sdist)、二进制包(wheel)、可安装包发布平台PyPI(公开)、私有仓库、本地安装兼容性Python 3.6支持虚拟环境隔离进阶功能C扩展打包、数据文件包含、入口点脚本2. 适用场景与使用边界2.1 适合封装的场景个人工具脚本标准化当你有一个经常使用的工具脚本比如文件处理、数据清洗或自动化任务封装成库可以让你在不同项目中轻松复用。团队协作开发在团队项目中将公共功能封装成内部库可以统一接口规范减少代码重复提高开发效率。开源项目发布如果你开发了一个有价值的工具或框架封装成标准的Python包便于其他开发者安装使用。API客户端封装对第三方服务的API调用进行封装提供更友好的Python接口。2.2 不适合封装的场景一次性脚本如果脚本只会在特定环境下使用一次封装成库可能过度设计。高度环境依赖需要特定系统配置或硬件的脚本封装后可能在其他环境无法正常运行。版权敏感代码涉及商业机密或特殊许可证的代码需要谨慎考虑发布范围。3. 环境准备与前置条件3.1 基础环境要求确保你的开发环境满足以下条件Python版本3.6或更高版本推荐3.8包管理工具pip最新版本虚拟环境venv或conda环境隔离代码编辑器VS Code、PyCharm等支持Python的IDE3.2 工具链检查在开始之前验证基础工具是否就绪# 检查Python版本 python --version # 检查pip版本 pip --version # 检查setuptools和wheel pip list | grep -E (setuptools|wheel)3.3 项目环境搭建为每个库项目创建独立的虚拟环境# 创建项目目录 mkdir my_python_library cd my_python_library # 创建虚拟环境 python -m venv venv # 激活虚拟环境 # Windows venv\Scripts\activate # Linux/Mac source venv/bin/activate4. 从脚本到库的完整转换流程4.1 阶段一单文件脚本分析假设我们有一个简单的数据处理脚本data_processor.py#!/usr/bin/env python3 简单数据处理脚本示例 import csv import json from pathlib import Path def read_csv_file(file_path): 读取CSV文件 data [] with open(file_path, r, encodingutf-8) as file: reader csv.DictReader(file) for row in reader: data.append(row) return data def save_json_file(data, output_path): 保存为JSON文件 with open(output_path, w, encodingutf-8) as file: json.dump(data, file, indent2, ensure_asciiFalse) def process_data(input_file, output_file): 主处理函数 print(f处理文件: {input_file}) csv_data read_csv_file(input_file) save_json_file(csv_data, output_file) print(f处理完成: {output_file}) if __name__ __main__: # 命令行使用示例 import sys if len(sys.argv) ! 3: print(用法: python data_processor.py 输入文件 输出文件) sys.exit(1) input_file sys.argv[1] output_file sys.argv[2] process_data(input_file, output_file)4.2 阶段二重构为库结构将单文件脚本重构为标准的包结构my_data_processor/ ├── src/ │ └── my_data_processor/ │ ├── __init__.py │ ├── file_io.py │ ├── processors.py │ └── cli.py ├── tests/ │ ├── __init__.py │ ├── test_file_io.py │ └── test_processors.py ├── docs/ │ └── usage.md ├── setup.py ├── pyproject.toml ├── README.md └── requirements.txt4.3 核心模块代码实现src/my_data_processor/init.py- 包入口文件 My Data Processor - 一个简单的数据处理库 from .file_io import read_csv_file, save_json_file from .processors import DataProcessor from .cli import main __version__ 0.1.0 __author__ Your Name __email__ your.emailexample.com __all__ [read_csv_file, save_json_file, DataProcessor, main]src/my_data_processor/file_io.py- 文件IO模块文件读写功能模块 import csv import json from pathlib import Path def read_csv_file(file_path, encodingutf-8): 读取CSV文件并返回字典列表 Args: file_path: CSV文件路径 encoding: 文件编码默认utf-8 Returns: list: 包含字典的列表每个字典代表一行数据 data [] try: with open(file_path, r, encodingencoding) as file: reader csv.DictReader(file) data [row for row in reader] except FileNotFoundError: raise FileNotFoundError(f文件不存在: {file_path}) except Exception as e: raise RuntimeError(f读取文件失败: {e}) return data def save_json_file(data, output_path, indent2, encodingutf-8): 将数据保存为JSON文件 Args: data: 要保存的数据 output_path: 输出文件路径 indent: JSON缩进默认2 encoding: 文件编码默认utf-8 try: with open(output_path, w, encodingencoding) as file: json.dump(data, file, indentindent, ensure_asciiFalse) except Exception as e: raise RuntimeError(f保存文件失败: {e})src/my_data_processor/processors.py- 数据处理核心逻辑数据处理核心功能 from .file_io import read_csv_file, save_json_file class DataProcessor: 数据处理主类 def __init__(self, input_encodingutf-8, output_encodingutf-8): self.input_encoding input_encoding self.output_encoding output_encoding def csv_to_json(self, input_file, output_file): 将CSV文件转换为JSON格式 Args: input_file: 输入CSV文件路径 output_file: 输出JSON文件路径 Returns: bool: 处理是否成功 try: data read_csv_file(input_file, self.input_encoding) save_json_file(data, output_file, encodingself.output_encoding) return True except Exception as e: print(f处理失败: {e}) return False def batch_process(self, file_pairs): 批量处理多个文件对 Args: file_pairs: 包含(input_file, output_file)元组的列表 Returns: dict: 处理结果统计 results {success: 0, failed: 0, errors: []} for input_file, output_file in file_pairs: try: if self.csv_to_json(input_file, output_file): results[success] 1 else: results[failed] 1 except Exception as e: results[failed] 1 results[errors].append(f{input_file}: {e}) return resultssrc/my_data_processor/cli.py- 命令行接口命令行接口模块 import argparse import sys from .processors import DataProcessor def main(): 主命令行函数 parser argparse.ArgumentParser(descriptionCSV转JSON处理工具) parser.add_argument(input_file, help输入CSV文件路径) parser.add_argument(output_file, help输出JSON文件路径) parser.add_argument(--encoding, defaultutf-8, help文件编码) args parser.parse_args() processor DataProcessor( input_encodingargs.encoding, output_encodingargs.encoding ) success processor.csv_to_json(args.input_file, args.output_file) sys.exit(0 if success else 1) if __name__ __main__: main()5. 打包配置与元数据设置5.1 传统setup.py配置setup.py- 传统打包配置from setuptools import setup, find_packages with open(README.md, r, encodingutf-8) as fh: long_description fh.read() setup( namemy-data-processor, version0.1.0, authorYour Name, author_emailyour.emailexample.com, description一个简单的CSV到JSON数据处理库, long_descriptionlong_description, long_description_content_typetext/markdown, urlhttps://github.com/yourusername/my-data-processor, package_dir{: src}, packagesfind_packages(wheresrc), classifiers[ Development Status :: 3 - Alpha, Intended Audience :: Developers, License :: OSI Approved :: MIT License, Operating System :: OS Independent, Programming Language :: Python :: 3, Programming Language :: Python :: 3.6, Programming Language :: Python :: 3.7, Programming Language :: Python :: 3.8, Programming Language :: Python :: 3.9, ], python_requires3.6, install_requires[], entry_points{ console_scripts: [ data-processormy_data_processor.cli:main, ], }, )5.2 现代pyproject.toml配置pyproject.toml- 推荐使用现代配置[build-system] requires [setuptools45, wheel, setuptools_scm] build-backend setuptools.build_meta [project] name my-data-processor dynamic [version] description 一个简单的CSV到JSON数据处理库 authors [ {name Your Name, email your.emailexample.com} ] license {text MIT} readme README.md requires-python 3.6 keywords [csv, json, data-processing, converter] classifiers [ Development Status :: 3 - Alpha, Intended Audience :: Developers, License :: OSI Approved :: MIT License, Operating System :: OS Independent, Programming Language :: Python :: 3, Programming Language :: Python :: 3.6, Programming Language :: Python :: 3.7, Programming Language :: Python :: 3.8, Programming Language :: Python :: 3.9, ] dependencies [] [project.optional-dependencies] dev [ pytest6.0, pytest-cov, black, flake8, ] [project.urls] Homepage https://github.com/yourusername/my-data-processor Documentation https://github.com/yourusername/my-data-processor#readme Issues https://github.com/yourusername/my-data-processor/issues [project.scripts]># My Data Processor 一个简单易用的CSV到JSON数据处理Python库。 ## 功能特性 - CSV文件读取和解析 - JSON格式数据导出 - 批量文件处理支持 - ️ 命令行接口(CLI) - Python API接口 ## 安装方式 bash # 从源码安装 pip install githttps://github.com/yourusername/my-data-processor.git # 或者下载后本地安装 git clone https://github.com/yourusername/my-data-processor cd my-data-processor pip install .快速开始命令行使用# 单个文件转换>from my_data_processor import DataProcessor # 创建处理器实例 processor DataProcessor() # 单个文件转换 processor.csv_to_json(input.csv, output.json) # 批量处理 file_pairs [(file1.csv, file1.json), (file2.csv, file2.json)] results processor.batch_process(file_pairs) print(f成功: {results[success]}, 失败: {results[failed]})许可证MIT License## 6. 构建与测试流程 ### 6.1 本地构建测试 bash # 安装构建依赖 pip install build twine # 构建源码包和wheel包 python -m build # 查看构建结果 ls dist/ # my_data_processor-0.1.0-py3-none-any.whl # my_data_processor-0.1.0.tar.gz # 本地安装测试 pip install dist/my_data_processor-0.1.0-py3-none-any.whl6.2 单元测试实现tests/test_file_io.py- 文件IO测试import pytest import tempfile import os from my_data_processor.file_io import read_csv_file, save_json_file class TestFileIO: 文件IO功能测试 def test_read_csv_file(self): 测试CSV文件读取 # 创建临时CSV文件 with tempfile.NamedTemporaryFile(modew, suffix.csv, deleteFalse) as f: f.write(name,age,city\nAlice,30,Beijing\nBob,25,Shanghai\n) temp_csv f.name try: data read_csv_file(temp_csv) assert len(data) 2 assert data[0][name] Alice assert data[1][city] Shanghai finally: os.unlink(temp_csv) def test_save_json_file(self): 测试JSON文件保存 test_data [{name: Alice, age: 30}, {name: Bob, age: 25}] with tempfile.NamedTemporaryFile(suffix.json, deleteFalse) as f: temp_json f.name try: save_json_file(test_data, temp_json) # 验证文件内容 with open(temp_json, r) as f: content f.read() assert Alice in content assert Bob in content finally: os.unlink(temp_json)6.3 功能集成测试创建测试脚本验证完整功能#!/usr/bin/env python3 功能集成测试脚本 import tempfile import os from my_data_processor import DataProcessor def test_integration(): 集成测试完整流程验证 # 创建测试CSV文件 with tempfile.NamedTemporaryFile(modew, suffix.csv, deleteFalse) as f: f.write(id,name,value\n1,Test1,100\n2,Test2,200\n) input_file f.name # 创建输出文件路径 with tempfile.NamedTemporaryFile(suffix.json, deleteFalse) as f: output_file f.name try: # 测试处理功能 processor DataProcessor() success processor.csv_to_json(input_file, output_file) assert success, 处理应该成功 assert os.path.exists(output_file), 输出文件应该存在 # 验证输出内容 with open(output_file, r) as f: content f.read() assert Test1 in content assert Test2 in content print(✅ 集成测试通过) finally: # 清理临时文件 for temp_file in [input_file, output_file]: if os.path.exists(temp_file): os.unlink(temp_file) if __name__ __main__: test_integration()7. 发布与分发策略7.1 本地分发方式requirements.txt方式# 直接指向源码 githttps://github.com/yourusername/my-data-processor.gitv0.1.0 # 或者本地路径 ./path/to/my-data-processorsetup.py开发模式安装# 可编辑模式安装便于开发 pip install -e . # 安装开发依赖 pip install -e .[dev]7.2 PyPI发布准备测试发布验证# 测试包质量 twine check dist/* # 测试PyPI发布 twine upload --repository-url https://test.pypi.org/legacy/ dist/*正式发布命令# 构建新版本 python -m build # 上传到PyPI twine upload dist/*7.3 版本管理策略版本号规范0.1.0- 初始版本0.1.1- bug修复0.2.0- 新功能向后兼容1.0.0- 稳定生产版本使用setuptools_scm自动版本管理# setup.py中配置 setup( use_scm_versionTrue, setup_requires[setuptools_scm], )8. 高级封装技巧8.1 支持多种安装方式添加extras_require# setup.py中配置额外依赖 setup( # ... 其他配置 extras_require{ pandas: [pandas1.0], cli: [click7.0], all: [pandas1.0, click7.0], }, )用户可以选择性安装pip install my-data-processor[pandas,cli] pip install my-data-processor[all]8.2 包含数据文件配置package_datasetup( # ... 其他配置 package_data{ my_data_processor: [data/*.json, templates/*.j2], }, include_package_dataTrue, )8.3 多平台支持添加平台特定依赖setup( # ... 其他配置 extras_require{ :sys_platform win32: [pywin32200], :sys_platform linux: [dbus-python1.2], }, )9. 常见问题与排查方法9.1 构建阶段问题问题现象可能原因解决方案ModuleNotFoundErrorduring build包结构不正确或__init__.py缺失检查src目录结构确保每个包都有__init__.py无法找到入口点脚本entry_points配置错误检查console_scripts格式module:function版本号解析失败版本文件格式错误使用__version__或setuptools_scm9.2 安装阶段问题问题现象可能原因解决方案依赖冲突版本约束太严格使用宽松版本约束如package1.0,2.0权限错误系统目录安装无权限使用虚拟环境或--user参数平台不兼容包含C扩展或系统特定代码添加平台检测和fallback逻辑9.3 运行时问题问题现象可能原因解决方案导入错误包名冲突或路径问题使用绝对导入避免相对导入功能异常依赖版本不匹配添加版本检查逻辑性能问题资源未正确释放使用contextmanager确保资源清理9.4 调试技巧使用开发模式安装# 可编辑模式修改代码立即生效 pip install -e . # 查看安装信息 pip show my-data-processor验证导入路径import my_data_processor print(my_data_processor.__file__) print(my_data_processor.__version__)10. 最佳实践总结10.1 代码组织原则保持模块单一职责每个模块只负责一个明确的功能领域如文件IO、数据处理、命令行接口分离。使用清晰的导入结构在__init__.py中明确导出公共API隐藏内部实现细节。文档字符串规范化为每个函数、类、模块添加完整的docstring支持自动文档生成。10.2 配置管理建议优先使用pyproject.toml这是现代Python打包的标准比setup.py更简洁和强大。版本管理自动化使用setuptools_scm或类似工具自动从git tag生成版本号。依赖管理精细化区分必需依赖和可选依赖为不同使用场景提供灵活的安装选项。10.3 测试与质量保证测试覆盖关键路径确保核心功能的单元测试特别是公共API接口。持续集成自动化配置GitHub Actions或类似CI工具自动运行测试和代码质量检查。类型注解增强为公共函数添加类型提示提高代码可读性和工具支持。10.4 发布维护策略语义化版本控制遵循语义化版本规范让用户清楚版本变更的影响范围。变更日志维护保持详细的CHANGELOG.md记录每个版本的变更内容。多Python版本支持在CI中测试多个Python版本兼容性确保广泛适用性。通过以上完整的封装流程你的Python脚本将转变为专业的、可复用的库项目。这种转换不仅提升了代码的质量和可维护性也为团队协作和开源贡献奠定了坚实基础。

相关新闻

13种贝斯线编曲实战技巧:从律动构建到混音处理全解析

13种贝斯线编曲实战技巧:从律动构建到混音处理全解析

在实际音乐制作和编曲过程中,贝斯线(Bassline)是连接节奏与和声的骨架,它决定了音乐的律动感和情感基调。很多制作人,尤其是刚接触编曲的朋友,常常会遇到低音部分听起来单调、缺乏变化、无法与旋律和鼓点有…

2026/8/1 3:59:16 阅读更多 →
VC++ 2013运行库深度解析:从DLL依赖到开源部署实践

VC++ 2013运行库深度解析:从DLL依赖到开源部署实践

1. 项目概述:为什么我们需要关注一个“老掉牙”的运行库?如果你在Windows上折腾过稍微有点年头的软件或者游戏,大概率见过这个弹窗:“无法启动此程序,因为计算机中丢失 VCRUNTIME140.dll”或者“MSVCP120.dll 未找到”…

2026/8/1 3:59:16 阅读更多 →
Python可视化五大激活函数及其导数:从Sigmoid到Softmax的深度解析

Python可视化五大激活函数及其导数:从Sigmoid到Softmax的深度解析

1. 从“画”开始:为什么我们要亲手绘制激活函数?如果你刚开始接触深度学习或者神经网络,可能会在无数的教程和论文里看到Sigmoid、ReLU这些名字。它们通常被称作“激活函数”,是神经网络里决定神经元是否“兴奋”的关键组件。很多…

2026/8/1 3:59:16 阅读更多 →

最新新闻

可灵动态构图失控?揭秘镜头抖动、焦点漂移与延迟卡顿的3大底层硬件协同漏洞(2024固件级修复手册)

可灵动态构图失控?揭秘镜头抖动、焦点漂移与延迟卡顿的3大底层硬件协同漏洞(2024固件级修复手册)

更多请点击: https://codechina.net 第一章:可灵动态构图失控现象的系统性归因 可灵(Kling)动态构图在高复杂度提示驱动下常出现主体偏移、比例失衡与运动轨迹断裂等失控现象,其根源并非单一模块缺陷,而是…

2026/8/1 4:29:29 阅读更多 →
Navicat试用期重置终极指南:3种简单方法让你无限使用数据库神器

Navicat试用期重置终极指南:3种简单方法让你无限使用数据库神器

Navicat试用期重置终极指南:3种简单方法让你无限使用数据库神器 【免费下载链接】navicat_reset_mac navicat mac版无限重置试用期脚本 Navicat Mac Version Unlimited Trial Reset Script 项目地址: https://gitcode.com/gh_mirrors/na/navicat_reset_mac 还…

2026/8/1 4:29:29 阅读更多 →
Codex额度节省实战:从计费原理到API优化技巧

Codex额度节省实战:从计费原理到API优化技巧

这次我们来看一个关于 Codex 额度节省的实际技巧。很多人在使用 Codex 时,由于不了解其计费机制和优化方法,导致额度消耗过快,实际使用成本远高于预期。本文将深入分析 Codex 的计费逻辑,并提供一套经过验证的额度节省方案。Codex…

2026/8/1 4:29:29 阅读更多 →
既然说 AI 像人,为什么不用人类几万年的组织智慧管它?

既然说 AI 像人,为什么不用人类几万年的组织智慧管它?

〇、一个行业级的矛盾 业界很乐意把 AI agent 说成"数字同事"“虚拟团队”“AI 员工”。多智能体系统几乎都被包装成一个组织:有角色、有分工、有协作。我们一直在把 AI 拟人化——这一点没人反对。 可一旦这些"团队"真的跑起来出事了——上下…

2026/8/1 4:29:29 阅读更多 →
硬盘SMART参数全解析:从HD Tune警告到数据抢救实战指南

硬盘SMART参数全解析:从HD Tune警告到数据抢救实战指南

1. 从一次硬盘“变红”的惊魂说起那天下午,我正在处理一个视频剪辑项目,渲染进度条卡在99%纹丝不动。电脑风扇狂转,硬盘灯却像死了一样,偶尔才闪烁一下。我预感不妙,随手打开了HD Tune,想看看硬盘的实时温度…

2026/8/1 4:29:29 阅读更多 →
新发传染病分子开关研究:从比较基因组学到宿主互作网络的全流程解析

新发传染病分子开关研究:从比较基因组学到宿主互作网络的全流程解析

1. 项目概述:解码新发传染病的分子“开关” 在传染病研究领域,每一次新发或突发疫情的到来,都像是一场没有预告的“闪电战”。从SARS、MERS到近年来的COVID-19,再到不断出现的禽流感变异株、未知病原体,我们总是在追赶…

2026/8/1 4:28:29 阅读更多 →

日新闻

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

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

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

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

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

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

2026/8/1 0:00:48 阅读更多 →
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/1 0:00:48 阅读更多 →

周新闻

深度学习道路桥梁裂缝检测系统 道路桥梁裂缝检测数据集 道路桥梁病害识别检测数据集

深度学习道路桥梁裂缝检测系统 道路桥梁裂缝检测数据集 道路桥梁病害识别检测数据集

深度学习道路桥梁裂缝检测系统 数据集6000张 完整源码已标注数据集训练好的模型环境配置教程程序运行说明文档,可以直接使用!系统支持图片、视频、摄像头等多种方式检测裂缝,功能强大实用。 1数据集6000张 8各类别

2026/7/31 1:03:03 阅读更多 →
深度学习YOLO模型如何训练 PUBG 绝地求生目标检测数据集

深度学习YOLO模型如何训练 PUBG 绝地求生目标检测数据集

pubg数据集 精选原图1.42万数据 1.49万标签 无任何重复、算法增强或冗余图像! pubg绝地求生目标检测数据集 1分类:e_body,14905个标签,txt格式 共计14244张图,99%为640*640尺寸图像 适合yolo目标检测、AI训练关键词&am…

2026/7/29 14:34:28 阅读更多 →
Apex英雄目标检测数据集 深度学习框架YOLO如何训练APEX数据集

Apex英雄目标检测数据集 深度学习框架YOLO如何训练APEX数据集

Apex检测数据集数据集详情检测类别: allies enemy tag图片总量:7247张训练集:5139张验证集:1425张测试集:683张标注状态:全部已标注,即拿即用数据格式:支持YOLO格式及其他格式&#…

2026/7/31 4:19:39 阅读更多 →

月新闻

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

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

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

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

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

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

2026/8/1 0:00:48 阅读更多 →
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/1 0:00:48 阅读更多 →