news 2026/2/22 8:37:47

使用 jsr:@langchain/pyodide-sandbox 构建 Python 安全沙箱(完整入门教程)

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
使用 jsr:@langchain/pyodide-sandbox 构建 Python 安全沙箱(完整入门教程)

适用于:

  • LLM / Agent 执行不可信 Python 代码
  • 在线 Python 运行环境
  • LangChain / 自动化工具沙箱
  • 多租户系统安全执行

一、背景介绍

在 LLM Agent、在线代码执行、插件系统等场景中,我们经常面临一个问题:

如何安全地执行用户提供的 Python 代码?

传统方案(exec/ 子进程 / Docker)要么不安全、要么太重。

LangChain 官方给出了一种更优雅的方案:

Pyodide + Deno Sandbox

其中核心组件就是:

jsr:@langchain/pyodide-sandbox

它允许我们在WebAssembly(WASM)级别安全执行 Python 代码,并且具备:

  • 强隔离
  • 权限控制
  • 低资源占用
  • 易于集成 Agent / LangChain

二、什么是 jsr:@langchain/pyodide-sandbox?

2.1 核心技术栈

组件作用
PyodidePython → WebAssembly
Deno沙箱运行时
WASM系统级隔离
micropipPython 包安装

整体结构:

Python Code ↓ Pyodide (WASM) ↓ Deno Sandbox ↓ Host OS(隔离)

2.2 为什么不用 Docker?

对比DockerPyodide Sandbox
启动速度⚡ 极快
资源占用
安全粒度容器级WASM 级
Agent 集成一般非常友好

三、环境准备

3.1 安装 Deno

curl-fsSL https://deno.land/install.sh|sh

加入环境变量:

exportPATH="$HOME/.deno/bin:$PATH"

验证:

deno --version

四、最基础用法(CLI)

4.1 执行 Python 代码

deno run -A jsr:@langchain/pyodide-sandbox\-c"print('Hello, World')"

输出:

{"stdout":"Hello, World","stderr":null,"result":null,"success":true,"sessionMetadata":{"created":"2026-01-22T02:13:43.619Z","lastModified":"2026-01-22T02:13:43.660Z","packages":[]}}

4.2 执行计算

deno run -A jsr:@langchain/pyodide-sandbox\-c"print(2 + 3)"
{"stdout":"5","stderr":null,"result":null,"success":true,"sessionMetadata":{"created":"2026-01-22T02:09:58.747Z","lastModified":"2026-01-22T02:09:58.794Z","packages":[]}}

五、自动安装 Python 包(micropip)

Pyodide无需 pip / venv,而是使用micropip

5.1 使用 numpy 示例

deno run -A jsr:@langchain/pyodide-sandbox\-c"import numpy as np; print(np.arange(5))"

首次执行会看到:

{"stdout":"Loading numpyDidn't find package numpy-2.0.2-cp312-cp312-pyodide_2024_0_wasm32.whl locally, attempting to load from https://cdn.jsdelivr.net/pyodide/v0.27.7/full/Package numpy-2.0.2-cp312-cp312-pyodide_2024_0_wasm32.whl loaded from https://cdn.jsdelivr.net/pyodide/v0.27.7/full/, caching the wheel in node_modules for future use.Loaded numpy[0 1 2 3 4]","stderr":null,"result":null,"success":true,"sessionMetadata":{"created":"2026-01-22T02:14:13.300Z","lastModified":"2026-01-22T02:14:17.036Z","packages":["numpy"]}}

这是正常行为,表示:

  • Pyodide 正在下载依赖
  • 下载完成后会缓存到node_modules
  • 后续执行不会再下载

六、Stateful 会话(保持执行状态)

默认情况下,每次执行是无状态的

如果你希望多次执行共享变量,需要开启stateful 模式


6.1 创建 state

deno run -A jsr:@langchain/pyodide-sandbox\-s -c"x = 42"

会返回sessionBytes

{"stdout":null,"stderr":null,"result":null,"success":true,"sessionBytes":[128,4,149,168,0,0,0,0,0,0,0,140,10,100,105,108,108,46,95,100,105,108,108,148,140,14,95,105,109,112,111,114,116,95,109,111,100,117,108,101,148,147,148,140,8,95,95,109,97,105,110,95,95,148,133,148,82,148,125,148,40,140,8,95,95,110,97,109,101,95,95,148,104,3,140,7,95,95,100,111,99,95,95,148,78,140,11,95,95,112,97,99,107,97,103,101,95,95,148,78,140,8,95,95,115,112,101,99,95,95,148,78,140,15,95,95,97,110,110,111,116,97,116,105,111,110,115,95,95,148,125,148,140,13,95,112,121,111,100,105,100,101,95,99,111,114,101,148,104,2,140,13,95,112,121,111,100,105,100,101,95,99,111,114,101,148,133,148,82,148,140,1,120,148,75,42,117,98,46],"sessionMetadata":{"created":"2026-01-22T02:14:55.543Z","lastModified":"2026-01-22T02:14:56.955Z","packages":["dill"]}}

