Python自动化部署:从本地构建到云存储的完整流水线实践
在实际项目开发中我们经常需要将本地开发完成的应用或资源部署到云端以便于团队协作、版本管理或对外发布。这个过程通常涉及代码仓库的推送、构建流程的触发以及最终产物的分发。一个典型的场景是开发者完成一个功能模块后需要将其“上传”到远程服务器或网盘供测试或部署使用。本文将围绕一个模拟的“天鹅咕嘎奇遇记”项目详细讲解从本地代码到云端网盘以常见对象存储服务为例的完整自动化上传流程。我们将使用 Python 作为脚本语言结合 Git 进行版本控制并最终通过 API 将构建产物同步到类似阿里云 OSS 或腾讯云 COS 的云存储服务中。通过本文你将掌握如何搭建一个轻量级、可复用的自动化上传流水线理解其中每一步的原理和常见问题。1. 理解自动化上传的核心链路与组件自动化上传并非简单执行一个cp或scp命令。一个健壮的流程需要考虑版本标识、依赖管理、构建打包、安全认证、传输验证和错误处理等多个环节。1.1 为什么需要自动化上传流程手动上传文件容易出错例如传错版本、遗漏文件、覆盖错误等。在团队协作中手动操作更是不可靠且无法追溯。自动化上传流程的核心价值在于一致性确保每次上传的产物都是基于特定代码版本如 Git Tag构建的。可重复性通过脚本固化流程任何人、在任何时候执行都能得到相同结果。可追溯性上传记录包括代码版本、构建时间、文件哈希可以与 CI/CD 系统或日志关联。效率将开发者从重复的手动操作中解放出来。1.2 典型自动化上传流程分解对于一个名为“天鹅咕嘎奇遇记”的前端或后端项目其上传到网盘的流程可以抽象为以下步骤环境检查确认本地已安装必要的工具如 Git, Python, SDK。代码状态确认确保工作区干净或基于特定分支/Tag 操作。依赖安装与构建执行npm install npm run build或pip install -r requirements.txt等命令生成待上传的产物如dist/,package.tar.gz。产物准备与校验计算产物的哈希值如 MD5、SHA256用于上传后校验文件完整性。云存储服务认证使用 Access Key、Secret Key 或临时令牌等方式安全地认证。文件上传调用云存储服务的 SDK 或 API将产物上传至指定的存储空间Bucket和路径。上传结果验证检查 API 返回状态并可再次校验云端文件的哈希值。清理与通知清理临时文件并可选地将上传结果如文件访问 URL通知到团队如通过钉钉、企业微信。我们将以 Python 脚本为核心串联起这些步骤。2. 环境准备与依赖配置在开始编写脚本之前需要准备好本地和云端环境。2.1 本地开发环境清单确保你的开发机器上已安装以下软件并确认版本兼容性。组件推荐版本检查命令用途说明Python3.8python --version运行自动化脚本的主语言。Git2.20git --version用于获取项目代码和版本信息。Node.js (可选)14node --version如果项目是前端需要用它构建。pip最新版pip --version安装 Python 依赖包。2.2 云存储服务准备本文以阿里云 OSS 为例其他云服务商腾讯云 COS、七牛云 Kodo操作类似。开通服务登录阿里云控制台开通对象存储 OSS 服务。创建存储空间Bucket创建一个新的 Bucket记下其名称如swan-adventure和所属地域如oss-cn-hangzhou。创建访问密钥AccessKey在控制台“AccessKey管理”页面创建一对 AccessKey ID 和 AccessKey Secret。务必妥善保管 Secret不要提交到代码仓库。配置权限为了安全建议为这个 AccessKey 创建子用户并授予最小权限策略例如只允许对特定 Bucket 进行上传操作。2.3 项目结构与初始化创建一个新的项目目录来存放我们的自动化脚本和示例项目。mkdir swan-upload-automation cd swan-upload-automation # 创建示例的“天鹅咕嘎奇遇记”项目结构 mkdir -p swan-project/src swan-project/dist # 创建自动化脚本目录 mkdir scripts # 创建依赖管理文件 touch requirements.txt # 创建配置文件模板切勿提交真实密钥 touch config.example.json初始化一个 Git 仓库如果还没有cd swan-project git init echo # 天鹅咕嘎奇遇记项目 README.md git add . git commit -m Initial commit cd ..2.4 安装 Python 依赖我们将使用oss2库来操作阿里云 OSS。编辑requirements.txt文件oss22.18.0 requests2.28.0 # 可选用于发送通知 python-dotenv0.21.0 # 用于管理环境变量安装依赖pip install -r requirements.txt3. 构建自动化上传脚本我们将编写一个主脚本upload_to_oss.py它封装了从构建到上传的全流程。3.1 配置文件与环境变量管理首先处理敏感的配置信息。我们使用config.example.json作为模板真实配置通过环境变量或本地配置文件.env注入。config.example.json{ oss: { access_key_id: YOUR_ACCESS_KEY_ID, access_key_secret: YOUR_ACCESS_KEY_SECRET, endpoint: https://oss-cn-hangzhou.aliyuncs.com, bucket_name: swan-adventure }, project: { build_command: npm run build, source_dir: ./swan-project, build_output_dir: ./swan-project/dist, upload_target_prefix: releases/v1.0.0/ } }创建一个.env文件添加到.gitignore来存储真实密钥# .env OSS_ACCESS_KEY_ID你的AccessKeyId OSS_ACCESS_KEY_SECRET你的AccessKeySecret脚本中通过python-dotenv加载# upload_to_oss.py import os import json import hashlib import subprocess import sys from pathlib import Path from dotenv import load_dotenv import oss2 # 加载环境变量 load_dotenv() class Config: def __init__(self, config_pathconfig.json): with open(config_path, r) as f: raw_config json.load(f) self.oss_config raw_config[oss] # 优先使用环境变量中的密钥 self.oss_config[access_key_id] os.getenv(OSS_ACCESS_KEY_ID, self.oss_config[access_key_id]) self.oss_config[access_key_secret] os.getenv(OSS_ACCESS_KEY_SECRET, self.oss_config[access_key_secret]) self.project_config raw_config[project] self.validate() def validate(self): required_keys [access_key_id, access_key_secret, endpoint, bucket_name] for key in required_keys: if not self.oss_config.get(key): raise ValueError(fOSS配置中缺失必需的键: {key}) if not Path(self.project_config[source_dir]).exists(): raise FileNotFoundError(f项目源目录不存在: {self.project_config[source_dir]})3.2 核心上传类实现接下来实现一个Uploader类它负责具体的构建和上传逻辑。# upload_to_oss.py (续) class Uploader: def __init__(self, config: Config): self.config config auth oss2.Auth(config.oss_config[access_key_id], config.oss_config[access_key_secret]) self.bucket oss2.Bucket(auth, config.oss_config[endpoint], config.oss_config[bucket_name]) self.uploaded_files [] def run_build(self): 执行项目构建命令 build_cmd self.config.project_config[build_command] source_dir self.config.project_config[source_dir] if not build_cmd or build_cmd skip: print(跳过构建步骤。) return True print(f正在执行构建命令: {build_cmd}) try: # 在项目目录下执行构建命令 result subprocess.run( build_cmd, shellTrue, cwdsource_dir, capture_outputTrue, textTrue, checkTrue ) print(f构建成功标准输出:\n{result.stdout}) if result.stderr: print(f构建警告/错误信息:\n{result.stderr}) return True except subprocess.CalledProcessError as e: print(f构建失败退出码: {e.returncode}) print(f错误输出:\n{e.stderr}) return False def calculate_file_md5(self, filepath): 计算文件的MD5值用于校验 hash_md5 hashlib.md5() with open(filepath, rb) as f: for chunk in iter(lambda: f.read(4096), b): hash_md5.update(chunk) return hash_md5.hexdigest() def upload_directory(self, local_dir, oss_prefix): 上传整个目录到OSS local_path Path(local_dir) if not local_path.is_dir(): raise NotADirectoryError(f{local_dir} 不是一个有效的目录。) for file_path in local_path.rglob(*): if file_path.is_file(): relative_path file_path.relative_to(local_path) oss_key f{oss_prefix.rstrip(/)}/{relative_path.as_posix()} self.upload_file(str(file_path), oss_key) def upload_file(self, local_path, oss_key): 上传单个文件到OSS并验证 print(f正在上传: {local_path} - {oss_key}) file_md5 self.calculate_file_md5(local_path) # 设置请求头让OSS服务端验证MD5 headers {Content-MD5: oss2.utils.content_md5(local_path)} try: result self.bucket.put_object_from_file( oss_key, local_path, headersheaders ) if result.status 200: print(f 上传成功。ETag: {result.etag}) # 简单验证OSS返回的ETag通常是文件的MD5括号内 if result.etag.strip(\) file_md5: print(f MD5校验通过。) else: print(f 警告本地MD5({file_md5})与OSS ETag({result.etag})不一致请手动检查。) self.uploaded_files.append({key: oss_key, local_path: local_path, etag: result.etag}) else: print(f 上传失败HTTP状态码: {result.status}) except oss2.exceptions.OssError as e: print(f 上传过程中发生OSS错误: {e}) def run(self): 执行完整上传流程 print(*50) print(开始执行天鹅咕嘎奇遇记项目上传流程) print(*50) # 1. 构建 if not self.run_build(): print(构建步骤失败流程终止。) sys.exit(1) # 2. 上传 build_output_dir self.config.project_config[build_output_dir] oss_target_prefix self.config.project_config[upload_target_prefix] if not Path(build_output_dir).exists(): print(f构建输出目录不存在: {build_output_dir}请检查构建命令。) sys.exit(1) print(f开始上传目录: {build_output_dir}) self.upload_directory(build_output_dir, oss_target_prefix) # 3. 汇总报告 print(\n *50) print(上传流程完成) print(f总计上传 {len(self.uploaded_files)} 个文件。) for file_info in self.uploaded_files: print(f - {file_info[key]}) print(*50)3.3 主程序入口最后添加脚本的主入口并处理一些命令行参数。# upload_to_oss.py (续) def main(): import argparse parser argparse.ArgumentParser(description将天鹅咕嘎奇遇记项目构建并上传至OSS。) parser.add_argument(--config, defaultconfig.json, help配置文件路径 (默认: config.json)) parser.add_argument(--skip-build, actionstore_true, help跳过构建步骤直接上传) args parser.parse_args() try: config Config(args.config) except Exception as e: print(f加载配置失败: {e}) sys.exit(1) uploader Uploader(config) if args.skip_build: uploader.config.project_config[build_command] skip uploader.run() if __name__ __main__: main()4. 运行验证与结果分析现在我们有了一个完整的脚本。接下来进行端到端的验证。4.1 准备模拟项目与配置首先在swan-project目录下创建一个简单的package.json和构建脚本模拟一个前端项目。swan-project/package.json{ name: swan-adventure, version: 1.0.0, scripts: { build: mkdir -p dist echo htmlbodyh1Hello, Swan Adventure!/h1/body/html dist/index.html echo console.log(\swan.js loaded\) dist/swan.js echo 构建完成于 $(date) dist/build-info.txt } }然后创建真实的配置文件config.json确保已添加到.gitignore{ oss: { access_key_id: , access_key_secret: , endpoint: https://oss-cn-hangzhou.aliyuncs.com, bucket_name: swan-adventure }, project: { build_command: npm run build, source_dir: ./swan-project, build_output_dir: ./swan-project/dist, upload_target_prefix: releases/v1.0.0/ } }将你的 OSS AccessKey 信息填入.env文件。4.2 执行上传脚本在项目根目录swan-upload-automation下运行脚本python scripts/upload_to_oss.py --config config.json你应该能看到类似以下的输出 开始执行天鹅咕嘎奇遇记项目上传流程 正在执行构建命令: npm run build 构建成功标准输出: 构建完成于 Mon Apr 1 10:00:00 CST 2024 开始上传目录: ./swan-project/dist 正在上传: ./swan-project/dist/index.html - releases/v1.0.0/index.html 上传成功。ETag: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx MD5校验通过。 正在上传: ./swan-project/dist/swan.js - releases/v1.0.0/swan.js 上传成功。ETag: yyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyy MD5校验通过。 正在上传: ./swan-project/dist/build-info.txt - releases/v1.0.0/build-info.txt 上传成功。ETag: zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz MD5校验通过。 上传流程完成 总计上传 3 个文件。 - releases/v1.0.0/index.html - releases/v1.0.0/swan.js - releases/v1.0.0/build-info.txt 4.3 结果验证登录阿里云 OSS 控制台进入swan-adventure这个 Bucket。在文件列表中你应该能看到releases/v1.0.0/目录其下包含上传的三个文件。可以点击文件后面的“详情”查看其 MD5 值与脚本输出中的 ETag去掉引号进行比对确认一致性。尝试通过 OSS 提供的文件访问 URL通常格式为https://{bucket}.{endpoint}/{key}在浏览器中访问index.html确认可以正常打开。5. 常见问题排查与优化在实际运行中你可能会遇到各种问题。下面列出常见问题及其解决方案。5.1 认证失败问题现象可能原因检查方式处理建议oss2.exceptions.ServerError: The Access Key Id you provided does not exist.1. AccessKey ID 错误。2. AccessKey 被禁用。1. 检查.env文件或config.json中的access_key_id是否填写正确前后有无空格。2. 登录阿里云控制台检查 AccessKey 状态。1. 重新填写正确的 AccessKey ID。2. 如被禁用启用或创建新的 AccessKey。oss2.exceptions.ServerError: The signature you calculated is not matched.1. AccessKey Secret 错误。2. 请求时间与服务器时间不同步。1. 检查.env文件中的access_key_secret。2. 检查本地系统时间。1. 重新填写正确的 AccessKey Secret。2. 同步本地系统时间。5.2 网络与权限问题问题现象可能原因检查方式处理建议oss2.exceptions.RequestError: [Errno 8] nodename nor servname provided, or not known1.endpoint配置错误。2. 网络不通。1. 检查config.json中的endpoint格式应为https://oss-cn-区域.aliyuncs.com。2. 使用ping或curl测试 endpoint 域名。1. 修正 endpoint 配置。2. 检查本地网络和代理设置。oss2.exceptions.AccessDenied: You are not authorized to perform this operation.1. Bucket 名称错误。2. AccessKey 权限不足。1. 检查bucket_name拼写。2. 在 OSS 控制台检查该 AccessKey 对应的 RAM 用户权限。1. 修正 bucket 名称。2. 为 RAM 用户添加对应 Bucket 的PutObject等操作权限。5.3 构建与文件问题问题现象可能原因检查方式处理建议构建失败退出码: 127构建命令不存在或环境变量问题。1. 手动在项目目录执行npm run build看是否成功。2. 检查package.json中scripts的定义。1. 确保 Node.js 和 npm 已正确安装并加入 PATH。2. 修正build_command配置。FileNotFoundError: [Errno 2] No such file or directory源目录或构建输出目录路径错误。1. 检查config.json中的source_dir和build_output_dir路径。2. 确认脚本是从正确的当前目录执行的。1. 使用绝对路径或相对于脚本执行位置的正确相对路径。2. 在脚本中打印当前工作目录和解析后的路径进行调试。上传成功但文件大小为0或内容不对1. 构建过程未正确生成文件。2. 上传了错误的目录。1. 检查build_output_dir目录下的文件内容和大小。2. 检查upload_directory函数遍历的文件列表。1. 确保构建命令能正确产出目标文件。2. 在上传前可以增加一个打印待上传文件列表的步骤。5.4 脚本优化与增强基础脚本跑通后可以考虑以下增强点使其更健壮、更实用版本号自动化从package.json或git tag中自动读取版本号用于构造 OSS 路径如releases/v{version}/避免手动修改配置。增量上传与哈希比对在上传前先获取 OSS 上已有文件的 ETag与本地文件哈希比对仅上传有变化的文件节省时间和流量。更完善的错误处理与重试网络波动可能导致上传失败。可以为put_object_from_file添加重试机制如使用retry库。上传后清理可以选择性地清理旧的云端版本只保留最近 N 个版本。集成到 CI/CD将脚本嵌入到 GitHub Actions、GitLab CI 或 Jenkins 的 Pipeline 中实现提交代码后自动构建上传。6. 生产环境最佳实践将自动化上传脚本用于生产环境时安全性、可靠性和可维护性需要额外关注。6.1 安全实践永远不要提交密钥确保.env、config.json含真实密钥的等文件在.gitignore中。在 CI/CD 环境中使用 Secrets 或环境变量注入密钥。使用临时访问令牌STS对于服务器或 CI 环境不要使用主账号的长期 AccessKey。应通过 RAM 角色申请临时安全令牌STS Token其有效期更短权限更可控。最小权限原则为上传脚本使用的 RAM 用户或角色只授予其执行上传操作所必需的最小权限例如对特定 Bucket 的PutObject权限而非*。6.2 可靠性实践添加详尽的日志将脚本的运行日志时间、步骤、成功/失败、文件列表、哈希值输出到文件并集成到日志平台便于故障排查和审计。实现原子性操作对于重要上传可以考虑先上传到一个临时目录全部成功后再通过 OSS 的拷贝或生命周期规则移动到最终目录避免用户看到不完整的版本。设置监控告警在 CI/CD 流程中如果上传步骤失败应能触发告警邮件、钉钉、Slack通知相关负责人。6.3 可维护性实践配置外部化将所有可配置项如 Bucket 名称、地域、构建命令、目标路径模板集中到配置文件或环境变量中使脚本更通用。编写单元测试为calculate_file_md5、路径处理等核心函数编写单元测试确保其逻辑正确。提供清晰的 Usage在脚本中使用argparse提供丰富的命令行参数和帮助信息方便其他开发者使用。通过以上步骤我们不仅完成了一个简单的“上传到网盘”任务更构建了一个具备工程化思维的自动化部署环节。这个流程的核心思想——状态检查、构建、验证、安全传输、结果反馈——可以平移到任何需要将本地产物发布到远程存储的场景。

