在编程 / AI 场景中,“沙箱(Sandbox)” 是一个 “隔离、安全的执行环境”(防止危险代码影响主系统)。以 “Python 代码执行沙箱(比如 LangChain Agent 用的代码沙箱)” 为例,构建时通常包含以下核心部分:

1. 隔离环境(核心)

  • 进程 / 容器隔离:用独立进程、Docker 容器等方式,把沙箱和主程序 / 系统隔离开(防止恶意代码篡改主环境);
  • 资源限制:限制沙箱的 CPU、内存、磁盘 IO(防止代码占满资源);
  • 网络隔离(可选):禁止沙箱访问外部网络(防止代码窃取数据 / 发起攻击)。

2. 代码执行器

  • 代码解析 / 验证:检查代码是否包含危险操作(比如os.system()、rm -rf /等恶意命令);
  • 代码执行:安全执行代码的核心逻辑(比如用exec()、subprocess等,但要做安全封装);
  • 输出捕获:用io.StringIO等工具捕获代码的print输出、报错信息(方便返回给 Agent)。

3. 环境初始化

  • 预加载依赖:提前安装沙箱需要的库(比如 Agent 常用的pandas、matplotlib);
  • 初始化上下文:给沙箱传入必要的变量(比如employees_df等数据),但要避免传入敏感数据;
  • 权限控制:限制沙箱能访问的模块 / 函数(比如禁止os、sys等危险模块)。

4. 安全防护

  • 危险代码拦截:用 AST(抽象语法树)分析代码,禁止import os、eval()等危险操作;
  • 超时机制:设置代码执行的超时时间(防止死循环 / 无限等待);
  • 异常捕获:捕获代码执行中的报错(比如语法错误、运行时错误),避免沙箱崩溃。

5. 结果返回

  • 结构化结果:把代码的 “输出内容、执行状态(成功 / 失败)、报错信息” 整理成统一格式;
  • 资源清理:执行完代码后,销毁沙箱进程 / 容器,释放资源。

6.简单示例:简单 Python 沙箱的核心逻辑

python

运行

import io
import sys
import subprocess
import time

def run_sandbox_code(code, timeout=10):
    # 1. 安全检查(示例:禁止危险关键词)
    dangerous_keywords = ["os.", "sys.", "subprocess.", "rm -rf"]
    if any(keyword in code for keyword in dangerous_keywords):
        return {"status": "error", "msg": "代码包含危险操作"}
    
    # 2. 用子进程执行代码(隔离环境)
    try:
        # 子进程执行,捕获输出
        result = subprocess.run(
            [sys.executable, "-c", code],  # 用当前Python解释器执行代码
            capture_output=True,
            text=True,
            timeout=timeout
        )
        # 3. 返回结果
        if result.returncode == 0:
            return {"status": "success", "output": result.stdout}
        else:
            return {"status": "error", "msg": result.stderr}
    except subprocess.TimeoutExpired:
        return {"status": "error", "msg": "代码执行超时"}
## 构建 Python 代码执行沙箱
#环境初始化——预加载依赖
import traceback
from io import StringIO
from contextlib import redirect_stdout
from langchain.tools import tool
#环境初始化——初始化上下文(传入必要的变量:三张表)和权限控制(限制沙箱能访问的模块/函数)
SANDBOX_GLOBALS = {
    # 数据:Agent 可以分析这三张表
    "employees_df": employees_df,
    "products_df":  products_df,
    "orders_df":    orders_df,
    # 工具库:Agent 可以用这些库做分析和画图
    "pd":  pd,
    "plt": plt,
    "sns": sns,
    "np":  np,
}


@tool
def execute_python_code(code: str) -> str:
    """
    执行 Python 代码进行数据分析和可视化。

    可用变量:
        - employees_df: 员工表 DataFrame(字段:id, name, department, salary, hire_date)
        - products_df:  产品表 DataFrame(字段:id, product_name, category, price, stock)
        - orders_df:    订单表 DataFrame(字段:id, employee_id, product_id, quantity, order_date)
        - pd:   pandas 库
        - plt:  matplotlib.pyplot
        - sns:  seaborn
        - np:   numpy

    使用示例:
        # 统计各部门平均薪资
        result = employees_df.groupby('department')['salary'].mean()
        print(result)

        # 画柱状图
        plt.figure(figsize=(10, 6))
        employees_df.groupby('department')['salary'].mean().plot(kind='bar')
        plt.title('各部门平均薪资')
        plt.show()
    """
    #隔离环境——准备隔离的执行环境
    exec_globals = dict(SANDBOX_GLOBALS)
    exec_locals = {}
    #代码执行器——捕获输出
    output_buffer = StringIO()
    
    #代码执行器——代码执行
    try:
        with redirect_stdout(output_buffer):
            exec(code, exec_globals, exec_locals)

        result = output_buffer.getvalue()
        if not result.strip():
            result = "✅ 代码执行成功(无文本输出,可能已生成图表)"
        return f"执行成功:\n{result}"
    #安全防护——异常捕获
    except Exception as e:
        error_detail = traceback.format_exc()
        return f"❌ 执行出错:{e}\n\n{error_detail}"


print("✅ Python 代码执行沙箱创建成功")

总结:沙箱的核心是“隔离 + 安全 + 可控”,既要让代码能正常执行,又要防止它影响外部环境~

Logo

Agent 垂直技术社区,欢迎活跃、内容共建。

更多推荐