跳到主要内容
极客日志极客日志面向AI+效率的开发者社区
首页博客GitHub 精选镜像AI 生图工具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/7/2366 浏览
使用 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. 十三、总结
  • 免费图片AI生成工具免费生成了解详情
  • Magick API 一键接入全球大模型注册送1000万token查看
  • 免费图片视频在线生成30秒,将你的创意变成现实开始设计
  • X/Twitter免费视频下载器免登陆无限额度免费视频解析下载了解详情
  • 100+免费在线小游戏爽一把
极客日志微信公众号二维码

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

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

更多推荐文章

查看全部
  • 大模型服务评测平台 AI Ping 功能与场景实测
  • GPT-4o mini 发布:多模态大模型技术解析与应用实践
  • 使用 Rust 与 GLM-5 构建高性能 AI 翻译 CLI 工具
  • AI 辅助 FPGA 开发实践:Vivado 配置与智能编程
  • 小米 Miloco 分离式部署指南:环境搭建与模型对接
  • 飞凌 OK3588-C 适配 Rockchip Buildroot Linux 6.1 SSH 服务配置
  • AIGC 如何改变金融业?不是所有智能化问题都要用大模型解决
  • VR、具身智能与人形机器人:通往现实世界的智能接口
  • Python 标准库与第三方库实战:日期处理、字符串操作及 Excel 应用
  • Git 基础指令与本地仓库操作指南
  • Git 仓库迁移指南:从 CODING.net 至腾讯云 CNB
  • MySQL 索引原理:B+ 树结构与实战优化
  • 马斯克xAI开源Grok-1:3140亿参数模型架构详解
  • 融合选择性卷积与残差结构的 SKResNet 架构详解
  • Java 设计模式:静态工厂方法详解
  • Python 基础语法完全指南:变量数据类型运算符与字符串
  • 国内用户如何付费升级 GitHub Copilot 专业版
  • GLM-4.7 技术解析:开源模型在编码与推理上的新突破
  • 基于 OpenClaw 快速搭建企业微信 AI 客服
  • Z 字形变换与外观数列算法解析

相关免费在线工具

  • 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