相关新闻

从APMCM赛题解析疾病预测:数据科学实战与建模竞赛指南

从APMCM赛题解析疾病预测:数据科学实战与建模竞赛指南

1. 项目概述:从一道赛题看疾病预测的实战脉络刚拿到2025年APMCM这道B题的时候,我第一反应是,这题目出得挺“实诚”。它没有拐弯抹角,直接把“疾病的预测与大数据分析”这个核心目标摆在了台面上。对于参加过数学建模竞赛&#xff…

2026/8/14 4:46:29 阅读更多 →
世界模型:AI从模式识别到物理世界理解的范式跃迁

世界模型:AI从模式识别到物理世界理解的范式跃迁

1. 项目概述:从“世界模型”到具身智能的范式跃迁最近,李飞飞团队发布了一项关于“世界模型”的新研究成果,这消息在AI圈里激起了不小的水花。如果你对AI的印象还停留在生成图片、写写文章,那这个概念可能会刷新你的认知。简单来说…

2026/8/14 4:46:28 阅读更多 →
天津整车包车物流价格全解析

天津整车包车物流价格全解析

不少天津的发货人第一次问整车包车物流,开口就是“多少钱”。报低了怕服务打折扣,报高了又担心被多收,这种纠结很真实。整车包车运费不是一个固定数字,它像打车,距离远近、车型大小、货物特殊性,甚至装卸难…

