[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"consumer-news-detail-902":3,"consumer-news-interaction-902":40,"consumer-news-related-902":43},{"detail":4,"item":35},{"card":5,"schemaVersion":22,"fields":23,"content":29},{"id":6,"kind":7,"targetType":8,"targetId":9,"subtype":7,"typeLabel":10,"title":11,"subtitle":12,"summary":13,"coverUrl":14,"badgeText":14,"href":15,"sourceName":12,"meta":16,"metrics":19,"tags":20,"resolved":21},"NEWS_ARTICLE:902","news","NEWS_ARTICLE",902,"资讯","DeepSeek Harness 插件","博客园","准备环境 dsh 从源码运行，见 dsh 说明。或见之前分享的 DeepSeek Harness 开始。 开发插件 依照 dsh 文档，动手做一遍： 第一个插件: https:\u002F\u002Fdeepseek-harness.github.io\u002Fdeepseek-harness\u002Fdevelop\u002Fbasic\u002F 第","","\u002Fnews\u002F902",[17,18],"2026","软件开发",{},[18],true,"consumer-content-detail-v1",{"sourceName":12,"authorName":24,"categoryName":18,"summary":13,"description":13,"publishTime":25,"updateTime":26,"sourceUrl":27,"language":28},"GoCodingInMyWay","2026-08-31T10:20","2026-09-02T20:37:54","https:\u002F\u002Fwww.cnblogs.com\u002Fgocodinginmyway\u002Fp\u002F22769816","中文",{"format":30,"policy":31,"normalized":21,"html":32,"text":33,"wordCount":34,"hasBody":21},"HTML","NEWS_CONTENT_V1","\u003Ch2>准备环境\u003C\u002Fh2>\n\u003Cp>dsh 从源码运行，见 \u003Ca href=\"https:\u002F\u002Fgithub.com\u002Fdeepseek-ai\u002Fdeepseek-harness\u002Fblob\u002Fmaster\u002FREADME.zh.md#run-from-source\" target=\"_blank\" rel=\"noopener noreferrer nofollow\">dsh 说明\u003C\u002Fa>。或见之前分享的 \u003Ca href=\"https:\u002F\u002Fwww.cnblogs.com\u002Fgocodinginmyway\u002Fp\u002F22502421\" target=\"_blank\" rel=\"noopener noreferrer nofollow\">DeepSeek Harness 开始\u003C\u002Fa>。\u003C\u002Fp>\n\u003Ch2>开发插件\u003C\u002Fh2>\n\u003Cp>依照 dsh 文档，动手做一遍：\u003C\u002Fp>\n\u003Cul>\n \u003Cli>第一个插件: \u003Ca href=\"https:\u002F\u002Fdeepseek-harness.github.io\u002Fdeepseek-harness\u002Fdevelop\u002Fbasic\u002F\" target=\"_blank\" rel=\"noopener noreferrer nofollow\">https:\u002F\u002Fdeepseek-harness.github.io\u002Fdeepseek-harness\u002Fdevelop\u002Fbasic\u002F\u003C\u002Fa>\u003C\u002Fli>\n \u003Cli>第一个工具: \u003Ca href=\"https:\u002F\u002Fdeepseek-harness.github.io\u002Fdeepseek-harness\u002Fdevelop\u002Fbasic\u002Ftool\" target=\"_blank\" rel=\"noopener noreferrer nofollow\">https:\u002F\u002Fdeepseek-harness.github.io\u002Fdeepseek-harness\u002Fdevelop\u002Fbasic\u002Ftool\u003C\u002Fa>\u003C\u002Fli>\n\u003C\u002Ful>\n\u003Cp>在 dsh 仓库根目录创建插件目录：\u003C\u002Fp>\n\u003Cpre>\u003Ccode>mkdir -p start-dsh-plugin\u002Fsrc\n\u003C\u002Fcode>\u003C\u002Fpre>\n\u003Cp>写 \u003Ccode>start-dsh-plugin\u002Fsrc\u002Findex.ts\u003C\u002Fcode>：\u003C\u002Fp>\n\u003Cpre>\u003Ccode>import type { Context } from '@deepseek-ai\u002Fcordis'\nimport { defineTool } from '@deepseek-ai\u002Fdsh-tools'\nimport Schema from '@deepseek-ai\u002Fschemastery'\n\n\u002F\u002F 插件名称\nexport const name = 'start-dsh-plugin'\n\u002F\u002F 注册就绪\n\u002F\u002F   inject 让 Cordis 等待工具注册表就绪\nexport const inject = ['tools']\n\n\u002F\u002F 插件配置\n\u002F\u002F   对应 cordis.yml 中 config\nexport interface Config {\n  greeting: string\n  maxRetries: number\n  verbose?: boolean\n}\n\n\u002F\u002F Schema 校验\n\u002F\u002F   在插件加载时执行校验。如果配置不合法，插件会加载失败并给出明确错误信息\nexport const Config: Schema&lt;Config&gt; = Schema.object({\n  greeting: Schema.string().default('Hello'),\n  maxRetries: Schema.number().default(3),\n  verbose: Schema.boolean().default(false),\n})\n\n\u002F\u002F 插件实现\n\u002F\u002F   插件是一个导出 apply 函数的 TypeScript 模块，通过 ctx 注册能力\nexport function apply(ctx: Context, config: Config) {\n  console.log(`[${name}] plugin loaded!`)\n\n  \u002F\u002F 注册一个 greet 工具\n  ctx.tools.register(defineTool({\n    name: 'greet',\n    description: 'Greet someone by name.',\n    parameters: {\n      name: { type: 'string', required: true, description: 'The name to greet' },\n    },\n    output: {\n      schema: { type: 'string' },\n      render: (_args, value) =&gt; [{ type: 'text', text: value }],\n    },\n    async execute(args) {\n      return `${config.greeting}, ${args.name}!`\n    },\n  }))\n}\n\u003C\u002Fcode>\u003C\u002Fpre>\n\u003Cp>写 \u003Ccode>start-dsh-plugin\u002Fcordis.yml\u003C\u002Fcode>：\u003C\u002Fp>\n\u003Cpre>\u003Ccode>- insert:\n    - id: start-dsh-plugin\n      name: '.\u002Fsrc\u002Findex.ts'\n      config:\n        greeting: 'Hi there'\n        maxRetries: 5\n\u003C\u002Fcode>\u003C\u002Fpre>\n\u003Cp>重新运行 dsh web：\u003C\u002Fp>\n\u003Cpre>\u003Ccode>pnpm dsh web --patch .\u002Fstart-dsh-plugin\u002Fcordis.yml\n\u003C\u002Fcode>\u003C\u002Fpre>\n\u003Cp>对话输入 \u003Ccode>Use the greet tool to greet Ada.\u003C\u002Fcode>，模型会调用 \u003Ccode>greet\u003C\u002Fcode> 工具，回复 \u003Ccode>Hi there, Ada! 👋\u003C\u002Fcode>。\u003C\u002Fp>\n\u003Ch2>打包插件\u003C\u002Fh2>\n\u003Cp>上述通过 \u003Ccode>--patch\u003C\u002Fcode> overlay 加载本地插件。\u003C\u002Fp>\n\u003Cp>这里再动手打包成组合包（bundle），用 \u003Ccode>dsh plugin add\u003C\u002Fcode> 来安装。\u003C\u002Fp>\n\u003Cp>写 \u003Ccode>start-dsh-plugin\u002Fpackage.json\u003C\u002Fcode>：\u003C\u002Fp>\n\u003Cpre>\u003Ccode>{\n  \"name\": \"start-dsh-plugin\",\n  \"version\": \"0.1.0\",\n  \"type\": \"module\",\n  \"main\": \"src\u002Findex.ts\",\n  \"files\": [\"src\u002Findex.ts\", \"cordis.patch.yml\"],\n  \"dsh\": { \"bundle\": { \"patch\": \".\u002Fcordis.patch.yml\" } }\n}\n\u003C\u002Fcode>\u003C\u002Fpre>\n\u003Cp>写 \u003Ccode>start-dsh-plugin\u002Fcordis.patch.yml\u003C\u002Fcode>：\u003C\u002Fp>\n\u003Cpre>\u003Ccode>- insert:\n    - id: start-dsh-plugin\n      name: start-dsh-plugin\n      config:\n        greeting: 'Hi'\n        maxRetries: 5\n\u003C\u002Fcode>\u003C\u002Fpre>\n\u003Cp>安装进 dsh web：\u003C\u002Fp>\n\u003Cpre>\u003Ccode># 从本地安装\npnpm dsh plugin --profile web add .\u002Fstart-dsh-plugin\n\n# 通过名称移除\npnpm dsh plugin --profile web remove start-dsh-plugin\n\u003C\u002Fcode>\u003C\u002Fpre>\n\u003Cp>dsh web 是预装的一个 profile，都位于 \u003Ccode>$DSH_HOME\u002Fprofiles\u002F&lt;name&gt;\u003C\u002Fcode>。\u003C\u002Fp>\n\u003Cp>之后，重新运行 dsh web（web 是 \u003Ccode>--profile web\u003C\u002Fcode> 的别名）：\u003C\u002Fp>\n\u003Cpre>\u003Ccode># 查看配置树\npnpm dsh web --dump-config | grep start-dsh-plugin\n\n# 重新运行\npnpm dsh web\n\u003C\u002Fcode>\u003C\u002Fpre>\n\u003Ch2>发布脚本\u003C\u002Fh2>\n\u003Cp>要发布，先得补齐再构建：\u003C\u002Fp>\n\u003Cul>\n \u003Cli>\u003Ca href=\"https:\u002F\u002Fgithub.com\u002Fikuokuo\u002Fstart-dsh-plugin\u002Fblob\u002Fmain\u002Fpackage.json\" target=\"_blank\" rel=\"noopener noreferrer nofollow\">package.json\u003C\u002Fa>\u003C\u002Fli>\n \u003Cli>\u003Ca href=\"https:\u002F\u002Fgithub.com\u002Fikuokuo\u002Fstart-dsh-plugin\u002Fblob\u002Fmain\u002Ftsconfig.json\" target=\"_blank\" rel=\"noopener noreferrer nofollow\">tsconfig.json\u003C\u002Fa>\u003C\u002Fli>\n \u003Cli>\u003Ca href=\"https:\u002F\u002Fgithub.com\u002Fikuokuo\u002Fstart-dsh-plugin\u002Fblob\u002Fmain\u002Ftsconfig.local.json\" target=\"_blank\" rel=\"noopener noreferrer nofollow\">tsconfig.local.json\u003C\u002Fa>\u003C\u002Fli>\n\u003C\u002Ful>\n\u003Cp>构建 lib\u002F：\u003C\u002Fp>\n\u003Cpre>\u003Ccode>cd start-dsh-plugin\u002F\n\n# 在 harness 仓库内构建\npnpm exec tsc -p tsconfig.local.json\n\n# 或，clone 项目安装依赖再构建\npnpm install &amp;&amp; pnpm run build\npnpm pack --dry-run\n\u003C\u002Fcode>\u003C\u002Fpre>\n\u003Cp>发布 tar：\u003C\u002Fp>\n\u003Cpre>\u003Ccode>rm -r lib\u002F\n\n# 打包\n#  若在 harness 仓库内打包，把 package.json 里改为 \"build\": \"tsc -p tsconfig.local.json\"\npnpm pack\n\n# 从 tar 包安装\npnpm dsh plugin --profile web add .\u002Fstart-dsh-plugin-0.1.0.tgz\n\u003C\u002Fcode>\u003C\u002Fpre>\n\u003Cp>发布 npm：\u003C\u002Fp>\n\u003Cpre>\u003Ccode>pnpm login\npnpm publish --access public\n\n# 从 npm 安装\npnpm dsh plugin --profile web add start-dsh-plugin\n\u003C\u002Fcode>\u003C\u002Fpre>\n\u003Cp>发布 github：\u003C\u002Fp>\n\u003Cpre>\u003Ccode># 从 github 安装\n#  官方文档要让允许从源码构建，但看其他插件就直接 package.json 指向源码、或把 lib\u002F 上传\npnpm dsh plugin --profile web add github:ikuokuo\u002Fstart-dsh-plugin\n\u003C\u002Fcode>\u003C\u002Fpre>\n\u003Ch2>一些问题\u003C\u002Fh2>\n\u003Cp>该 dsh 工具插件在其最新源码上不能正常启动，报错导入不了 'CallId'。\u003C\u002Fp>\n\u003Cp>因其 dsh-tools 版本到了 0.1.2-alpha.1，而 package.json 里用的最新发布只到 \"^0.1.1-rc.2\"。\u003C\u002Fp>\n\u003Cp>需在 harness 仓库内构建或打包，再安装。\u003C\u002Fp>\n\u003Ch2>哪找插件\u003C\u002Fh2>\n\u003Cul>\n \u003Cli>\u003Ca href=\"https:\u002F\u002Fdshmarket.com\u002F\" target=\"_blank\" rel=\"noopener noreferrer nofollow\">DSH Market\u003C\u002Fa>\u003C\u002Fli>\n \u003Cli>\u003Ca href=\"https:\u002F\u002Fawesome-dsh-plugin.com\u002F\" target=\"_blank\" rel=\"noopener noreferrer nofollow\">Awesome DSH Plugin\u003C\u002Fa>\u003C\u002Fli>\n \u003Cli>\u003Ca href=\"https:\u002F\u002Fgithub.com\u002F0xsline\u002Fawesome-deepseek-harness\" target=\"_blank\" rel=\"noopener noreferrer nofollow\">Awesome DeepSeek Harness\u003C\u002Fa>\u003C\u002Fli>\n\u003C\u002Ful>","准备环境 dsh 从源码运行，见 dsh 说明。或见之前分享的 DeepSeek Harness 开始。 开发插件 依照 dsh 文档，动手做一遍： 第一个插件: https:\u002F\u002Fdeepseek-harness.github.io\u002Fdeepseek-harness\u002Fdevelop\u002Fbasic\u002F 第一个工具: https:\u002F\u002Fdeepseek-harness.github.io\u002Fdeepseek-harness\u002Fdevelop\u002Fbasic\u002Ftool 在 dsh 仓库根目录创建插件目录： mkdir -p start-dsh-plugin\u002Fsrc 写 start-dsh-plugin\u002Fsrc\u002Findex.ts： import type { Context } from '@deepseek-ai\u002Fcordis' import { defineTool } from '@deepseek-ai\u002Fdsh-tools' import Schema from '@deepseek-ai\u002Fschemastery' \u002F\u002F 插件名称 export const name = 'start-dsh-plugin' \u002F\u002F 注册就绪 \u002F\u002F inject 让 Cordis 等待工具注册表就绪 export const inject = ['tools'] \u002F\u002F 插件配置 \u002F\u002F 对应 cordis.yml 中 config export interface Config { greeting: string maxRetries: number verbose?: boolean } \u002F\u002F Schema 校验 \u002F\u002F 在插件加载时执行校验。如果配置不合法，插件会加载失败并给出明确错误信息 export const Config: Schema\u003CConfig> = Schema.object({ greeting: Schema.string().default('Hello'), maxRetries: Schema.number().default(3), verbose: Schema.boolean().default(false), }) \u002F\u002F 插件实现 \u002F\u002F 插件是一个导出 apply 函数的 TypeScript 模块，通过 ctx 注册能力 export function apply(ctx: Context, config: Config) { console.log(`[${name}] plugin loaded!`) \u002F\u002F 注册一个 greet 工具 ctx.tools.register(defineTool({ name: 'greet', description: 'Greet someone by name.', parameters: { name: { type: 'string', required: true, description: 'The name to greet' }, }, output: { schema: { type: 'string' }, render: (_args, value) => [{ type: 'text', text: value }], }, async execute(args) { return `${config.greeting}, ${args.name}!` }, })) } 写 start-dsh-plugin\u002Fcordis.yml： - insert: - id: start-dsh-plugin name: '.\u002Fsrc\u002Findex.ts' config: greeting: 'Hi there' maxRetries: 5 重新运行 dsh web： pnpm dsh web --patch .\u002Fstart-dsh-plugin\u002Fcordis.yml 对话输入 Use the greet tool to greet Ada.，模型会调用 greet 工具，回复 Hi there, Ada! 👋。 打包插件 上述通过 --patch overlay 加载本地插件。 这里再动手打包成组合包（bundle），用 dsh plugin add 来安装。 写 start-dsh-plugin\u002Fpackage.json： { \"name\": \"start-dsh-plugin\", \"version\": \"0.1.0\", \"type\": \"module\", \"main\": \"src\u002Findex.ts\", \"files\": [\"src\u002Findex.ts\", \"cordis.patch.yml\"], \"dsh\": { \"bundle\": { \"patch\": \".\u002Fcordis.patch.yml\" } } } 写 start-dsh-plugin\u002Fcordis.patch.yml： - insert: - id: start-dsh-plugin name: start-dsh-plugin config: greeting: 'Hi' maxRetries: 5 安装进 dsh web： # 从本地安装 pnpm dsh plugin --profile web add .\u002Fstart-dsh-plugin # 通过名称移除 pnpm dsh plugin --profile web remove start-dsh-plugin dsh web 是预装的一个 profile，都位于 $DSH_HOME\u002Fprofiles\u002F\u003Cname>。 之后，重新运行 dsh web（web 是 --profile web 的别名）： # 查看配置树 pnpm dsh web --dump-config | grep start-dsh-plugin # 重新运行 pnpm dsh web 发布脚本 要发布，先得补齐再构建： package.json tsconfig.json tsconfig.local.json 构建 lib\u002F： cd start-dsh-plugin\u002F # 在 harness 仓库内构建 pnpm exec tsc -p tsconfig.local.json # 或，clone 项目安装依赖再构建 pnpm install && pnpm run build pnpm pack --dry-run 发布 tar： rm -r lib\u002F # 打包 # 若在 harness 仓库内打包，把 package.json 里改为 \"build\": \"tsc -p tsconfig.local.json\" pnpm pack # 从 tar 包安装 pnpm dsh plugin --profile web add .\u002Fstart-dsh-plugin-0.1.0.tgz 发布 npm： pnpm login pnpm publish --access public # 从 npm 安装 pnpm dsh plugin --profile web add start-dsh-plugin 发布 github： # 从 github 安装 # 官方文档要让允许从源码构建，但看其他插件就直接 package.json 指向源码、或把 lib\u002F 上传 pnpm dsh plugin --profile web add github:ikuokuo\u002Fstart-dsh-plugin 一些问题 该 dsh 工具插件在其最新源码上不能正常启动，报错导入不了 'CallId'。 因其 dsh-tools 版本到了 0.1.2-alpha.1，而 package.json 里用的最新发布只到 \"^0.1.1-rc.2\"。 需在 harness 仓库内构建或打包，再安装。 哪找插件 DSH Market Awesome DSH Plugin Awesome DeepSeek Harness",2903,{"id":6,"kind":7,"title":11,"summary":13,"image":14,"href":15,"meta":36,"badge":10,"author":12,"stats":-1,"accent":37,"coverRatio":38,"tags":39},"2026 · 软件开发","#2563eb","16 \u002F 10",[18],{"targetType":8,"targetId":9,"likedByMe":41,"likeCount":42,"commentCount":42,"contentLikeCount":42,"contentCommentCount":42,"sourceLikeCount":42,"sourceCommentCount":42},false,0,[44,50,57,63,69,76,83,90],{"id":45,"kind":7,"title":46,"summary":47,"image":14,"href":48,"meta":36,"badge":10,"author":12,"stats":-1,"accent":37,"coverRatio":38,"tags":49},"NEWS_ARTICLE:832","用 runtime-async 写一个支持 async\u002Fawait 的轻量脚本引擎","起因：一个好奇 事情的开头很简单。 给 .NET 做过动态脚本的人大概都碰到过同一堵墙：表达式树也好、Reflection.Emit 也好，都很难支持 async\u002Fawait。原因不在语法，而在 await 的实现方式——C# 编译器要为每个 async 方法生成一个状态机结构体，把方法体切成若干片","\u002Fnews\u002F832",[18],{"id":51,"kind":7,"title":52,"summary":53,"image":54,"href":55,"meta":36,"badge":10,"author":12,"stats":-1,"accent":37,"coverRatio":38,"tags":56},"NEWS_ARTICLE:855","被罚了500后，整个人都变老实了","我们组有个同事，以前是那种闲不住的人。现在也闲不住 只不过是不敢动了。 去年部门空降了一位新总监，阿里P8，第一次全员会PPT上就八个大字：拥抱变化，永不言弃。 新领导上来搞流程改革，每个模块指定Owner，出事追责到人，A级事故罚款500起步，B级300 依次类推，发版上线改配置全走审批。说实话之","https:\u002F\u002Fimg2024.cnblogs.com\u002Fblog\u002F273387\u002F202608\u002F273387-20260818222617092-925481998.png","\u002Fnews\u002F855",[18],{"id":58,"kind":7,"title":59,"summary":60,"image":14,"href":61,"meta":36,"badge":10,"author":12,"stats":-1,"accent":37,"coverRatio":38,"tags":62},"NEWS_ARTICLE:862","go中make声明切片, 修改切片,append给切片扩容,合并切片,复制切片","make 声明切片 make([]类型, 长度， 容量) kage main import (&quot;fmt&quot;) \u002F\u002F 入口函数 func main() { \u002F\u002F make 声明切片，长度是4， 容量是10 var sliceArr1 = make([]int, 4, 10) fmt.","\u002Fnews\u002F862",[18],{"id":64,"kind":7,"title":65,"summary":66,"image":14,"href":67,"meta":36,"badge":10,"author":12,"stats":-1,"accent":37,"coverRatio":38,"tags":68},"NEWS_ARTICLE:866","Spring Boot事件监听，这东西到底解决啥问题？","一、先聊个场景，你就明白这玩意儿干啥的了 点过外卖吧？那咱们就用这个场景来说事。 你掏出手机下了单，付了钱。接下来会发生啥？ 厨房那头开始备菜炒菜（这件事耽误不得，客户饿着呢） 手机收到一条短信：&quot;您的订单已收到，预计30分钟送达&quot; 你的会员账户里多了一堆积分 店长那个收银小喇叭","\u002Fnews\u002F866",[18],{"id":70,"kind":7,"title":71,"summary":72,"image":73,"href":74,"meta":36,"badge":10,"author":12,"stats":-1,"accent":37,"coverRatio":38,"tags":75},"NEWS_ARTICLE:881","RSA 密码传输加密通用接入方案","@目录前言一、介绍二、RSA 在本方案中的角色三、密文协议格式四、密钥生成与 Apollo 配置4.1 编译工具类4.2 执行生成密钥4.3 执行输出示例4.4 Apollo 配置示例五、后端接入方式AOP 注解示例六、后端解密流程七、前端接入方式7.1 获取公钥和 nonce7.2 使用 RSA-","https:\u002F\u002Fimg2024.cnblogs.com\u002Fblog\u002F1867541\u002F202608\u002F1867541-20260831165110853-162420906.png","\u002Fnews\u002F881",[18],{"id":77,"kind":7,"title":78,"summary":79,"image":80,"href":81,"meta":36,"badge":10,"author":12,"stats":-1,"accent":37,"coverRatio":38,"tags":82},"NEWS_ARTICLE:888","[开源] LogCrate：免解压、支持筛选和 AI 分析的 PC 端桌面日志工具","日常排查客户软件运行问题时，经常需要反复下载日志、解压缩，再从一堆文件里慢慢翻找，过程比较麻烦；而且很多日志工具也不支持针对具体字段进行筛选。 对比了一些市面上的日志分析工具后，发现能够同时兼容归档阅读、目录监控、到达通知、结构化筛选和 AI 分析的工具并不多，于是就自己动手做了一款。 PS：自己做","https:\u002F\u002Fiili.io\u002FCy4ztaa.png","\u002Fnews\u002F888",[18],{"id":84,"kind":7,"title":85,"summary":86,"image":87,"href":88,"meta":36,"badge":10,"author":12,"stats":-1,"accent":37,"coverRatio":38,"tags":89},"NEWS_ARTICLE:900","java 多线程开发系列之七：玩转多线程（线程的协作）","线程的协作多种多样，这次主要说说wait和notify两种Object的方法。这也是java早期原生的重要的协作机制之一。先说下这两个英文单词：wait [weɪt] v.等待;等候;(尤指长期地)希望，盼望，期待notify [ˈnəʊtɪfaɪ] vt.通知;(正式)通报;也就是一个等待，一个通","https:\u002F\u002Fimg2024.cnblogs.com\u002Fblog\u002F704073\u002F202608\u002F704073-20260831103138251-1707185366.png","\u002Fnews\u002F900",[18],{"id":91,"kind":7,"title":92,"summary":93,"image":94,"href":95,"meta":36,"badge":10,"author":12,"stats":-1,"accent":37,"coverRatio":38,"tags":96},"NEWS_ARTICLE:917","[python] pywinauto使用指北","当业务系统没有API、命令行接口或可直接集成的数据通道时，桌面自动化往往是打通业务流程的最后一公里。pywinauto库通过Win32 API与Microsoft UI Automation（UIA）访问Windows窗口及控件，使Python脚本能够驱动桌面应用。本文聚焦于pywinauto的基础","https:\u002F\u002Fgitlab.com\u002Fluohenyueji\u002Farticle_picture_warehouse\u002F-\u002Fraw\u002Fmain\u002FCSDN\u002F%5Bpython%5D%20pywinauto%E4%BD%BF%E7%94%A8%E6%8C%87%E5%8C%97\u002Fimgs\u002F1.jpg","\u002Fnews\u002F917",[18]]