−25%

Windows 按年付费,截至 10 月 31 日。 查看套餐

EQVPS
开始使用

5 分钟上手沙箱 Python SDK:从 pip install eqvps 到第一次运行

安装 EQVPS Python SDK,启动 Firecracker 沙箱,运行代码、安装软件包、传输文件,并在后台运行长任务。六个步骤,命令全部给出,整个过程花费不到 1 美分。

本教程带你从零开始,在 Python 里跑起一个沙箱。你会启动一台隔离的 Firecracker 微虚拟机(microVM),在里面运行代码、安装软件包、把文件传进传出,再在后台跑一个耗时任务。每一步都只是几行可直接粘贴的代码。

你需要 Python 3.8 或更高版本,以及一个 EQVPS 账户。SDK 没有任何依赖。

1. 获取令牌

沙箱从账户余额中扣费,所以 SDK 需要账户令牌。连接账户页面介绍了三种获取方式:控制面板、API 或 MCP 服务器。然后把它写入环境变量:

export EQVPS_API_KEY="your-token"

还没有余额?没关系。新账户第一次在余额不足时创建沙箱,会获得 1 美元沙箱额度,有效期 14 天。

2. 安装 SDK

pip install eqvps

3. 启动沙箱并运行代码

把下面的内容保存为 hello.py 并运行:

from eqvps import Sandbox

with Sandbox.create(tariff="small") as sb:
    print(sb.id)
    r = sb.run("import platform; print(platform.python_version())")
    print(r.exit_code, r.stdout)

你会看到沙箱 id(sb_ 加 24 个字符),然后是 0 3.12.x。沙箱大约 1 秒就启动了,执行完代码,在 with 代码块结束时被删除。

关于返回结果,有几点值得了解:

  • 退出码为 0 且命令没有超时,r.ok 才为 true;
  • 非零退出码不是异常,需要自己检查 r.ok;
  • stdout 和 stderr 各自上限 1 MiB,输出被截断时 r.truncated 会告诉你。

4. 安装软件包并运行 shell 命令

在沙箱里,你是一个小型 Linux 系统的 root,系统自带 Python、Node.js、git 和 curl。exec 可以运行任何 shell 命令:

from eqvps import Sandbox

with Sandbox.create(tariff="small") as sb:
    sb.exec("pip install --quiet requests", timeout=55)
    r = sb.run("import requests; print(requests.get('https://example.com').status_code)")
    print(r.stdout)   # 200

默认超时是 30 秒,一次同步调用最多 55 秒。大型安装应放到后台任务里(第 6 步)。

5. 把文件传进传出

from eqvps import Sandbox

with Sandbox.create() as sb:
    sb.upload("/root/data.csv", "a,b\n1,2\n3,4\n")
    sb.run("""
import csv
rows = list(csv.DictReader(open('/root/data.csv')))
open('/root/sum.txt', 'w').write(str(sum(int(r['b']) for r in rows)))
""")
    print(sb.download_text("/root/sum.txt"))   # 6

路径必须是绝对路径。单次传输上限 5 MB;download 返回字节,download_text 返回字符串。

6. 在后台运行长任务

传入 background=True,你会立刻拿到一个任务对象,不必等待。它没有 55 秒的限制:

from eqvps import Sandbox

with Sandbox.create(tariff="standard") as sb:
    task = sb.exec("for i in 1 2 3 4 5; do echo step $i; sleep 20; done", background=True)
    result = task.wait(on_output=lambda out, err: print(out, end=""))
    print(result.state, result.exit_code)   # done 0

task.wait() 每 2 秒轮询一次,新输出一到就打印出来。你也可以自己调用 task.logs(),或用 task.kill() 停止任务。任务运行期间,沙箱不会因空闲而被删除。

花了多少钱

上面每个 with 代码块只存在了几秒,按最低 60 秒计费。在 small 上每个代码块是 0.00055 美元,五个示例加起来大约三分之一美分。各套餐价格、持久模式和消费上限见沙箱限制与计费。

出错时怎么办

API 错误是可以捕获的异常:

from eqvps import Sandbox, InsufficientBalanceError, RateLimitError

try:
    with Sandbox.create() as sb:
        print(sb.run("print(1)").stdout)
except InsufficientBalanceError:
    print("Top up the balance")
except RateLimitError as e:
    print("Too many at once, retry in", e.retry_after)

当服务器告知需要等待多久时,SDK 已经会自动重试 429 和 503 响应,最多 3 次。全部 11 种错误类型列在 SDK 参考中。

下一步

常见问题

试用需要绑定银行卡吗?

不需要。新账户第一次在余额不足时创建沙箱,会获得 1 美元沙箱额度。整篇教程用掉的远不到 1 美分。之后用加密货币为余额充值即可。

可以在沙箱里用 pip 安装软件包吗?

可以。沙箱可以访问外网,pip 无需 virtualenv 就能装到系统里。torch 这类大包需要更多磁盘和内存,请选择 plus 或更大的套餐。

为什么我的命令 30 秒后就中断了?

run 和 exec 的默认超时是 30 秒,同步调用的上限是 55 秒。更长的任务请用 background=True 运行,它没有这个限制。

脚本崩溃时沙箱会被删除吗?

使用 with 代码块就会:代码块结束时沙箱被删除,抛出异常后也一样。不用的话,临时沙箱会在空闲 5 分钟后删除,这几分钟同样计费。

评论

暂无评论。来做第一个吧。

发表评论

评论在显示前会经过审核。