6.2 恢复 state

jsr:@langchain/pyodide-sandbox的 stateful 会话由两部分组成

字段作用
sessionBytesPython VM 的二进制快照(dill 序列化)
sessionMetadata会话上下文(创建时间 / 包信息 / 兼容性校验)

CLI 在恢复 session 时需要:

sessionBytes → 还原 Python 对象 sessionMetadata → 校验 & 环境一致性
deno run -A jsr:@langchain/pyodide-sandbox\-s -b'<sessionBytes>'\-m'<sessionMetadata>'\-c"print(x)"

例子

deno run -A jsr:@langchain/pyodide-sandbox\-s\-b'[128,4,149,168,0,0,0,0,0,0,0,140,10,100,105,108,108,46,95,100,105,108,108,148,140,14,95,105,109,112,111,114,116,95,109,111,100,117,108,101,148,147,148,140,8,95,95,109,97,105,110,95,95,148,133,148,82,148,125,148,40,140,8,95,95,110,97,109,101,95,95,148,104,3,140,7,95,95,100,111,99,95,95,148,78,140,11,95,95,112,97,99,107,97,103,101,95,95,148,78,140,8,95,95,115,112,101,99,95,95,148,78,140,15,95,95,97,110,110,111,116,97,116,105,111,110,115,95,95,148,125,148,140,13,95,112,121,111,100,105,100,101,95,99,111,114,101,148,104,2,140,13,95,112,121,111,100,105,100,101,95,99,111,114,101,148,133,148,82,148,140,1,120,148,75,42,117,98,46]'\-m'{"created":"2026-01-22T02:14:55.543Z","lastModified":"2026-01-22T02:14:56.955Z","packages":["dill"]}'\-c"print(x)"

输出:

{"stdout":"42","stderr":null,"result":null,"success":true,"sessionBytes":[128,4,149,168,0,0,0,0,0,0,0,140,10,100,105,108,108,46,95,100,105,108,108,148,140,14,95,105,109,112,111,114,116,95,109,111,100,117,108,101,148,147,148,140,8,95,95,109,97,105,110,95,95,148,133,148,82,148,125,148,40,140,8,95,95,110,97,109,101,95,95,148,104,3,140,7,95,95,100,111,99,95,95,148,78,140,11,95,95,112,97,99,107,97,103,101,95,95,148,78,140,8,95,95,115,112,101,99,95,95,148,78,140,15,95,95,97,110,110,111,116,97,116,105,111,110,115,95,95,148,125,148,140,13,95,112,121,111,100,105,100,101,95,99,111,114,101,148,104,2,140,13,95,112,121,111,100,105,100,101,95,99,111,114,101,148,133,148,82,148,140,1,120,148,75,42,117,98,46],"sessionMetadata":{"created":"2026-01-22T02:14:55.543Z","lastModified":"2026-01-22T02:18:31.879Z","packages":["dill"]}}

七、Python 正确执行模板(非常重要)

⚠️很多人踩坑就在这里

❌ 错误写法

2+3

或者:

print(2+3)

这样不会返回 result,只会进 stdout。


✅ 正确写法(标准模板)

asyncdefmain(args):return2+3

✅ 同时 print + return

asyncdefmain(args):print("hello")return{"sum":2+3}

返回结构:

{"stdout":"hello\n","result":{"sum":5}}

八、在 Python 中集成(推荐)

LangChain 官方提供了 Python 封装包:

8.1 安装

pipinstalllangchain-sandbox

8.2 Python 示例

fromlangchain_sandboximportPyodideSandboximportasyncioasyncdefrun():sandbox=PyodideSandbox(allow_net=False,allow_read=False,allow_write=False,)result=awaitsandbox.execute(""" async def main(args): print("hello from pyodide") return 1 + 2 await main({}) """)print("status:",result.status)print("stdout:",result.stdout)print("result:",result.result)asyncio.run(run())

结果

status: success stdout: hello from pyodide result:3

