pip install jhansi — SDK가 출시되었습니다
출처: Dev.to
6주 전만 해도 jhansi.io에서 코드를 실행한다는 것은 curl + 샌드박스 ID + 수동 정리를 의미했습니다.
오늘은 이렇게 보입니다:
from jhansi import Sandbox
with Sandbox(language="python") as sb:
sb.upload_file("main.py")
result = sb.exec("python main.py")
print(result["output"])
이것이 바로 이정표입니다. SDK가 정식으로 출시되었습니다.
API는 원래부터 존재했었습니다. 아래 엔진인 Petri는 v0.1부터 격리된 Docker 컨테이너 안에서 코드를 실행해 왔습니다. 하지만 그때는 HTTP를 이해하고, 컨테이너 수명 주기를 관리하며, 샌드박스를 삭제하지 않으면 리소스가 새어나간다는 점을 기억해야 했습니다.
SDK는 이 모든 과정을 없애줍니다. 여러분은 파이썬만 작성하면 되고, jhansi.io가 나머지를 처리합니다.
샌드박스를 만들고 삭제를 잊어버리면 컨테이너와 워크스페이스 스토리지가 누수됩니다. 이는 특히 AI 에이전트가 프로그래밍적으로 샌드박스를 생성할 때 용납될 수 없습니다.
컨텍스트 매니저를 사용하면 정리가 자동으로 이루어집니다:
with Sandbox(language="python") as sb:
# 여기서 샌드박스가 생성됩니다
sb.upload_file("main.py")
result = sb.exec("python main.py")
# 여기서 샌드박스가 삭제됩니다 — exec가 예외를 발생시켜도 마찬가지입니다
컨테이너 누수 없음. 정리 코드 없음. 놀라운 일도 없습니다.
Docker Compose로 Petri를 직접 호스팅하면서 우리가 예상하지 못한 문제가 드러났습니다.
Petri는 Docker 컨테이너 안에서 실행됩니다. 하지만 Petri의 역할은 여러분의 코드를 실행할 Docker 컨테이너를 띄우는 것이므로, Docker에 대한 접근 권한이 필요합니다 — 바로 Docker 안에서 Docker에 접근해야 합니다.
해결책 1: Docker 소켓을 마운트합니다.
volumes:
- /var/run/docker.sock:/var/run/docker.sock
해결책 2: 공유 워크스페이스 경로를 설정합니다.
Petri는 자체 컨테이너 안에 워크스페이스 폴더를 만들고, 이를 샌드박스 컨테이너에 마운트하려고 합니다. 이때 Docker는 호스트 상의 경로를 찾으려 하는데, Petri 안에 존재하지 않으므로 경로가 없다는 오류가 발생합니다.
volumes:
- /var/run/docker.sock:/var/run/docker.sock
- /tmp/petri-workspaces:/tmp/petri-workspaces
environment:
- PETRI_WORKSPACE_ROOT=/tmp/petri-workspaces
양쪽 모두 같은 경로를 사용하도록 하면 Docker가 찾을 수 있어 문제는 해결됩니다.
Petri 시작하기
git clone https://github.com/jhansi-io/petri.git
cd petri
docker compose up
SDK 설치
pip install jhansi
전체 문서는 docs.jhansi.io에서 확인하세요.
- v0.6 — 영구 레지스트리 도입, 샌드박스가 Petri 재시작 후에도 살아남음
- v0.7 — 스트리밍 exec, 코드 실행 중 실시간 출력 제공
- MCP 서버 — Cursor와 Claude Code가 자체 클라우드 대신 Petri를 직접 사용
제가 가장 기대하는 부분은 MCP 서버입니다. 곧 더 자세히 알려드리겠습니다.
빌드 과정을 지켜보고 있다면 레포지토리에 ⭐️를 눌러 주세요.
github.com/jhansi-io/jhansi