2026/8/14 4:45:28 阅读更多 →

最新新闻

纹波防夹:车窗电机是怎么知道自己转了多少?

纹波防夹:车窗电机是怎么知道自己转了多少?

很多人第一次接触汽车车窗、天窗防夹控制时,都会有一个很自然的问题: 电机里面没有霍尔传感器,控制器怎么知道玻璃现在移动到哪里?又怎么判断玻璃是不是被夹住了? 一种非常有意思的答案是:不一定需要位置传感器,可以直接“听”电机的电流波形。 有刷直流电机在旋转过…

2026/8/14 7:48:32 阅读更多 →
TMC2209步进电机驱动实战:从静音配置到堵转检测

TMC2209步进电机驱动实战:从静音配置到堵转检测

1. 先搞清楚 TMC2209 到底解决了什么问题如果你正在用 A4988、DRV8825 这类传统步进电机驱动器,并且对电机运行时的啸叫、发热和丢步问题感到头疼,那 TMC2209 就是你接下来最该关注的芯片。它不是一个简单的“驱动能力更强”的升级品,而是一个…

2026/8/14 7:48:32 阅读更多 →
为什么PCB地与金属机壳之间,经常要并联阻容?

为什么PCB地与金属机壳之间,经常要并联阻容?

从ESD、EMI到共模电流,一次搞懂阻容连接的真正作用 在带金属外壳的电子产品中,经常能看到这样一个看似简单、却很容易被误解的电路: PCB的GND与金属机壳PGND之间,并联一个1MΩ电阻和一个1nF、2kV左右的高压电容。 很多工程师看到这里,第一反应可能是: “GND为什么不直…

