Execution environments
Project description
Exxec
Basic Usage
Use the get_environment() function to create execution environments:
from exxec import get_environment
# Local execution (same process)
env = get_environment("local")
# Subprocess execution (separate process when executing python code)
env = get_environment("local", isolated=True)
# Docker execution (containerized)
env = get_environment("docker")
# Execute code
async with env:
result = await env.execute("""
async def main():
return "Hello from execution environment!"
""")
print(result.result) # "Hello from execution environment!"
Available Providers
Local Provider
Executes code in the same Python process. Fastest option but offers no isolation.
env = get_environment("local", timeout=30.0)
Parameters:
timeout(float): Execution timeout in seconds (default: 30.0)isolated(bool): Whether to execute code in a separate process (default: False)language(Language): Programming language (default: "python")
Docker Provider
Executes code in Docker containers for strong isolation and reproducible environments.
env = get_environment(
"docker",
image="python:3.13-slim",
timeout=60.0,
language="python"
)
Parameters:
lifespan_handler: Tool server context manager (optional)image(str): Docker image to use (default: "python:3.13-slim")timeout(float): Execution timeout in seconds (default: 60.0)language(Language): Programming language (default: "python")
Daytona Provider
Executes code in remote Daytona sandboxes for cloud-based development environments.
env = get_environment(
"daytona",
api_url="https://api.daytona.io",
api_key="your-api-key",
timeout=300.0,
keep_alive=False
)
Parameters:
api_url(str): Daytona API URL (optional, uses env vars if not provided)api_key(str): API key for authentication (optional)target(str): Target configuration (optional)image(str): Container image (default: "python:3.13-slim")timeout(float): Execution timeout in seconds (default: 300.0)keep_alive(bool): Keep sandbox running after execution (default: False)
E2B Provider
Executes code in E2B sandboxes for secure, ephemeral execution environments.
env = get_environment(
"e2b",
template="python",
timeout=300.0,
keep_alive=False,
language="python"
)
Parameters:
template(str): E2B template to use (optional)timeout(float): Execution timeout in seconds (default: 300.0)keep_alive(bool): Keep sandbox running after execution (default: False)language(Language): Programming language (default: "python")
Beam Provider
Executes code in Beam cloud sandboxes for scalable, serverless execution environments.
env = get_environment(
"beam",
cpu=1.0,
memory=128,
keep_warm_seconds=600,
timeout=300.0,
language="python"
)
Parameters:
cpu(float | str): CPU cores allocated to the container (default: 1.0)memory(int | str): Memory allocated to the container in MiB (default: 128)keep_warm_seconds(int): Seconds to keep sandbox alive, -1 for no timeout (default: 600)timeout(float): Execution timeout in seconds (default: 300.0)language(Language): Programming language (default: "python")
MCP Provider
Executes Python code with Model Context Protocol support for AI integrations.
env = get_environment(
"mcp",
dependencies=["requests", "numpy"],
allow_networking=True,
timeout=30.0
)
Parameters:
dependencies(list[str]): Python packages to install (optional)allow_networking(bool): Allow network access (default: True)timeout(float): Execution timeout in seconds (default: 30.0)
Code Execution Patterns
All providers support two execution patterns:
1. Main Function Pattern
code = """
async def main():
# Your code here
return "result"
"""
2. Result Variable Pattern
code = """
import math
_result = math.pi * 2
"""
Error Handling
Execution results include comprehensive error information:
async with env:
result = await env.execute(code)
if result.success:
print(f"Result: {result.result}")
print(f"Duration: {result.duration:.3f}s")
else:
print(f"Error: {result.error}")
print(f"Error Type: {result.error_type}")
Multi-Language Support
Some providers support multiple programming languages:
# JavaScript execution
env = get_environment("subprocess", language="javascript", executable="node")
# TypeScript execution
env = get_environment("docker", language="typescript", image="node:18")
Advanced Usage
Context Managers
All environments are async context managers for proper resource cleanup:
async with get_environment("docker") as env:
result1 = await env.execute(code1)
result2 = await env.execute(code2) # Reuses same container
# Container automatically cleaned up
Custom Configurations
Each provider supports environment-specific customization:
# Docker with custom image and networking
env = get_environment(
"docker",
image="tensorflow/tensorflow:latest-py3",
timeout=600.0
)
# Subprocess with specific Python version
env = get_environment(
"subprocess",
executable="/usr/bin/python3.11",
timeout=120.0
)
Streaming Output
Some providers support streaming output line by line, useful for long-running processes:
from exxec import get_environment
# Stream output from subprocess execution
env = get_environment("subprocess")
async with env:
async for line in env.execute_stream("""
import time
for i in range(5):
print(f"Processing step {i+1}...")
time.sleep(1)
print("Done!")
"""):
print(f"Live output: {line}")
# Also works with Docker execution
env = get_environment("docker")
async with env:
async for line in env.execute_stream(code):
# Process each line as it's produced
if "ERROR" in line:
print(f"⚠️ {line}")
else:
print(f"✓ {line}")
Supported providers: docker, local, beam, e2b, modal, vercel, ssh, daytona
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file exxec-0.3.0.tar.gz.
File metadata
- Download URL: exxec-0.3.0.tar.gz
- Upload date:
- Size: 86.9 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via: uv/0.9.21 {"installer":{"name":"uv","version":"0.9.21","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Ubuntu","version":"25.10","id":"questing","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":null}
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
5cb2e3ae59a658ae78bef0d5ba2e12a274670a7f8c0c72b49bb9ca0e5eca5051
|
|
| MD5 |
2b2da782358be91ee491c00eaa4bb455
|
|
| BLAKE2b-256 |
5abb784636677bf204bb2d9d3ddff48269f29f87d01c34286211de1792591b16
|
File details
Details for the file exxec-0.3.0-py3-none-any.whl.
File metadata
- Download URL: exxec-0.3.0-py3-none-any.whl
- Upload date:
- Size: 121.8 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via: uv/0.9.21 {"installer":{"name":"uv","version":"0.9.21","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Ubuntu","version":"25.10","id":"questing","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":null}
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
7db2e3a577906ccea6802f6a5e225043301c982a7995ec21ec237d5ca925d725
|
|
| MD5 |
b624c9b9309f67d73ac3d538ddd694e8
|
|
| BLAKE2b-256 |
e4e972ba2ba8521535de2996f764cae863cb3d29e0e3132b31feb624773ace6b
|