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
- Give the sandbox a name so you can find it again later: Named sandboxes & persistent stop.
- Boot from your own image instead of the daemon’s default: Boot from a custom image.
- Full method reference: Python SDK.