让模型直接运行 Python 代码并取回结果
29.7/100
综合分
0
GitHub 星标
—
npm 周下载
—/5
用户评分
数据截至 2026/11/2 · 周下载取自 npm 全网(含 CI / 镜像),非本站安装数;综合分由星标、活跃度与兼容性检查合成。
安装命令 · 需先装 dsh CLI 引擎
dsh plugin --profile web add jcy0chenyuan0/dsh-plugin-python该包不可直接 npm 安装,改从 GitHub 源安装(明细见下方安装检查)
状态速览
判定依据:实装验证 · 静态安装检查 · 自动扫描 · 仓库维护状态信任档位:仅索引
图例:✓ 通过! 需注意— 未判定 / 无数据· 「未判定」= 本站尚无数据,不代表插件有问题
档位由哪些信号合成
本站实装验证(真实安装 L4 覆盖全站;L5 为运行时冒烟或实机截图,覆盖范围小于 L4) · 验证所用 dsh 版本 · 静态安装检查 · 风险分级 · 仓库维护状态。 下方各区块是它的证据明细。
社区实装还没有人打卡 · 装过的第一个就是你
安全扫描自动 · 静态分析源码v2.7.0🔵 扫描:含敏感能力尚无人工评估展开查看扫描说明与证据 ↓
安全扫描自动 · 静态分析源码
v2.7.0静态扫描发现插件具备触达本地系统的能力:执行外部命令、读写/删除本地文件、读取剪贴板或密钥类环境变量(至少其一)。这是能力清单,不是危险判定——具体能力项与证据见下方,安装前请自行判断是否需要。
可执行外部命令读写/删除本地文件
查看扫描证据(共 15 处,展示前 15 条)
- 读取本地文件lib/python.js:93
entries = await readdir(directory, { withFileTypes: true }); - 读取本地文件lib/python.js:103
manifest = JSON.parse(await readFile(join(root, "runtime.json"), "utf8")); - 读取本地文件lib/python.js:110
if (!existsSync(interpreter)) continue; - 写入本地文件lib/python.js:443
await writeFile(scriptPath, args.code, "utf8"); - 写入本地文件lib/python.js:448
await mkdir(dirname(target), { recursive: true }); - 写入本地文件lib/python.js:449
await writeFile(target, file.content, "utf8"); - 删除本地文件递归lib/python.js:531
if (!keepScript) await rm(directory, { recursive: true, force: true }).catch(() => undefined); - 读取本地文件lib/bootstrap.js:31
if (!existsSync(script)) return; - 读取本地文件lib/bootstrap.js:34
const state = JSON.parse(readFileSync(STATE_PATH, "utf8")); - 执行外部命令固定命令lib/bootstrap.js:42
child = spawn("powershell.exe", ["-NoProfile", "-ExecutionPolicy", "Bypass", "-File", script, "-AutoInstall", "-Quiet"], { - 写入本地文件lib/bootstrap.js:53
writeFileSync(STATE_PATH, JSON.stringify({ lastAttempt: Date.now() }), "utf8"); - 读取本地文件install.mjs:19
if (!existsSync(lib)) throw new Error(`找不到实现文件:${lib}`); - 读取本地文件install.mjs:20
if (!existsSync(tpl)) throw new Error(`找不到模板:${tpl}`); - 读取本地文件install.mjs:22
let text = readFileSync(tpl, "utf8"); - 写入本地文件install.mjs:26
writeFileSync(out, text, "utf8");
扫描于 2026/11/4(0 天前) · 范围 入口闭包 + 发布文件清单 · 来源 GitHub 仓库
静态扫描只反映源码中出现的调用,不构成安全背书;人工评估与自动扫描相互独立、互不覆盖。
给这个插件打分还没有人投票↓
用户评分
还没有人投票,来当第一个
DSH 插件:一个面向模型的 Python 工具,使用 Harness 自带的 Python 运行时。
README
由 DeepSeek 最新模型翻译生成dsh-plugin-python
给 DeepSeek Harness(DSH)加一个模型能调用的 python 工具:用 Harness 自带的 Python 运行时执行代码,什么都不用装。
运行环境:Python 3.12.14,捆绑 numpy 2.3.5 / pandas 3.0.1 / python-docx / python-pptx / openpyxl / Pillow / lxml / XlsxWriter。
| 能力 | 状态 |
| 执行代码、返回 stdout | ✅ [exit code: 0] |
| 中文 / UTF-8 输出 | ✅ 强制 PYTHONUTF8=1 + PYTHONIOENCODING=utf-8 |
| 非零退出 + stderr 分离 | ✅ [exit code: 1] + traceback |
| args / stdin | ✅ sys.argv[1:]、sys.stdin |
| workdir(相对路径按会话工作区解析) | ✅ |
| files 多文件(辅助模块 / 数据 / 子目录) | ✅ import helpers、Path(__file__).parent |
| timeoutMs 超时终止 | ✅ [timed out after 1500 ms] |
展开完整文档(README 剩余 1 节)
dsh-plugin-python
给 DeepSeek Harness(DSH)加一个模型能调用的 python 工具:用 Harness 自带的 Python 运行时执行代码,什么都不用装。
运行环境:Python 3.12.14,捆绑 numpy 2.3.5 / pandas 3.0.1 / python-docx / python-pptx / openpyxl / Pillow / lxml / XlsxWriter。
| 能力 | 状态 |
| 执行代码、返回 stdout | ✅ [exit code: 0] |
| 中文 / UTF-8 输出 | ✅ 强制 PYTHONUTF8=1 + PYTHONIOENCODING=utf-8 |
| 非零退出 + stderr 分离 | ✅ [exit code: 1] + traceback |
| args / stdin | ✅ sys.argv[1:]、sys.stdin |
| workdir(相对路径按会话工作区解析) | ✅ |
| files 多文件(辅助模块 / 数据 / 子目录) | ✅ import helpers、Path(__file__).parent |
| timeoutMs 超时终止 | ✅ [timed out after 1500 ms] |
| 临时目录清理 | ✅ 抛错路径也不泄漏 |
| 越界路径拦截(files / workdir 的 ../) | ✅ 拒绝 |
文件与安装
首次安装:先在本目录运行 install.ps1(Windows)或 node install.mjs(macOS/Linux)。
脚本按当前目录自动生成 cordis.patch.yml(已 .gitignore),不写死任何盘符。
缺少环境怎么办(默认自动安装)
安装时 install.ps1 默认静默安装缺失环境;只想检查时加 -CheckOnly:
powershell -ExecutionPolicy Bypass -File .\install.ps1
只检查、不安装: powershell -ExecutionPolicy Bypass -File .\install.ps1 -CheckOnly
插件加载时也会在后台运行 bootstrap.ps1 -AutoInstall -Quiet(6 小时内不重复),不阻塞 DSH 启动;首次装完可能需要重试工具。
- Python:优先用 DSH 自带运行时(dsh-runtimes\\dependencies\python\python.exe);没有则 winget install Python.Python.3.12 --scope user。
- 也可以设置 DSH_PYTHON 或插件配置里的 pythonPath 指向任意 Python 3.11+。
- 关闭自动安装:patch 的 config 里设 autoInstall: false,或设置环境变量 DSH_BOOTSTRAP=0。
| 文件 | 作用 |
| lib/python.js | Host 侧插件:注册 python 工具 |
| cordis.patch.yml.tpl | bundle 补丁层模板;install 脚本生成 cordis.patch.yml |
| package.json | 包元数据(type: module,无任何运行时依赖)+ dsh.bundle 声明 |
本包是可安装的 DSH bundle,因此在 GUI 的「设置 → 插件」里可见、可整体启用/停用:
plugin_manager install_bundle file:<本目录的绝对路径> 装完 profile 的 package.json 里会同时出现:
dsh.profile.bundles: ["...", "dsh-plugin-python"]
dependencies: {"dsh-plugin-python": "file:<本目录的绝对路径>"}
卸载:GUI 插件页移除,或 plugin_manager remove_bundle dsh-plugin-python
机制:pnpm 会把本包复制到 <profile>/node_modules/dsh-plugin-python,而 cordis.patch.yml 里挂的是工作区绝对路径的 lib/python.js,所以改插件代码只需重启 DSH 即可生效(ESM 按 URL 缓存,不会热替换已激活的 fiber);只有改了 cordis.patch.yml(挂载参数)才需要重新 install_bundle 刷新那份副本。
为什么不能只写 cordis.patch.yml 里的 insert:那样确实能挂载,但不会出现在 GUI 的插件页(那一页列的是已安装的 bundle/inventory)。bundle 化之后两种能力都有。
工具参数
| 参数 | 必填 | 说明 |
| code | ✅ | 要执行的 Python 源码(写入 main.py) |
| description | ✅ | 5–10 词的动作描述(UI 展示) |
| files | | [{ path, content }],写入运行目录;用 import 名字 导入模块,用 Path(__file__).parent 读数据文件 |
| workdir | | 进程工作目录,默认会话工作区;相对路径按会话工作区解析,越界(.. 或工作区外的绝对路径)会被拒绝 |
| args | | 追加的命令行参数 |
| stdin | | 管道输入文本 |
| timeoutMs | | 超时毫秒数,到期终止进程 |
注意:进程工作目录是会话工作区,不是脚本目录。files 里的数据文件要用 Path(__file__).parent 解析;要留下产物则直接写工作区路径。
配置项(条目 config)
| 键 | 默认 | 含义 |
| pythonPath | 自动 | 指定解释器;默认按 runtime.json 找捆绑运行时,找不到才回退 PATH 上的 python |
| cwd | 会话工作区 | 默认工作目录 |
| timeoutMs | 120000 | 默认超时 |
| graceMs | 3000 | 终止宽限期 |
| maxOutputBytes | 200000 | 单流收集上限,超出部分落盘并给出 spillPath |
| keepScript | false | 保留临时脚本并回报 scriptPath |
设计要点
1. 零宿主依赖:模块只 import Node 内置模块,不导入任何 @deepseek-ai/。原因是工作区里的插件没有可达的 node_modules,而把 dsh-tools 作为真依赖安装会连带装入第二份 cordis(等于进程里出现第二个工具注册表)。
2. 原始 JSON Schema 方言:直接向 ctx.tools.register 传定义(不走 defineTool),对象层用 required: [...] 数组,oneOf 节点不挂同级关键字。
3. 沙箱合规:每次调用 ctx.sandboxPolicy.resolve({ session });非 danger-full-access 时用 ctx.sandbox.confine(argv, policy) 包一层再 spawn;需要隔离却没有沙箱提供者时 fail closed,绝不静默不隔离。
4. 进程与输出:ctx.subprocess.spawn + collect 模式,terminate() 处理超时,readFrom(0) 读流,超限自动落盘。
5. 清理:mkdtemp 之后的所有步骤都在 try/finally 内,任何异常都会删除临时目录(这条是被测试抓出来的真实 bug)。
验证记录
离线真机测试:.tooling/test-python-plugin.mjs —— 因为插件零依赖,可以用普通 Node 直接加载,并把 ctx 打桩后用真实子进程跑全部路径:
PASS basic + unicode PASS args + stdin
PASS multi-file import + data PASS timeout terminates
PASS exit code + stderr PASS path escape rejected
PASS workdir inside honoured PASS workdir escape rejected
PASS temp dirs cleaned
9/9 passed
线上验证(运行中的 DSH):plugin-python-4 = enabled + active(plugin-python / plugin-python-2 / plugin-python-3 已停用); files 多文件调用返回 live after move: moved-to-python_hk / data: k,v | x,1,[exit code: 0]。
⚠️ 改动生效时机:运行中的 fiber 按 URL 缓存旧模块,改文件内容不会换来新实现。2026-10-06 给 workdir 加上越界拦截后,正是按 §4 坑③ 做的热替换(新 id plugin-python-4 + 停用 plugin-python-3),免重启即时生效:重挂后线上 workdir: "../.." 立即被拒绝,而工作区内的 workdir 仍照常可用。
DSH 插件怎么写(依据安装包内官方文档整理)
来源:@deepseek-ai/cordis-plugin-loader/README.md、@deepseek-ai/dsh-tools/README.md。
1. 插件模块形态
export const name = "plugin-python"; // 身份
export const inject = ["tools", "subprocess"]; // 激活前必须就绪的服务
export const Config = z.object({ ... }); // @deepseek-ai/schemastery(可选)
export function apply(ctx, config) { ... } // 挂载逻辑,产物由 fiber 托管
ctx.get("x") 取可选服务(自行判空);inject 里的服务在 ctx.x 上必然存在。
2. Loader 条目选项
| 字段 | 说明 |
| id | 稳定标识,用于 resolve / update / remove |
| name | loader 导入的模块 specifier(包名、相对路径或绝对路径) |
| config | 传给 apply 的配置 |
| group | 该条目是组,config 是子条目列表 |
| disabled | 停用条目 |
| inject | 为条目追加必需服务 |
3. 注册工具
ctx.tools.register(defineTool({
name: "read_file",
description: "Read a file from disk.",
parameters: { path: { type: "string", required: true, description: "Absolute file path" } },
output: { schema: { type: "string" }, render: (_args, value) => [{ type: "text", text: value }] },
async execute(args, exec) { return readFile(args.path, { encoding: "utf8", signal: exec.signal }); }
}));
- 参数 DSL:string / number / integer / boolean / null / array / object / json / oneOf,required: true 写在属性上。
- output.schema 是值的 schema,render 返回内容块;注册即生效,schema 自动进系统提示。
- presentCall / presentResult 只给 Host 侧消费者;内置 Web 客户端不消费它们,卡片由客户端从原始调用参数推导。
- 策略扩展点:tools/pre-execute、ctx.tools.guard()、tools/execute、tools/post-execute、tools/result。
4. ⚠️ 三个实测坑
① 工作区插件没有 node_modules。 写 import { defineTool } from "@deepseek-ai/dsh-tools" 会在导入阶段失败,而 loader 只报一句 failed to import(真实原因是 ERR_MODULE_NOT_FOUND)。三条路:不导入宿主包,直接注册原始定义(本插件采用);用 createRequire(<resources>/app.asar/dsh/package.json) 复用宿主模块实例;或作为 profile bundle 正规安装。
② 两套 schema 方言。 参数用属性级 required: true;原始 JSON Schema 的对象要在对象层写 required: [...],写成属性级会报 JsonSchemaError: ... required is not supported on type "string"。另外 additionalProperties 只接受布尔值。
③ 改完代码(或搬了目录)不会自动生效。 ESM 模块按 URL 缓存:替换文件内容后重挂条目,fiber 拿到的还是旧模块(现象:条目 active 但工具 schema 依旧是旧的)。两种办法:重启 DSH;或换一个新的条目 id(新 id → 新 fiber → 新 URL 导入),并把旧 id 用 disabled: true 停掉——本插件三次迁移(换实现、搬进 python_hk、加 workdir 守卫)都是这样热替换的,现用 id 为 plugin-python-4。
5. 起进程:subprocess + sandbox
const policy = ctx.get("sandboxPolicy")?.resolve({ session: exec.agent.session });
let argv = [pythonPath, scriptPath];
if (policy && policy.mode !== "danger-full-access") {
const confined = await ctx.get("sandbox").confine(argv, policy, exec.signal);
argv = confined.argv; // 必须换成 confine 返回的 argv
}
const handle = ctx.subprocess.spawn({
argv, cwd, graceMs, signal: exec.signal,
stdio: { stdin: "ignore", stdout: { maxBytes, spill: { maxBytes } }, stderr: { maxBytes, spill: { maxBytes } } },
env: { PYTHONIOENCODING: "utf-8", PYTHONUTF8: "1" }
});
const outcome = await handle.done; // { exitCode, signal }
const text = handle.collected.stdout.readFrom(0).text; // 非消费式、按偏移读取
6. Windows 上的 Python 细节
捆绑解释器的 sys.stdout.encoding 默认是 gbk(locale cp936),不设 PYTHONUTF8=1 / PYTHONIOENCODING=utf-8 时中文输出会乱码。
7. 工具链
| 工具 | 用途 |
| .tooling/test-python-plugin.mjs | 打桩 ctx + 真实子进程的离线测试(9 项断言,含 workdir 越界拦截与合法放行) |
asar.mjs(读取 Electron app.asar 的辅助脚本)已于 2026-10-06 随工作区清理删除;需要时从 %TEMP%\dsh-workspace-cleanup-20261006-141447.zip 取回。
可移植性 / 换机器安装
这个仓库不包含本机绝对路径:cordis.patch.yml 由安装脚本按当前目录生成(已 .gitignore)。
换一台机器:
1. git clone 本仓库到任意目录;
2. 运行 powershell -ExecutionPolicy Bypass -File .\install.ps1(Windows)或 node install.mjs(macOS/Linux);
3. 在 DSH 里执行 plugin_manager install_bundle file:<本目录的绝对路径>。
运行环境
- Windows / macOS / Linux 均可:插件只用 Node 内置模块。
- Python:默认按 runtime.json 找 DSH 自带运行时;找不到时回退 PATH 上的 python,也可在 patch 的 config.pythonPath 指定。
- 不额外安装任何 Python 包;捆绑运行时自带 numpy / pandas / python-docx / python-pptx / openpyxl / Pillow / lxml / XlsxWriter。预览分享卡片长什么样 ↓
分享 · DeepSeek Harness Hub
jcy0chenyuan0/dsh-plugin-python
让模型直接运行 Python 代码并取回结果
相关插件 · 工具 / 效率
破甲管控台kingcharleslzy-ai/dsh-purge
dsh-purge Community · DeepSeek Harness 社区维护版:宿主兼容、状态诊断、提示词管理、更新与本机备份回滚。基于小杨 / YuJunZhiXue 的 dsh-purge。
★ 4,330已汉化DeepSeek 客户端
74.5
网文长卷lingfengQAQ/webnovel-writer
基于 Claude Code 的长篇网文辅助创作系统,解决 AI 写作中的「遗忘」和「幻觉」问题,支持 200…
★ 7,826已汉化DSH
72.2
花束设计alchaincyf/huashu-design
一句话生成网页、原型、PPT 与信息图等可交付设计
★ 28,638已汉化DSH
71.7
多智能体协作HKUDS/AutoSwarm
AutoSwarm: Unify Your Agents. Unify Your Context (Codex · Claude Code · DeepSeek Harness · Muse · Grok · WorkBuddy· nanobot · and more)
★ 2,349已汉化DSH
71.6
Vox 拼贴视频生成Alisa0808/vox-director
🎬 Vox Director拼贴动效导演
★ 2,129已汉化DSH
71.4
Agent 演化引擎Q00/ouroboros
智能体 OS:智能体自己变聪明,我们只守住底线:面试准入、分阶段评估、带预算的进化循环。MCP 服务器,14 种运行时:Claude Code、Codex CLI、Gemini CLI、OpenCode、Copilot、Kiro 等。
★ 6,311已汉化DSH
71.4
这个插件是你维护的吗?
作者本人可认领并核对本条目;认领通过后,详情页会显示「作者已认领」标记。