Skip to main content
Same operations as the JS/TS SDK, Python-idiomatic naming (run_command not runCommand, snake_case fields), zero runtime dependencies (stdlib urllib only). One real gap, not just a naming difference: streamed background exec (exec_stream/attaching to its live log) and pty aren’t implemented in this SDK yet — use the CLI or the daemon HTTP API directly for those today.

A failed command doesn’t raise — it returns a non-zero exit code

run_command reports whatever the command actually did; cat-ing a missing file isn’t a Python exception, it’s a normal ExecResult with exit_code: 1:
SandkilnApiError is reserved for the request itself failing — a bad sandbox id, an unreachable daemon, a validation error. Calling any method after stop() (without resume()-ing it first) is the everyday way to see one:

Next