2026/8/14 7:48:32 阅读更多 →
语义理解让电商平台的商品标准数据实现精准匹配与推荐

语义理解让电商平台的商品标准数据实现精准匹配与推荐

随着电商行业从流量红利时代迈入精细化运营时代,“人货精准匹配”已成为平台、商家突破增长瓶颈、提升用户体验的核心抓手。当前电商生态中,商品数据呈现海量化、碎片化、非标化特征,海量SKU存在参数混乱、描述不规范、语义歧义、品类错配等问…

2026/8/14 7:48:32 阅读更多 →
揭秘中企动力网站建设合同背后的那些坑与红利如何避坑省钱拿结果

揭秘中企动力网站建设合同背后的那些坑与红利如何避坑省钱拿结果

做老板的,尤其是那些在传统行业摸爬滚打多年、现在终于狠下心要把业务搬到线上去的实体企业主,心里头都清楚一件事:现在这个年代,没有官网,连个正经门脸都算不上。但真到了要签那个厚得像砖头一样的《中企动力网站建设合同》时,很多人心里其实是一虚的。为啥?因为咱们不…

2026/8/14 7:48:32 阅读更多 →
dsniff网络嗅探工具:安装使用与安全实践指南

dsniff网络嗅探工具:安装使用与安全实践指南

