跳到主要内容
极客日志极客日志面向AI+效率的开发者社区
首页博客GitHub 精选镜像工具UI配色美学隐私政策关于联系
搜索内容 / 工具 / 仓库 / 镜像...⌘K搜索
注册
博客列表
PythonNode.jsSaaSAI

使用 jsr:@langchain/pyodide-sandbox 构建 Python 安全沙箱

介绍如何使用 jsr:@langchain/pyodide-sandbox 在 WebAssembly 级别安全执行 Python 代码。该方案基于 Pyodide 和 Deno Sandbox,相比 Docker 具有启动快、资源占用低、隔离性强的优势。内容涵盖环境准备、CLI 基础用法、micropip 包管理、Stateful 会话保持、权限控制及 Python SDK 集成。适用于 LLM Agent、在线代码执行及多租户系统场景。

古灵精怪发布于 2026/3/24更新于 2026/5/2843 浏览
使用 jsr:@langchain/pyodide-sandbox 构建 Python 安全沙箱

一、背景介绍

在 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

加入环境变量:

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

验证:

den --version 

四、最基础用法(CLI)

4.1 执行 Python 代码
den 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 执行计算
den 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.743Z","lastModified":"2026-01-22T02:09:58.794Z","packages":[]}} 

五、自动安装 Python 包(micropip)

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

5.1 使用 numpy 示例
den 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
den 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 → 校验 & 环境一致性 
den run -A jsr:@langchain/pyodide-sandbox \ -s \ -b '<sessionBytes>'\ -m '<sessionMetadata>'\ -c "print(x)"

例子

den 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。

✅ 正确写法(标准模板)
async def main(args):
    return 2 + 3
✅ 同时 print + return
async def main(args):
    print("hello")
    return {"sum": 2 + 3}

返回结构:

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

八、在 Python 中集成(推荐)

LangChain 官方提供了 Python 封装包:

8.1 安装
pip install langchain-sandbox 
8.2 Python 示例
from langchain_sandbox import PyodideSandbox
import asyncio

async def run():
    sandbox = PyodideSandbox(
        allow_net=False,
        allow_read=False,
        allow_write=False,
    )
    result = await sandbox.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
  • 多租户执行
  • 自动化平台

目录

  1. 一、背景介绍
  2. 二、什么是 jsr:@langchain/pyodide-sandbox?
  3. 2.1 核心技术栈
  4. 2.2 为什么不用 Docker?
  5. 三、环境准备
  6. 3.1 安装 Deno
  7. 四、最基础用法(CLI)
  8. 4.1 执行 Python 代码
  9. 4.2 执行计算
  10. 五、自动安装 Python 包(micropip)
  11. 5.1 使用 numpy 示例
  12. 六、Stateful 会话(保持执行状态)
  13. 6.1 创建 state
  14. 6.2 恢复 state
  15. 七、Python 正确执行模板(非常重要)
  16. ❌ 错误写法
  17. ✅ 正确写法(标准模板)
  18. ✅ 同时 print + return
  19. 八、在 Python 中集成(推荐)
  20. 8.1 安装
  21. 8.2 Python 示例
  22. 九、权限控制(安全关键)
  23. 十、典型应用场景
  24. 十一、常见问题
  25. Q1:stdout 很乱正常吗?
  26. Q2:能安装 pandas / numpy 吗?
  27. 十二、官方资源汇总
  28. 十三、总结
  • 💰 8折买阿里云服务器限时8折了解详情
  • Magick API 一键接入全球大模型注册送1000万token查看
  • 🤖 一键搭建Deepseek满血版了解详情
  • 一键打造专属AI 智能体了解详情
极客日志微信公众号二维码

微信扫一扫,关注极客日志

微信公众号「极客日志V2」,在微信中扫描左侧二维码关注。展示文案:极客日志V2 zeeklog

更多推荐文章

查看全部
  • 基于 Fofa 与 Rad 的自动化漏洞扫描实战流程
  • Cloudflare Turnstile 在 Java 后端的人机验证实践
  • Visual Studio 关闭 Copilot AI 代码提示的设置方法
  • Python 同时适配 Elasticsearch 与 Easysearch 实战复盘
  • Web JS 逆向全体系详解:原理、工具与实战复现
  • Vivado 2023.2 下载安装与 FPGA 开发环境搭建指南
  • Git Worktree 原理、实战与避坑指南
  • 灵活就业潮带动 Python 培训,河南 00 后学习人数翻倍
  • MySQL 深入理解 InnoDB 核心文件结构:.ibd、.ib_logfile、undo 日志与 ibdata1
  • Python 网络爬虫入门:原理、协议与实战代码
  • 深入理解 C++ 异常机制
  • 基于 Ollama-OCR 与 Llama 3.2-Vision 的文字识别方案
  • C++ STL 常用容器用法总结
  • 无人机 RGB+ 红外双模态小目标行人检测系统构建与数据集详解
  • IntelliJ IDEA 打包 Web 项目 WAR 包:从配置到 Tomcat 部署全流程
  • Python 常用库指南:数值计算、可视化、机器学习等 8 大领域
  • OpenClaw(龙虾 AI)Windows 与 macOS 安装优缺点对比
  • 大模型开发还是应用:从业者选择指南
  • 2026 年主流 AI 写作工具深度测评与对比
  • Web Audio API 音乐可视化技术拆解:从音频解析到动效实现

相关免费在线工具

  • RSA密钥对生成器

    生成新的随机RSA私钥和公钥pem证书。 在线工具,RSA密钥对生成器在线工具,online

  • Mermaid 预览与可视化编辑

    基于 Mermaid.js 实时预览流程图、时序图等图表,支持源码编辑与即时渲染。 在线工具,Mermaid 预览与可视化编辑在线工具,online

  • 随机西班牙地址生成器

    随机生成西班牙地址(支持马德里、加泰罗尼亚、安达卢西亚、瓦伦西亚筛选),支持数量快捷选择、显示全部与下载。 在线工具,随机西班牙地址生成器在线工具,online

  • curl 转代码

    解析常见 curl 参数并生成 fetch、axios、PHP curl 或 Python requests 示例代码。 在线工具,curl 转代码在线工具,online

  • Base64 字符串编码/解码

    将字符串编码和解码为其 Base64 格式表示形式即可。 在线工具,Base64 字符串编码/解码在线工具,online

  • Base64 文件转换器

    将字符串、文件或图像转换为其 Base64 表示形式。 在线工具,Base64 文件转换器在线工具,online