九、权限控制(安全关键)

参数说明
allow_net是否允许联网
allow_read文件读取白名单
allow_write文件写入
allow_env读取环境变量
allow_run执行子进程
memory_limit_mb内存限制

示例:

sandbox=PyodideSandbox(allow_net=False,allow_read=["data"],allow_write=False,memory_limit_mb=32,)

十、典型应用场景

✔ LLM Agent 执行代码
✔ LangChain Tool Sandbox
✔ 在线 Python 解释器
✔ 插件系统
✔ 教育 / 判题系统


十一、常见问题

Q1:stdout 很乱正常吗?

✅ 正常
第一次会输出 Pyodide 包安装日志
生产环境请只信result字段


Q2:能安装 pandas / numpy 吗?

⚠️ 只能安装pure Python / WASM 兼容包
❌ 不支持 CPython C 扩展(如 torch)


十二、官方资源汇总

  • JSR 文档
    https://jsr.io/@langchain/pyodide-sandbox

  • GitHub 源码
    https://github.com/langchain-ai/langchain-sandbox

  • Pyodide 官方文档
    https://pyodide.org

  • Python 封装
    https://pypi.org/project/langchain-sandbox


十三、总结

jsr:@langchain/pyodide-sandbox是目前LLM 场景下最优雅的 Python 沙箱方案之一

轻量、安全、Agent 友好

非常适合用在:

  • AI Agent
  • 多租户执行
  • 自动化平台
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/2/21 18:05:44

智慧文明的宪章:〈贾子普世智慧公理〉对AI与人类的双重裁决

智慧文明的宪章&#xff1a;〈贾子普世智慧公理〉对AI与人类的双重裁决 摘要&#xff1a; 2026年提出的《贾子普世智慧公理》是一部文明级规范体系&#xff0c;它首次将“智慧”定义为需满足“思想主权、普世中道、本源探究、悟空跃迁”四大公理的可裁决标准。该体系不仅裁决当…

作者头像 李华
网站建设 2026/2/17 15:23:24

实战:用Claude在VSCode中快速开发Python数据分析项目

快速体验 打开 InsCode(快马)平台 https://www.inscode.net输入框内输入如下内容&#xff1a; 创建一个Python数据分析项目模板&#xff0c;集成pandas、numpy和matplotlib。实现功能&#xff1a;1) 通过Claude解释数据清洗步骤&#xff1b;2) 自动生成常见统计分析方法代码&…

作者头像 李华
网站建设 2026/2/17 22:27:56

YOLO26训练如何resume?断点续训部署教程

YOLO26训练如何resume&#xff1f;断点续训部署教程 最新 YOLO26 官方版训练与推理镜像 本镜像基于 YOLO26 官方代码库 构建&#xff0c;预装了完整的深度学习开发环境&#xff0c;集成了训练、推理及评估所需的所有依赖&#xff0c;开箱即用。 1. 镜像环境说明 核心框架: p…

作者头像 李华
网站建设 2026/2/17 10:14:29

BERT-base-chinese安全加固:API访问控制实战配置

BERT-base-chinese安全加固&#xff1a;API访问控制实战配置 1. 为什么需要给BERT填空服务加把“锁” 你可能已经试过这个中文BERT填空服务&#xff1a;输入一句带[MASK]的话&#xff0c;点一下按钮&#xff0c;秒出答案——“床前明月光&#xff0c;疑是地[MASK]霜”&#x…

作者头像 李华
网站建设 2026/2/20 2:36:20

Qwen3-4B-Instruct部署成功率低?自动化启动优化实战解析

Qwen3-4B-Instruct部署成功率低&#xff1f;自动化启动优化实战解析 1. 问题背景&#xff1a;为什么Qwen3-4B-Instruct部署常失败&#xff1f; 你是不是也遇到过这种情况&#xff1a;兴冲冲地在本地或云服务器上部署 Qwen3-4B-Instruct-2507&#xff0c;结果等了半天&#xf…

作者头像 李华
网站建设 2026/2/19 17:06:49

Z-Image-Turbo为何推荐使用localhost访问?网络配置避坑指南

Z-Image-Turbo为何推荐使用localhost访问&#xff1f;网络配置避坑指南 你是否在部署Z-Image-Turbo时遇到过页面打不开、连接失败或远程访问异常的问题&#xff1f;明明模型已经启动&#xff0c;命令行也显示服务正常运行&#xff0c;但在浏览器中就是无法加载UI界面。其实&am…

作者头像 李华