1. 网络流量分析工具dsniff深度解析在网络安全和系统管理领域,流量分析工具一直扮演着重要角色。dsniff作为一款经典的网络嗅探工具集,自1999年由Dug Song发布以来,就以其高效的流量捕获和分析能力在安全圈内广为人知。这套工具集包含dsniff、…

2026/8/14 7:47:32 阅读更多 →

日新闻

临沂网站建设铭镇:深耕本土数字生态,以匠心铸就企业品牌核心竞争力

临沂网站建设铭镇:深耕本土数字生态,以匠心铸就企业品牌核心竞争力

在这个流量为王、视觉至上的互联网时代,对于临沂乃至整个山东乃至全国的传统中小企业来说,拥有一张精美的“数字名片”早已不再是可选项,而是生存的必答题。每当夜幕降临,沂河两岸灯火辉煌,物流之都的喧嚣逐渐沉淀为对未来的思考。我们常常听到老板们在茶余饭后探讨:为什…

2026/8/14 0:00:26 阅读更多 →
Flutter与OpenHarmony实现剧本杀组队表单开发实战

Flutter与OpenHarmony实现剧本杀组队表单开发实战

1. 项目概述在移动应用开发领域,跨平台框架Flutter因其高效的开发体验和出色的性能表现,已经成为众多开发者的首选。而OpenHarmony作为新兴的操作系统平台,其开放性和灵活性为开发者提供了全新的可能性。本文将聚焦于一个实际应用场景——剧本…

