Process
class Process()
Handles process and code execution within a Sandbox.
Process.__init__
def __init__(sandbox_id: str, code_toolbox: SandboxPythonCodeToolbox, toolbox_api: ToolboxApi, get_preview_link: Callable[[int], PortPreviewUrl])
Initialize a new Process instance.
Arguments:
sandbox_id
str - The ID of the Sandbox.code_toolbox
SandboxPythonCodeToolbox - Language-specific code execution toolbox.toolbox_api
ToolboxApi - API client for Sandbox operations.
Process.exec
@intercept_errors(message_prefix="Failed to execute command: ")def exec(command: str, cwd: Optional[str] = None, env: Optional[Dict[str, str]] = None, timeout: Optional[int] = None) -> ExecuteResponse
Execute a shell command in the Sandbox.
Arguments:
command
str - Shell command to execute.cwd
Optional[str] - Working directory for command execution. If not specified, uses the sandbox working directory.env
Optional[Dict[str, str]] - Environment variables to set for the command.timeout
Optional[int] - Maximum time in seconds to wait for the command to complete. 0 means wait indefinitely.
Returns:
ExecuteResponse
- Command execution results containing:- exit_code: The command’s exit status
- result: Standard output from the command
- artifacts: ExecutionArtifacts object containing
stdout
(same as result) andcharts
(matplotlib charts metadata)
Example:
# Simple commandresponse = sandbox.process.exec("echo 'Hello'")print(response.artifacts.stdout) # Prints: Hello
# Command with working directoryresult = sandbox.process.exec("ls", cwd="workspace/src")
# Command with timeoutresult = sandbox.process.exec("sleep 10", timeout=5)
Process.code_run
def code_run(code: str, params: Optional[CodeRunParams] = None, timeout: Optional[int] = None) -> ExecuteResponse
Executes code in the Sandbox using the appropriate language runtime.
Arguments:
code
str - Code to execute.params
Optional[CodeRunParams] - Parameters for code execution.timeout
Optional[int] - Maximum time in seconds to wait for the code to complete. 0 means wait indefinitely.
Returns:
ExecuteResponse
- Code execution result containing:- exit_code: The execution’s exit status
- result: Standard output from the code
- artifacts: ExecutionArtifacts object containing
stdout
(same as result) andcharts
(matplotlib charts metadata)
Example:
# Run Python coderesponse = sandbox.process.code_run(''' x = 10 y = 20 print(f"Sum: {x + y}")''')print(response.artifacts.stdout) # Prints: Sum: 30
Matplotlib charts are automatically detected and returned in the charts
field
of the ExecutionArtifacts
object.
code = '''import matplotlib.pyplot as pltimport numpy as np
x = np.linspace(0, 10, 30)y = np.sin(x)
plt.figure(figsize=(8, 5))plt.plot(x, y, 'b-', linewidth=2)plt.title('Line Chart')plt.xlabel('X-axis (seconds)')plt.ylabel('Y-axis (amplitude)')plt.grid(True)plt.show()'''
response = sandbox.process.code_run(code)chart = response.artifacts.charts[0]
print(f"Type: {chart.type}")print(f"Title: {chart.title}")if chart.type == ChartType.LINE and isinstance(chart, LineChart): print(f"X Label: {chart.x_label}") print(f"Y Label: {chart.y_label}") print(f"X Ticks: {chart.x_ticks}") print(f"X Tick Labels: {chart.x_tick_labels}") print(f"X Scale: {chart.x_scale}") print(f"Y Ticks: {chart.y_ticks}") print(f"Y Tick Labels: {chart.y_tick_labels}") print(f"Y Scale: {chart.y_scale}") print("Elements:") for element in chart.elements: print(f"Label: {element.label}") print(f"Points: {element.points}")
Process.create_session
@intercept_errors(message_prefix="Failed to create session: ")def create_session(session_id: str) -> None
Creates a new long-running background session in the Sandbox.
Sessions are background processes that maintain state between commands, making them ideal for scenarios requiring multiple related commands or persistent environment setup. You can run long-running commands and monitor process status.
Arguments:
session_id
str - Unique identifier for the new session.
Example:
# Create a new sessionsession_id = "my-session"sandbox.process.create_session(session_id)session = sandbox.process.get_session(session_id)# Do work...sandbox.process.delete_session(session_id)
Process.get_session
@intercept_errors(message_prefix="Failed to get session: ")def get_session(session_id: str) -> Session
Gets a session in the Sandbox.
Arguments:
session_id
str - Unique identifier of the session to retrieve.
Returns:
Session
- Session information including:- session_id: The session’s unique identifier
- commands: List of commands executed in the session
Example:
session = sandbox.process.get_session("my-session")for cmd in session.commands: print(f"Command: {cmd.command}")
Process.get_session_command
@intercept_errors(message_prefix="Failed to get session command: ")def get_session_command(session_id: str, command_id: str) -> Command
Gets information about a specific command executed in a session.
Arguments:
session_id
str - Unique identifier of the session.command_id
str - Unique identifier of the command.
Returns:
Command
- Command information including:- id: The command’s unique identifier
- command: The executed command string
- exit_code: Command’s exit status (if completed)
Example:
cmd = sandbox.process.get_session_command("my-session", "cmd-123")if cmd.exit_code == 0: print(f"Command {cmd.command} completed successfully")
Process.execute_session_command
@intercept_errors(message_prefix="Failed to execute session command: ")def execute_session_command( session_id: str, req: SessionExecuteRequest, timeout: Optional[int] = None) -> SessionExecuteResponse
Executes a command in the session.
Arguments:
session_id
str - Unique identifier of the session to use.req
SessionExecuteRequest - Command execution request containing:- command: The command to execute
- run_async: Whether to execute asynchronously
Returns:
SessionExecuteResponse
- Command execution results containing:- cmd_id: Unique identifier for the executed command
- output: Combined command output (stdout and stderr) (if synchronous execution)
- stdout: Standard output from the command
- stderr: Standard error from the command
- exit_code: Command exit status (if synchronous execution)
Example:
# Execute commands in sequence, maintaining statesession_id = "my-session"
# Change directoryreq = SessionExecuteRequest(command="cd /workspace")sandbox.process.execute_session_command(session_id, req)
# Create a filereq = SessionExecuteRequest(command="echo 'Hello' > test.txt")sandbox.process.execute_session_command(session_id, req)
# Read the filereq = SessionExecuteRequest(command="cat test.txt")result = sandbox.process.execute_session_command(session_id, req)print(f"Command stdout: {result.stdout}")print(f"Command stderr: {result.stderr}")
Process.get_session_command_logs
@intercept_errors(message_prefix="Failed to get session command logs: ")def get_session_command_logs(session_id: str, command_id: str) -> SessionCommandLogsResponse
Get the logs for a command executed in a session.
Arguments:
session_id
str - Unique identifier of the session.command_id
str - Unique identifier of the command.
Returns:
SessionCommandLogsResponse
- Command logs including:- output: Combined command output (stdout and stderr)
- stdout: Standard output from the command
- stderr: Standard error from the command
Example:
logs = sandbox.process.get_session_command_logs( "my-session", "cmd-123")print(f"Command stdout: {logs.stdout}")print(f"Command stderr: {logs.stderr}")
Process.get_session_command_logs_async
@intercept_errors(message_prefix="Failed to get session command logs: ")async def get_session_command_logs_async( session_id: str, command_id: str, on_stdout: Callable[[str], None], on_stderr: Callable[[str], None]) -> None
Asynchronously retrieves and processes the logs for a command executed in a session as they become available.
Arguments:
session_id
str - Unique identifier of the session.command_id
str - Unique identifier of the command.on_stdout
Callable[[str], None] - Callback function to handle stdout log chunks as they arrive.on_stderr
Callable[[str], None] - Callback function to handle stderr log chunks as they arrive.
Example:
await sandbox.process.get_session_command_logs_async( "my-session", "cmd-123", lambda log: print(f"[STDOUT]: {log}"), lambda log: print(f"[STDERR]: {log}"),)
Process.list_sessions
@intercept_errors(message_prefix="Failed to list sessions: ")def list_sessions() -> List[Session]
Lists all sessions in the Sandbox.
Returns:
List[Session]
- List of all sessions in the Sandbox.
Example:
sessions = sandbox.process.list_sessions()for session in sessions: print(f"Session {session.session_id}:") print(f" Commands: {len(session.commands)}")
Process.delete_session
@intercept_errors(message_prefix="Failed to delete session: ")def delete_session(session_id: str) -> None
Terminates and removes a session from the Sandbox, cleaning up any resources associated with it.
Arguments:
session_id
str - Unique identifier of the session to delete.
Example:
# Create and use a sessionsandbox.process.create_session("temp-session")# ... use the session ...
# Clean up when donesandbox.process.delete_session("temp-session")
Process.create_pty_session
@intercept_errors(message_prefix="Failed to create PTY session: ")def create_pty_session(id: str, cwd: Optional[str] = None, envs: Optional[Dict[str, str]] = None, pty_size: Optional[PtySize] = None) -> PtyHandle
Creates a new PTY (pseudo-terminal) session in the Sandbox.
Creates an interactive terminal session that can execute commands and handle user input. The PTY session behaves like a real terminal, supporting features like command history.
Arguments:
id
- Unique identifier for the PTY session. Must be unique within the Sandbox.cwd
- Working directory for the PTY session. Defaults to the sandbox’s working directory.env
- Environment variables to set in the PTY session. These will be merged with the Sandbox’s default environment variables.pty_size
- Terminal size configuration. Defaults to 80x24 if not specified.
Returns:
PtyHandle
- Handle for managing the created PTY session. Use this to send input, receive output, resize the terminal, and manage the session lifecycle.
Raises:
DaytonaError
- If the PTY session creation fails or the session ID is already in use.
Process.connect_pty_session
@intercept_errors(message_prefix="Failed to connect PTY session: ")def connect_pty_session(session_id: str) -> PtyHandle
Connects to an existing PTY session in the Sandbox.
Establishes a WebSocket connection to an existing PTY session, allowing you to interact with a previously created terminal session.
Arguments:
session_id
- Unique identifier of the PTY session to connect to.
Returns:
PtyHandle
- Handle for managing the connected PTY session.
Raises:
DaytonaError
- If the PTY session doesn’t exist or connection fails.
Process.list_pty_sessions
@intercept_errors(message_prefix="Failed to list PTY sessions: ")def list_pty_sessions() -> List[PtySessionInfo]
Lists all PTY sessions in the Sandbox.
Retrieves information about all PTY sessions in this Sandbox.
Returns:
List[PtySessionInfo]
- List of PTY session information objects containing details about each session’s state, creation time, and configuration.
Example:
# List all PTY sessionssessions = sandbox.process.list_pty_sessions()
for session in sessions: print(f"Session ID: {session.id}") print(f"Active: {session.active}") print(f"Created: {session.created_at}")
Process.get_pty_session_info
@intercept_errors(message_prefix="Failed to get PTY session info: ")def get_pty_session_info(session_id: str) -> PtySessionInfo
Gets detailed information about a specific PTY session.
Retrieves comprehensive information about a PTY session including its current state, configuration, and metadata.
Arguments:
session_id
- Unique identifier of the PTY session to retrieve information for.
Returns:
PtySessionInfo
- Detailed information about the PTY session including ID, state, creation time, working directory, environment variables, and more.
Raises:
DaytonaError
- If the PTY session doesn’t exist.
Example:
# Get details about a specific PTY sessionsession_info = sandbox.process.get_pty_session_info("my-session")
print(f"Session ID: {session_info.id}")print(f"Active: {session_info.active}")print(f"Working Directory: {session_info.cwd}")print(f"Terminal Size: {session_info.cols}x{session_info.rows}")
Process.kill_pty_session
@intercept_errors(message_prefix="Failed to kill PTY session: ")def kill_pty_session(session_id: str) -> None
Kills a PTY session and terminates its associated process.
Forcefully terminates the PTY session and cleans up all associated resources. This will close any active connections and kill the underlying shell process. This operation is irreversible. Any unsaved work in the terminal session will be lost.
Arguments:
session_id
- Unique identifier of the PTY session to kill.
Raises:
DaytonaError
- If the PTY session doesn’t exist or cannot be killed.
Example:
# Kill a specific PTY sessionsandbox.process.kill_pty_session("my-session")
# Verify the session no longer existspty_sessions = sandbox.process.list_pty_sessions()for pty_session in pty_sessions: print(f"PTY session: {pty_session.id}")
Process.resize_pty_session
@intercept_errors(message_prefix="Failed to resize PTY session: ")def resize_pty_session(session_id: str, pty_size: PtySize) -> PtySessionInfo
Resizes a PTY session’s terminal dimensions.
Changes the terminal size of an active PTY session. This is useful when the client terminal is resized or when you need to adjust the display for different output requirements.
Arguments:
session_id
- Unique identifier of the PTY session to resize.pty_size
- New terminal dimensions containing the desired columns and rows.
Returns:
PtySessionInfo
- Updated session information reflecting the new terminal size.
Raises:
DaytonaError
- If the PTY session doesn’t exist or resize operation fails.
Example:
from daytona.common.pty import PtySize
# Resize a PTY session to a larger terminalnew_size = PtySize(rows=40, cols=150)updated_info = sandbox.process.resize_pty_session("my-session", new_size)
print(f"Terminal resized to {updated_info.cols}x{updated_info.rows}")
# You can also use the PtyHandle's resize methodpty_handle.resize(new_size)
CodeRunParams
@dataclassclass CodeRunParams()
Parameters for code execution.
Attributes:
argv
Optional[List[str]] - Command line argumentsenv
Optional[Dict[str, str]] - Environment variables
SessionExecuteRequest
class SessionExecuteRequest(ApiSessionExecuteRequest, AsyncApiSessionExecuteRequest)
Contains the request for executing a command in a session.
Attributes:
command
str - The command to execute.run_async
Optional[bool] - Whether to execute the command asynchronously.var_async
Optional[bool] - Deprecated. Userun_async
instead.
ExecutionArtifacts
class ExecutionArtifacts()
Artifacts from the command execution.
Attributes:
stdout
str - Standard output from the command, same asresult
inExecuteResponse
charts
Optional[List[Chart]] - List of chart metadata from matplotlib
ExecuteResponse
class ExecuteResponse(ClientExecuteResponse)
Response from the command execution.
Attributes:
exit_code
int - The exit code from the command executionresult
str - The output from the command executionartifacts
Optional[ExecutionArtifacts] - Artifacts from the command execution
SessionExecuteResponse
class SessionExecuteResponse(ApiSessionExecuteResponse)
Response from the session command execution.
Attributes:
output
str - The output from the command executionexit_code
int - The exit code from the command execution
SessionCommandLogsResponse
class SessionCommandLogsResponse()
Response from the command logs.
Attributes:
output
str - The combined output from the commandstdout
str - The stdout from the commandstderr
str - The stderr from the command
parse_session_command_logs
def parse_session_command_logs(data: bytes) -> SessionCommandLogsResponse
Parse combined stdout/stderr output into separate streams.
Arguments:
data
- Combined log bytes with STDOUT_PREFIX and STDERR_PREFIX markers
Returns:
SessionCommandLogsResponse with separated stdout and stderr
demux_log
def demux_log(data: bytes) -> tuple[bytes, bytes]
Demultiplex combined stdout/stderr log data.
Arguments:
data
- Combined log bytes with STDOUT_PREFIX and STDERR_PREFIX markers
Returns:
Tuple of (stdout_bytes, stderr_bytes)