# Scalebox Python SDK
[](https://github.com/scalebox-dev/scalebox-sdk-python/actions/workflows/ci.yml)
[](https://www.python.org/downloads/)
[](https://opensource.org/licenses/MIT)
[](https://pypi.org/project/scalebox-sdk/)
[](https://pypi.org/project/scalebox-sdk/)
[](https://github.com/psf/black)
[](https://mypy.readthedocs.io/)
[](https://flake8.pycqa.org/)
[](https://pycqa.github.io/isort/)
[](https://github.com/scalebox-dev/scalebox-sdk-python)
一个用于在可控沙箱中执行多语言代码的 Python SDK,支持同步与异步模式,以及多语言 Kernel(Python、R、Node.js、Deno/TypeScript、Java/IJAVA、Bash)。已提供全面的真实环境测试用例与脚本。
## 功能特性
- 多语言内核:Python、R、Node.js、Deno/TypeScript、Java/IJAVA、Bash
- 同步 `Sandbox` 与异步 `AsyncSandbox` 执行
- 持久上下文:跨多次执行保留变量/状态
- 回调订阅:stdout、stderr、结果与错误
- 丰富结果格式:text、html、markdown、svg、png、jpeg、pdf、latex、json、javascript、chart、data 等
- 真实环境测试:覆盖同步/异步与多语言示例
## 环境要求
- Python 3.12+
- 可访问的 Scalebox 环境或本地服务
## 安装
```bash
# 克隆项目
git clone https://github.com/scalebox-dev/scalebox-sdk-python.git
cd scalebox-sdk-python
# 建议使用虚拟环境
python3 -m venv venv
source venv/bin/activate
# 安装依赖
pip install -r scalebox/requirements.txt
```
如果你以源码方式直接使用包(非 pip 安装),请将 `scalebox` 目录加入 Python 路径或复制到 venv 的 site-packages:
```bash
cp -r scalebox venv/lib/python3.12/site-packages/
```
## 配置
支持从环境变量或 `.env` 文件读取凭据:
- `SBX_API_KEY` 或 `E2B_API_KEY`
示例:
```env
# .env
SBX_API_KEY=***
```
或:
```bash
export SBX_API_KEY=***
```
可选:使用 `python-dotenv` 自动加载 `.env`:
```bash
pip install python-dotenv
```
## 快速开始(同步)
```python
from dotenv import load_dotenv; load_dotenv()
from scalebox.code_interpreter import Sandbox
sandbox = Sandbox.create() # 默认生存期 5 分钟
execution = sandbox.run_code("print('hello world')", language="python")
print(execution.logs.stdout)
files = sandbox.files.list("/")
print(files)
```
## 快速开始(异步)
```python
import asyncio
from dotenv import load_dotenv; load_dotenv()
from scalebox.code_interpreter import AsyncSandbox
async def main():
sandbox = await AsyncSandbox.create()
exec_ = await sandbox.run_code("print('async hello')", language="python")
print(exec_.logs.stdout)
asyncio.run(main())
```
## 多语言示例
- Python:`language="python"`
- R:`language="r"`
- Node.js:`language="nodejs"`
- Deno/TypeScript:`language="typescript"`
- Java(IJAVA/纯Java):`language="ijava"` 或 `language="java"`
- Bash:`language="bash"`
示例(Node.js):
```python
from scalebox.code_interpreter import Sandbox
sbx = Sandbox.create()
code = """
console.log("Hello from Node.js!");
const x = 1 + 2; console.log(`x=${x}`);
"""
result = sbx.run_code(code, language="nodejs")
print(result.logs.stdout)
```
示例(R):
```python
from scalebox.code_interpreter import Sandbox
sbx = Sandbox.create()
code = """
print("Hello from R!")
x <- mean(c(1,2,3,4,5))
print(paste("mean:", x))
"""
res = sbx.run_code(code, language="r")
print(res.logs.stdout)
```
示例(Deno/TypeScript):
```python
from scalebox.code_interpreter import Sandbox
sbx = Sandbox.create()
ts = """
console.log("Hello from Deno/TypeScript!")
const nums: number[] = [1,2,3]
console.log(nums.reduce((a,b)=>a+b, 0))
"""
res = sbx.run_code(ts, language="typescript")
print(res.logs.stdout)
```
示例(Java/IJAVA):
```python
from scalebox.code_interpreter import Sandbox
sbx = Sandbox.create()
code = """
System.out.println("Hello from IJAVA!");
int a = 10, b = 20; System.out.println(a + b);
"""
res = sbx.run_code(code, language="java")
print(res.logs.stdout)
```
示例(Bash):
```python
from scalebox.code_interpreter import Sandbox
sbx = Sandbox.create()
res = sbx.run_code("echo 'Hello from Bash'", language="bash")
print(res.logs.stdout)
```
## 上下文管理(Context)
上下文允许跨多次执行复用变量/状态:
```python
from scalebox.code_interpreter import Sandbox
sbx = Sandbox.create()
ctx = sbx.create_code_context(language="python", cwd="/tmp")
sbx.run_code("counter = 0", context=ctx)
sbx.run_code("counter += 1; print(counter)", context=ctx)
# 使用完必须清理
sbx.destroy_context(ctx)
```
异步 API:
```python
from scalebox.code_interpreter import AsyncSandbox
async def demo():
sbx = await AsyncSandbox.create()
ctx = await sbx.create_code_context(language="python", cwd="/tmp")
await sbx.run_code("counter = 0", context=ctx)
await sbx.run_code("counter += 1; print(counter)", context=ctx)
await sbx.destroy_context(ctx)
```
## 回调(可选)
```python
from scalebox.code_interpreter import Sandbox
from scalebox.code_interpreter import OutputMessage, Result, ExecutionError
sbx = Sandbox.create()
def on_stdout(msg: OutputMessage):
print("STDOUT:", msg.content)
def on_stderr(msg: OutputMessage):
print("STDERR:", msg.content)
def on_result(res: Result):
print("RESULT formats:", list(res.formats()))
def on_error(err: ExecutionError):
print("ERROR:", err.name, err.value)
sbx.run_code(
"print('with callbacks')",
language="python",
on_stdout=on_stdout,
on_stderr=on_stderr,
on_result=on_result,
on_error=on_error,
)
```
## 结果格式(Result)
`Result` 可能包含如下数据字段:
- `text`, `html`, `markdown`, `svg`, `png`, `jpeg`, `pdf`, `latex`
- `json_data`, `javascript`, `data`, `chart`
- `execution_count`, `is_main_result`, `extra`
可以通过 `list(result.formats())` 查看可用格式。
## 运行测试
项目 `test/` 目录包含全面的真实环境用例(非 unittest,直接脚本风格),覆盖:
- 同步与异步综合用例
- 多语言内核(Python、R、Node.js、Deno/TypeScript、Java/IJAVA、Bash)
- 上下文管理、回调与结果格式
运行语法检查:
```bash
cd test
python3 -m py_compile test_code_interpreter_sync_comprehensive.py
python3 -m py_compile test_code_interpreter_async_comprehensive.py
```
建议在虚拟环境中准备依赖并按需安装语言运行时(如 R、Node、Deno、JDK/IJAVA 等),确保各内核能够被后端执行。
## 版本管理(Version Management)
本项目使用自动化版本管理,支持语义化版本控制(Semantic Versioning)。
### 🚀 自动版本升级
使用内置脚本进行版本升级:
```bash
# 升级补丁版本 (0.1.1 -> 0.1.2)
python scripts/bump_version.py patch
# 升级次要版本 (0.1.1 -> 0.2.0)
python scripts/bump_version.py minor
# 升级主要版本 (0.1.1 -> 1.0.0)
python scripts/bump_version.py major
```
### 📦 自动发布流程
#### 🚀 方法1:GitHub Actions 一键升级(推荐)
1. **进入 GitHub Actions 页面**
2. **选择 "CI/CD Pipeline" workflow**
3. **点击 "Run workflow" 按钮**
4. **选择版本类型**:
- `patch`: 补丁版本 (0.1.1 → 0.1.2)
- `minor`: 次要版本 (0.1.1 → 0.2.0)
- `major`: 主要版本 (0.1.1 → 1.0.0)
5. **选择自动提交选项**
6. **点击运行** - 系统会自动完成所有步骤!
#### 🔧 方法2:本地脚本升级
1. **版本升级**:使用 `bump_version.py` 脚本
2. **GitHub Actions**:自动构建和发布到PyPI
3. **触发条件**:
- 推送到 `main` 分支
- 创建 `v*` 标签(如 `v0.1.2`)
### 🔧 版本文件同步
脚本会自动更新以下文件中的版本:
- `scalebox/__init__.py`
- `scalebox/version.py`
- `pyproject.toml`
- `CHANGELOG.md`(可选)
### 📋 发布步骤
```bash
# 1. 升级版本
python scripts/bump_version.py patch
# 2. 检查更改
git diff
# 3. 提交更改
git add .
git commit -m "Bump version to 0.1.2"
# 4. 推送并创建标签
git push origin main
git push origin --tags
# 5. GitHub Actions 会自动发布到 PyPI
```
### 🏷️ 版本规则
- **MAJOR**:不兼容的API更改
- **MINOR**:向后兼容的功能添加
- **PATCH**:向后兼容的错误修复
## 常见问题(Troubleshooting)
- Import/依赖错误:请确认已激活 venv 并正确安装 `scalebox/requirements.txt` 所需依赖
- `ModuleNotFoundError`:在测试脚本中添加项目根路径到 `sys.path`,或从项目根目录运行
- 外部内核不可用:确保环境已安装对应语言运行时(R/Node/Deno/JDK)与后端已启用该内核
- 超时/网络:检查网络与后端服务可达性,必要时增大 `timeout`/`request_timeout`
## 许可证
本项目遵循项目仓库所附许可证(LICENSE)条款。
Raw data
{
"_id": null,
"home_page": null,
"name": "scalebox-sdk",
"maintainer": null,
"docs_url": null,
"requires_python": ">=3.10",
"maintainer_email": "ScaleBox Team <dev@scalebox.dev>",
"keywords": "sandbox, code-execution, multi-language, python, r, nodejs, typescript, java, bash",
"author": null,
"author_email": "ScaleBox Team <dev@scalebox.dev>",
"download_url": "https://files.pythonhosted.org/packages/e7/9d/3b1632131586ce16c3fa2b08c5837b085c459a4b4c63316a5891c87775e5/scalebox_sdk-0.1.11.tar.gz",
"platform": null,
"description": "# Scalebox Python SDK\n\n[](https://github.com/scalebox-dev/scalebox-sdk-python/actions/workflows/ci.yml)\n[](https://www.python.org/downloads/)\n[](https://opensource.org/licenses/MIT)\n[](https://pypi.org/project/scalebox-sdk/)\n[](https://pypi.org/project/scalebox-sdk/)\n[](https://github.com/psf/black)\n[](https://mypy.readthedocs.io/)\n[](https://flake8.pycqa.org/)\n[](https://pycqa.github.io/isort/)\n[](https://github.com/scalebox-dev/scalebox-sdk-python)\n\n\u4e00\u4e2a\u7528\u4e8e\u5728\u53ef\u63a7\u6c99\u7bb1\u4e2d\u6267\u884c\u591a\u8bed\u8a00\u4ee3\u7801\u7684 Python SDK\uff0c\u652f\u6301\u540c\u6b65\u4e0e\u5f02\u6b65\u6a21\u5f0f\uff0c\u4ee5\u53ca\u591a\u8bed\u8a00 Kernel\uff08Python\u3001R\u3001Node.js\u3001Deno/TypeScript\u3001Java/IJAVA\u3001Bash\uff09\u3002\u5df2\u63d0\u4f9b\u5168\u9762\u7684\u771f\u5b9e\u73af\u5883\u6d4b\u8bd5\u7528\u4f8b\u4e0e\u811a\u672c\u3002\n\n## \u529f\u80fd\u7279\u6027\n- \u591a\u8bed\u8a00\u5185\u6838\uff1aPython\u3001R\u3001Node.js\u3001Deno/TypeScript\u3001Java/IJAVA\u3001Bash\n- \u540c\u6b65 `Sandbox` \u4e0e\u5f02\u6b65 `AsyncSandbox` \u6267\u884c\n- \u6301\u4e45\u4e0a\u4e0b\u6587\uff1a\u8de8\u591a\u6b21\u6267\u884c\u4fdd\u7559\u53d8\u91cf/\u72b6\u6001\n- \u56de\u8c03\u8ba2\u9605\uff1astdout\u3001stderr\u3001\u7ed3\u679c\u4e0e\u9519\u8bef\n- \u4e30\u5bcc\u7ed3\u679c\u683c\u5f0f\uff1atext\u3001html\u3001markdown\u3001svg\u3001png\u3001jpeg\u3001pdf\u3001latex\u3001json\u3001javascript\u3001chart\u3001data \u7b49\n- \u771f\u5b9e\u73af\u5883\u6d4b\u8bd5\uff1a\u8986\u76d6\u540c\u6b65/\u5f02\u6b65\u4e0e\u591a\u8bed\u8a00\u793a\u4f8b\n\n## \u73af\u5883\u8981\u6c42\n- Python 3.12+\n- \u53ef\u8bbf\u95ee\u7684 Scalebox \u73af\u5883\u6216\u672c\u5730\u670d\u52a1\n\n## \u5b89\u88c5\n\n```bash\n# \u514b\u9686\u9879\u76ee\ngit clone https://github.com/scalebox-dev/scalebox-sdk-python.git\ncd scalebox-sdk-python\n\n# \u5efa\u8bae\u4f7f\u7528\u865a\u62df\u73af\u5883\npython3 -m venv venv\nsource venv/bin/activate\n\n# \u5b89\u88c5\u4f9d\u8d56\npip install -r scalebox/requirements.txt\n```\n\n\u5982\u679c\u4f60\u4ee5\u6e90\u7801\u65b9\u5f0f\u76f4\u63a5\u4f7f\u7528\u5305\uff08\u975e pip \u5b89\u88c5\uff09\uff0c\u8bf7\u5c06 `scalebox` \u76ee\u5f55\u52a0\u5165 Python \u8def\u5f84\u6216\u590d\u5236\u5230 venv \u7684 site-packages\uff1a\n```bash\ncp -r scalebox venv/lib/python3.12/site-packages/\n```\n\n## \u914d\u7f6e\n\u652f\u6301\u4ece\u73af\u5883\u53d8\u91cf\u6216 `.env` \u6587\u4ef6\u8bfb\u53d6\u51ed\u636e\uff1a\n\n- `SBX_API_KEY` \u6216 `E2B_API_KEY`\n\n\u793a\u4f8b\uff1a\n```env\n# .env\nSBX_API_KEY=***\n```\n\u6216\uff1a\n```bash\nexport SBX_API_KEY=***\n```\n\n\u53ef\u9009\uff1a\u4f7f\u7528 `python-dotenv` \u81ea\u52a8\u52a0\u8f7d `.env`\uff1a\n```bash\npip install python-dotenv\n```\n\n## \u5feb\u901f\u5f00\u59cb\uff08\u540c\u6b65\uff09\n```python\nfrom dotenv import load_dotenv; load_dotenv()\nfrom scalebox.code_interpreter import Sandbox\n\nsandbox = Sandbox.create() # \u9ed8\u8ba4\u751f\u5b58\u671f 5 \u5206\u949f\nexecution = sandbox.run_code(\"print('hello world')\", language=\"python\")\nprint(execution.logs.stdout)\n\nfiles = sandbox.files.list(\"/\")\nprint(files)\n```\n\n## \u5feb\u901f\u5f00\u59cb\uff08\u5f02\u6b65\uff09\n```python\nimport asyncio\nfrom dotenv import load_dotenv; load_dotenv()\nfrom scalebox.code_interpreter import AsyncSandbox\n\nasync def main():\n sandbox = await AsyncSandbox.create()\n exec_ = await sandbox.run_code(\"print('async hello')\", language=\"python\")\n print(exec_.logs.stdout)\n\nasyncio.run(main())\n```\n\n## \u591a\u8bed\u8a00\u793a\u4f8b\n- Python\uff1a`language=\"python\"`\n- R\uff1a`language=\"r\"`\n- Node.js\uff1a`language=\"nodejs\"`\n- Deno/TypeScript\uff1a`language=\"typescript\"`\n- Java\uff08IJAVA/\u7eafJava\uff09\uff1a`language=\"ijava\"` \u6216 `language=\"java\"`\n- Bash\uff1a`language=\"bash\"`\n\n\u793a\u4f8b\uff08Node.js\uff09\uff1a\n```python\nfrom scalebox.code_interpreter import Sandbox\nsbx = Sandbox.create()\ncode = \"\"\"\nconsole.log(\"Hello from Node.js!\");\nconst x = 1 + 2; console.log(`x=${x}`);\n\"\"\"\nresult = sbx.run_code(code, language=\"nodejs\")\nprint(result.logs.stdout)\n```\n\n\u793a\u4f8b\uff08R\uff09\uff1a\n```python\nfrom scalebox.code_interpreter import Sandbox\nsbx = Sandbox.create()\ncode = \"\"\"\nprint(\"Hello from R!\")\nx <- mean(c(1,2,3,4,5))\nprint(paste(\"mean:\", x))\n\"\"\"\nres = sbx.run_code(code, language=\"r\")\nprint(res.logs.stdout)\n```\n\n\u793a\u4f8b\uff08Deno/TypeScript\uff09\uff1a\n```python\nfrom scalebox.code_interpreter import Sandbox\nsbx = Sandbox.create()\nts = \"\"\"\nconsole.log(\"Hello from Deno/TypeScript!\")\nconst nums: number[] = [1,2,3]\nconsole.log(nums.reduce((a,b)=>a+b, 0))\n\"\"\"\nres = sbx.run_code(ts, language=\"typescript\")\nprint(res.logs.stdout)\n```\n\n\u793a\u4f8b\uff08Java/IJAVA\uff09\uff1a\n```python\nfrom scalebox.code_interpreter import Sandbox\nsbx = Sandbox.create()\ncode = \"\"\"\nSystem.out.println(\"Hello from IJAVA!\");\nint a = 10, b = 20; System.out.println(a + b);\n\"\"\"\nres = sbx.run_code(code, language=\"java\")\nprint(res.logs.stdout)\n```\n\n\u793a\u4f8b\uff08Bash\uff09\uff1a\n```python\nfrom scalebox.code_interpreter import Sandbox\nsbx = Sandbox.create()\nres = sbx.run_code(\"echo 'Hello from Bash'\", language=\"bash\")\nprint(res.logs.stdout)\n```\n\n## \u4e0a\u4e0b\u6587\u7ba1\u7406\uff08Context\uff09\n\u4e0a\u4e0b\u6587\u5141\u8bb8\u8de8\u591a\u6b21\u6267\u884c\u590d\u7528\u53d8\u91cf/\u72b6\u6001\uff1a\n```python\nfrom scalebox.code_interpreter import Sandbox\nsbx = Sandbox.create()\nctx = sbx.create_code_context(language=\"python\", cwd=\"/tmp\")\n\nsbx.run_code(\"counter = 0\", context=ctx)\nsbx.run_code(\"counter += 1; print(counter)\", context=ctx)\n# \u4f7f\u7528\u5b8c\u5fc5\u987b\u6e05\u7406\nsbx.destroy_context(ctx)\n```\n\u5f02\u6b65 API\uff1a\n```python\nfrom scalebox.code_interpreter import AsyncSandbox\n\nasync def demo():\n sbx = await AsyncSandbox.create()\n ctx = await sbx.create_code_context(language=\"python\", cwd=\"/tmp\")\n await sbx.run_code(\"counter = 0\", context=ctx)\n await sbx.run_code(\"counter += 1; print(counter)\", context=ctx)\n await sbx.destroy_context(ctx)\n```\n\n## \u56de\u8c03\uff08\u53ef\u9009\uff09\n```python\nfrom scalebox.code_interpreter import Sandbox\nfrom scalebox.code_interpreter import OutputMessage, Result, ExecutionError\n\nsbx = Sandbox.create()\n\ndef on_stdout(msg: OutputMessage):\n print(\"STDOUT:\", msg.content)\n\ndef on_stderr(msg: OutputMessage):\n print(\"STDERR:\", msg.content)\n\ndef on_result(res: Result):\n print(\"RESULT formats:\", list(res.formats()))\n\ndef on_error(err: ExecutionError):\n print(\"ERROR:\", err.name, err.value)\n\nsbx.run_code(\n \"print('with callbacks')\",\n language=\"python\",\n on_stdout=on_stdout,\n on_stderr=on_stderr,\n on_result=on_result,\n on_error=on_error,\n)\n```\n\n## \u7ed3\u679c\u683c\u5f0f\uff08Result\uff09\n`Result` \u53ef\u80fd\u5305\u542b\u5982\u4e0b\u6570\u636e\u5b57\u6bb5\uff1a\n- `text`, `html`, `markdown`, `svg`, `png`, `jpeg`, `pdf`, `latex`\n- `json_data`, `javascript`, `data`, `chart`\n- `execution_count`, `is_main_result`, `extra`\n\n\u53ef\u4ee5\u901a\u8fc7 `list(result.formats())` \u67e5\u770b\u53ef\u7528\u683c\u5f0f\u3002\n\n## \u8fd0\u884c\u6d4b\u8bd5\n\u9879\u76ee `test/` \u76ee\u5f55\u5305\u542b\u5168\u9762\u7684\u771f\u5b9e\u73af\u5883\u7528\u4f8b\uff08\u975e unittest\uff0c\u76f4\u63a5\u811a\u672c\u98ce\u683c\uff09\uff0c\u8986\u76d6\uff1a\n- \u540c\u6b65\u4e0e\u5f02\u6b65\u7efc\u5408\u7528\u4f8b\n- \u591a\u8bed\u8a00\u5185\u6838\uff08Python\u3001R\u3001Node.js\u3001Deno/TypeScript\u3001Java/IJAVA\u3001Bash\uff09\n- \u4e0a\u4e0b\u6587\u7ba1\u7406\u3001\u56de\u8c03\u4e0e\u7ed3\u679c\u683c\u5f0f\n\n\u8fd0\u884c\u8bed\u6cd5\u68c0\u67e5\uff1a\n```bash\ncd test\npython3 -m py_compile test_code_interpreter_sync_comprehensive.py\npython3 -m py_compile test_code_interpreter_async_comprehensive.py\n```\n\n\u5efa\u8bae\u5728\u865a\u62df\u73af\u5883\u4e2d\u51c6\u5907\u4f9d\u8d56\u5e76\u6309\u9700\u5b89\u88c5\u8bed\u8a00\u8fd0\u884c\u65f6\uff08\u5982 R\u3001Node\u3001Deno\u3001JDK/IJAVA \u7b49\uff09\uff0c\u786e\u4fdd\u5404\u5185\u6838\u80fd\u591f\u88ab\u540e\u7aef\u6267\u884c\u3002\n\n## \u7248\u672c\u7ba1\u7406\uff08Version Management\uff09\n\n\u672c\u9879\u76ee\u4f7f\u7528\u81ea\u52a8\u5316\u7248\u672c\u7ba1\u7406\uff0c\u652f\u6301\u8bed\u4e49\u5316\u7248\u672c\u63a7\u5236\uff08Semantic Versioning\uff09\u3002\n\n### \ud83d\ude80 \u81ea\u52a8\u7248\u672c\u5347\u7ea7\n\n\u4f7f\u7528\u5185\u7f6e\u811a\u672c\u8fdb\u884c\u7248\u672c\u5347\u7ea7\uff1a\n\n```bash\n# \u5347\u7ea7\u8865\u4e01\u7248\u672c (0.1.1 -> 0.1.2)\npython scripts/bump_version.py patch\n\n# \u5347\u7ea7\u6b21\u8981\u7248\u672c (0.1.1 -> 0.2.0)\npython scripts/bump_version.py minor\n\n# \u5347\u7ea7\u4e3b\u8981\u7248\u672c (0.1.1 -> 1.0.0)\npython scripts/bump_version.py major\n```\n\n### \ud83d\udce6 \u81ea\u52a8\u53d1\u5e03\u6d41\u7a0b\n\n#### \ud83d\ude80 \u65b9\u6cd51\uff1aGitHub Actions \u4e00\u952e\u5347\u7ea7\uff08\u63a8\u8350\uff09\n\n1. **\u8fdb\u5165 GitHub Actions \u9875\u9762**\n2. **\u9009\u62e9 \"CI/CD Pipeline\" workflow**\n3. **\u70b9\u51fb \"Run workflow\" \u6309\u94ae**\n4. **\u9009\u62e9\u7248\u672c\u7c7b\u578b**\uff1a\n - `patch`: \u8865\u4e01\u7248\u672c (0.1.1 \u2192 0.1.2)\n - `minor`: \u6b21\u8981\u7248\u672c (0.1.1 \u2192 0.2.0) \n - `major`: \u4e3b\u8981\u7248\u672c (0.1.1 \u2192 1.0.0)\n5. **\u9009\u62e9\u81ea\u52a8\u63d0\u4ea4\u9009\u9879**\n6. **\u70b9\u51fb\u8fd0\u884c** - \u7cfb\u7edf\u4f1a\u81ea\u52a8\u5b8c\u6210\u6240\u6709\u6b65\u9aa4\uff01\n\n#### \ud83d\udd27 \u65b9\u6cd52\uff1a\u672c\u5730\u811a\u672c\u5347\u7ea7\n\n1. **\u7248\u672c\u5347\u7ea7**\uff1a\u4f7f\u7528 `bump_version.py` \u811a\u672c\n2. **GitHub Actions**\uff1a\u81ea\u52a8\u6784\u5efa\u548c\u53d1\u5e03\u5230PyPI\n3. **\u89e6\u53d1\u6761\u4ef6**\uff1a\n - \u63a8\u9001\u5230 `main` \u5206\u652f\n - \u521b\u5efa `v*` \u6807\u7b7e\uff08\u5982 `v0.1.2`\uff09\n\n### \ud83d\udd27 \u7248\u672c\u6587\u4ef6\u540c\u6b65\n\n\u811a\u672c\u4f1a\u81ea\u52a8\u66f4\u65b0\u4ee5\u4e0b\u6587\u4ef6\u4e2d\u7684\u7248\u672c\uff1a\n- `scalebox/__init__.py`\n- `scalebox/version.py`\n- `pyproject.toml`\n- `CHANGELOG.md`\uff08\u53ef\u9009\uff09\n\n### \ud83d\udccb \u53d1\u5e03\u6b65\u9aa4\n\n```bash\n# 1. \u5347\u7ea7\u7248\u672c\npython scripts/bump_version.py patch\n\n# 2. \u68c0\u67e5\u66f4\u6539\ngit diff\n\n# 3. \u63d0\u4ea4\u66f4\u6539\ngit add .\ngit commit -m \"Bump version to 0.1.2\"\n\n# 4. \u63a8\u9001\u5e76\u521b\u5efa\u6807\u7b7e\ngit push origin main\ngit push origin --tags\n\n# 5. GitHub Actions \u4f1a\u81ea\u52a8\u53d1\u5e03\u5230 PyPI\n```\n\n### \ud83c\udff7\ufe0f \u7248\u672c\u89c4\u5219\n\n- **MAJOR**\uff1a\u4e0d\u517c\u5bb9\u7684API\u66f4\u6539\n- **MINOR**\uff1a\u5411\u540e\u517c\u5bb9\u7684\u529f\u80fd\u6dfb\u52a0\n- **PATCH**\uff1a\u5411\u540e\u517c\u5bb9\u7684\u9519\u8bef\u4fee\u590d\n\n## \u5e38\u89c1\u95ee\u9898\uff08Troubleshooting\uff09\n- Import/\u4f9d\u8d56\u9519\u8bef\uff1a\u8bf7\u786e\u8ba4\u5df2\u6fc0\u6d3b venv \u5e76\u6b63\u786e\u5b89\u88c5 `scalebox/requirements.txt` \u6240\u9700\u4f9d\u8d56\n- `ModuleNotFoundError`\uff1a\u5728\u6d4b\u8bd5\u811a\u672c\u4e2d\u6dfb\u52a0\u9879\u76ee\u6839\u8def\u5f84\u5230 `sys.path`\uff0c\u6216\u4ece\u9879\u76ee\u6839\u76ee\u5f55\u8fd0\u884c\n- \u5916\u90e8\u5185\u6838\u4e0d\u53ef\u7528\uff1a\u786e\u4fdd\u73af\u5883\u5df2\u5b89\u88c5\u5bf9\u5e94\u8bed\u8a00\u8fd0\u884c\u65f6\uff08R/Node/Deno/JDK\uff09\u4e0e\u540e\u7aef\u5df2\u542f\u7528\u8be5\u5185\u6838\n- \u8d85\u65f6/\u7f51\u7edc\uff1a\u68c0\u67e5\u7f51\u7edc\u4e0e\u540e\u7aef\u670d\u52a1\u53ef\u8fbe\u6027\uff0c\u5fc5\u8981\u65f6\u589e\u5927 `timeout`/`request_timeout`\n\n## \u8bb8\u53ef\u8bc1\n\u672c\u9879\u76ee\u9075\u5faa\u9879\u76ee\u4ed3\u5e93\u6240\u9644\u8bb8\u53ef\u8bc1\uff08LICENSE\uff09\u6761\u6b3e\u3002\n",
"bugtrack_url": null,
"license": "MIT",
"summary": "ScaleBox Python SDK - A multi-language code execution sandbox with Python, R, Node.js, Deno/TypeScript, Java, and Bash support",
"version": "0.1.11",
"project_urls": {
"Changelog": "https://github.com/scalebox-dev/scalebox-sdk-python/blob/main/CHANGELOG.md",
"Documentation": "https://docs.scalebox.dev/python-sdk",
"Homepage": "https://github.com/scalebox-dev/scalebox-sdk-python",
"Issues": "https://github.com/scalebox-dev/scalebox-sdk-python/issues",
"Repository": "https://github.com/scalebox-dev/scalebox-sdk-python"
},
"split_keywords": [
"sandbox",
" code-execution",
" multi-language",
" python",
" r",
" nodejs",
" typescript",
" java",
" bash"
],
"urls": [
{
"comment_text": null,
"digests": {
"blake2b_256": "e1225836451fc21cf25d8a197cbb59abf28547c9a419f8982ffc4fc8bf702564",
"md5": "44ef4a268a20b2f9c21f931d51b9c74d",
"sha256": "eebcdb82b07e219f1a2b856f539f8886c5673f65caaaa7fe078f75ff774afa2f"
},
"downloads": -1,
"filename": "scalebox_sdk-0.1.11-py3-none-any.whl",
"has_sig": false,
"md5_digest": "44ef4a268a20b2f9c21f931d51b9c74d",
"packagetype": "bdist_wheel",
"python_version": "py3",
"requires_python": ">=3.10",
"size": 305159,
"upload_time": "2025-10-11T06:01:12",
"upload_time_iso_8601": "2025-10-11T06:01:12.586438Z",
"url": "https://files.pythonhosted.org/packages/e1/22/5836451fc21cf25d8a197cbb59abf28547c9a419f8982ffc4fc8bf702564/scalebox_sdk-0.1.11-py3-none-any.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": null,
"digests": {
"blake2b_256": "e79d3b1632131586ce16c3fa2b08c5837b085c459a4b4c63316a5891c87775e5",
"md5": "d31b5e742a035f04cff168d65876eb46",
"sha256": "50623f46d423349a706fc42c82342dd0eb63d37a78a05f70946ac8ff40481f45"
},
"downloads": -1,
"filename": "scalebox_sdk-0.1.11.tar.gz",
"has_sig": false,
"md5_digest": "d31b5e742a035f04cff168d65876eb46",
"packagetype": "sdist",
"python_version": "source",
"requires_python": ">=3.10",
"size": 234526,
"upload_time": "2025-10-11T06:01:14",
"upload_time_iso_8601": "2025-10-11T06:01:14.218301Z",
"url": "https://files.pythonhosted.org/packages/e7/9d/3b1632131586ce16c3fa2b08c5837b085c459a4b4c63316a5891c87775e5/scalebox_sdk-0.1.11.tar.gz",
"yanked": false,
"yanked_reason": null
}
],
"upload_time": "2025-10-11 06:01:14",
"github": true,
"gitlab": false,
"bitbucket": false,
"codeberg": false,
"github_user": "scalebox-dev",
"github_project": "scalebox-sdk-python",
"travis_ci": false,
"coveralls": false,
"github_actions": true,
"lcname": "scalebox-sdk"
}