2026/8/14 0:00:26 阅读更多 →
大连网站建设找简维科技:为您打造懂业务更懂用户的数字化转型引擎

大连网站建设找简维科技:为您打造懂业务更懂用户的数字化转型引擎

在这个数字化浪潮席卷全球的今天,企业想要在激烈的市场竞争中站稳脚跟,拥有一张好看的“数字名片”已经远远不够了。很多老板在刚开始接触互联网业务时,都有一个共同的困惑:为什么我花了钱建的网站,就像是在真空中自嗨?访客进来转了两圈就跑了,线索石沉大海,甚至连客服…

2026/8/14 0:01:27 阅读更多 →

周新闻

5分钟告别提取码焦虑:baidupankey如何智能破解百度网盘资源锁

5分钟告别提取码焦虑:baidupankey如何智能破解百度网盘资源锁

5分钟告别提取码焦虑:baidupankey如何智能破解百度网盘资源锁 【免费下载链接】baidupankey 在线查询网盘提取码(维护中 rm repo) 项目地址: https://gitcode.com/gh_mirrors/ba/baidupankey 你是否曾经在深夜寻找一份重要资料&#x…

2026/8/13 2:38:34 阅读更多 →
如何快速生成中国车牌图片:Python开源工具完整指南

如何快速生成中国车牌图片:Python开源工具完整指南

如何快速生成中国车牌图片:Python开源工具完整指南 【免费下载链接】chinese_license_plate_generator 中国车牌生成器 项目地址: https://gitcode.com/gh_mirrors/ch/chinese_license_plate_generator 中国车牌生成器是一个基于Python的开源项目&#xff0c…

2026/8/13 10:41:52 阅读更多 →
收藏!小白程序员轻松入门大模型,从Harness工程开始实践

收藏!小白程序员轻松入门大模型,从Harness工程开始实践

文章强调学习大模型不应只关注模型本身,而应重视模型外的系统搭建,即Harness。提出AgentModelHarness的实用公式,详细介绍Harness的四个层次:持久化层、执行层、控制层和观察与验证层。文章还探讨了上下文工程、工具设计、AGENTS.…

2026/8/13 10:41:51 阅读更多 →

月新闻

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

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

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

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

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

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

2026/8/13 10:41:49 阅读更多 →
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/13 10:41:49 阅读更多 →