OpenSandbox Code Interpreter SDK for Python
A Python SDK for executing code in secure, isolated sandboxes. It provides a high-level API for running Python, Java, Go, TypeScript, and other languages safely, with support for code execution contexts.
Prerequisites
This SDK requires a Docker image containing the Code Interpreter runtime environment. You must use the opensandbox/code-interpreter image (or a derivative) which includes pre-installed runtimes for Python, Java, Go, Node.js, etc.
For detailed information about supported languages and versions, refer to the Environment Documentation.
Installation
pip
pip install opensandbox-code-interpreter
uv
uv add opensandbox-code-interpreter
Quick Start
The following example demonstrates how to create a sandbox with a specific runtime configuration and execute a simple script.
import asyncio
from datetime import timedelta
from code_interpreter import CodeInterpreter, SupportedLanguage
from opensandbox import Sandbox
from opensandbox.config import ConnectionConfig
async def main() -> None:
# 1. Configure connection
config = ConnectionConfig(
domain="api.opensandbox.io",
api_key="your-api-key",
request_timeout=timedelta(seconds=60),
)
# 2. Create a Sandbox with the code-interpreter image + runtime versions
sandbox = await Sandbox.create(
"opensandbox/code-interpreter:v1.1.0",
connection_config=config,
entrypoint=["/opt/code-interpreter/code-interpreter.sh"],
env={
"PYTHON_VERSION": "3.11",
"JAVA_VERSION": "17",
"NODE_VERSION": "20",
"GO_VERSION": "1.24",
},
)
# 3. Use async context manager to ensure local resources are cleaned up
async with sandbox:
# 4. Create CodeInterpreter wrapper
interpreter = await CodeInterpreter.create(sandbox=sandbox)
# 5. Create an execution context (Python)
context = await interpreter.codes.create_context(SupportedLanguage.PYTHON)
# 6. Run code
result = await interpreter.codes.run(
"import sys\nprint(sys.version)\nresult = 2 + 2\nresult",
context=context,
)
# Alternatively, you can pass a language directly (recommended: SupportedLanguage.*).
# This uses the default context for that language (state can persist across runs).
# result = await interpreter.codes.run("print('hi')", language=SupportedLanguage.PYTHON)
# 7. Print output
if result.result:
print(result.result[0].text)
# 8. Cleanup remote instance (optional but recommended)
await sandbox.kill()
if __name__ == "__main__":
asyncio.run(main())
Synchronous Quick Start
If you prefer a synchronous API, use SandboxSync + CodeInterpreterSync:
from datetime import timedelta
import httpx
from code_interpreter import CodeInterpreterSync
from opensandbox import SandboxSync
from opensandbox.config import ConnectionConfigSync
config = ConnectionConfigSync(
domain="api.opensandbox.io",
api_key="your-api-key",
request_timeout=timedelta(seconds=60),
transport=httpx.HTTPTransport(limits=httpx.Limits(max_connections=20)),
)
sandbox = SandboxSync.create(
"opensandbox/code-interpreter:v1.1.0",
connection_config=config,
entrypoint=["/opt/code-interpreter/code-interpreter.sh"],
env={"PYTHON_VERSION": "3.11"},
)
with sandbox:
interpreter = CodeInterpreterSync.create(sandbox=sandbox)
result = interpreter.codes.run("result = 2 + 2\nresult")
if result.result:
print(result.result[0].text)
sandbox.kill()
Installing Python packages at runtime
You can install packages directly via sandbox.commands.run(...):
execution = await sandbox.commands.run("pip install pandas numpy")
Runtime Configuration
Docker Image
The Code Interpreter SDK relies on a specialized environment. Ensure your sandbox provider has the opensandbox/code-interpreter image available.
Language Version Selection
You can specify the desired version of a programming language by setting the corresponding environment variable when creating the Sandbox.
| Language | Environment Variable | Example Value | Default (if unset) |
|---|---|---|---|
| Python | PYTHON_VERSION |
3.11 |
Image default |
| Java | JAVA_VERSION |
17 |
Image default |
| Node.js | NODE_VERSION |
20 |
Image default |
| Go | GO_VERSION |
1.24 |
Image default |
Usage Examples
0. Run with language (default language context)
You can pass language directly (recommended: SupportedLanguage.*) and skip create_context. When context.id is omitted, execd will create/reuse a default session for that language, so state can persist across runs:
from code_interpreter import SupportedLanguage
execution = await interpreter.codes.run(
"result = 2 + 2\nresult",
language=SupportedLanguage.PYTHON,
)
assert execution.result and execution.result[0].text == "4"
State persistence example (default Python context):
from code_interpreter import SupportedLanguage
await interpreter.codes.run("x = 42", language=SupportedLanguage.PYTHON)
execution = await interpreter.codes.run("result = x\nresult", language=SupportedLanguage.PYTHON)
assert execution.result and execution.result[0].text == "42"
1. Java Code Execution
from code_interpreter import SupportedLanguage
ctx = await interpreter.codes.create_context(SupportedLanguage.JAVA)
execution = await interpreter.codes.run(
(
'System.out.println("Calculating sum...");\n'
+ "int a = 10;\n"
+ "int b = 20;\n"
+ "int sum = a + b;\n"
+ 'System.out.println("Sum: " + sum);\n'
+ "sum"
),
context=ctx,
)
print(execution.id)
for msg in execution.logs.stdout:
print(msg.text)
2. Python with State Persistence
Variables defined in one execution are available in subsequent executions within the same context.
from code_interpreter import SupportedLanguage
ctx = await interpreter.codes.create_context(SupportedLanguage.PYTHON)
await interpreter.codes.run(
"users = ['Alice', 'Bob', 'Charlie']\nprint(len(users))",
context=ctx,
)
result = await interpreter.codes.run(
"users.append('Dave')\nprint(users)\nresult = users\nresult",
context=ctx,
)
3. Streaming Output Handling
Handle stdout/stderr and execution events in real-time.
from opensandbox.models.execd import ExecutionHandlers
from code_interpreter import SupportedLanguage
async def on_stdout(msg):
print("STDOUT:", msg.text)
async def on_stderr(msg):
print("STDERR:", msg.text)
handlers = ExecutionHandlers(on_stdout=on_stdout, on_stderr=on_stderr)
ctx = await interpreter.codes.create_context(SupportedLanguage.PYTHON)
await interpreter.codes.run(
"import time\nfor i in range(5):\n print(i)\n time.sleep(0.5)",
context=ctx,
handlers=handlers,
)
4. Multi-Language Context Isolation
Different languages run in isolated environments.
from code_interpreter import SupportedLanguage
py_ctx = await interpreter.codes.create_context(SupportedLanguage.PYTHON)
go_ctx = await interpreter.codes.create_context(SupportedLanguage.GO)
await interpreter.codes.run("print('Running in Python')", context=py_ctx)
await interpreter.codes.run(
"package main\nfunc main() { println(\"Running in Go\") }",
context=go_ctx,
)
Notes
- Lifecycle:
CodeInterpreterwraps an existingSandboxinstance and reuses its connection configuration. - Asyncio/event loop: avoid sharing long-lived clients across multiple event loops (e.g. pytest-asyncio defaults).
Metadata
Release files for opensandbox-code-interpreter 1.2.0
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | Provenance | Actions |
|---|---|---|---|---|
| opensandbox_code_interpreter-1.2.0.tar.gz | 28.8 kB | Without provenance | Details for opensandbox_code_interpreter-1.2.0.tar.gz |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Actions Reset |
|---|---|---|---|---|
| opensandbox_code_interpreter-1.2.0-py3-none-any.whl | Python 3 | none | any | Details for opensandbox_code_interpreter-1.2.0-py3-none-any.whl |
Total release size: 73.4 kB
Release files / opensandbox_code_interpreter-1.2.0.tar.gz
| Download URL | opensandbox_code_interpreter-1.2.0.tar.gz |
|---|---|
| Size | 28.8 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
d130441c46ecb38d2325adf20af857e2c676e67aa55b9d8da16f63986d61b729
|
|
BLAKE2b-256 checksum How to use checksums |
6bd3594ee8deea6e6471b11e7d57098ed6655acac41c86f351754500519e9cf6
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
uv/0.13.6 {"installer":{"name":"uv","version":"0.13.6","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Ubuntu","version":"24.04","id":"noble","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":true}
|
Release files / opensandbox_code_interpreter-1.2.0-py3-none-any.whl
| Download URL | opensandbox_code_interpreter-1.2.0-py3-none-any.whl |
|---|---|
| Size | 44.6 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
552d6e673d608bd8c623d6caacfef7f17a809e8f525d981abbc4595b1f7f0f4c
|
|
BLAKE2b-256 checksum How to use checksums |
28b55ac7a24bf99661d96ec7a9066a487ef709f978eee2f358f50208e89253f0
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
uv/0.13.6 {"installer":{"name":"uv","version":"0.13.6","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Ubuntu","version":"24.04","id":"noble","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":true}
|
Security for opensandbox-code-interpreter 1.2.0
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
No provenance found
None of the files in this release were uploaded with provenance metadata.
A note on package security
PyPI is a repository for distributing packages, not a service for auditing them. While third-party security researchers and our staff do their best to detect and remove malicious packages, PyPI cannot guarantee the quality, security or suitability of any given package.
To learn more about protecting yourself from malicious actors, visit our package security documentation.