−25%

la planurile Windows anuale, până pe 31 oct. Vezi planurile

EQVPS
Începe

SDK de sandbox Python în 5 minute: de la pip install eqvps la prima rulare

Instalează SDK-ul Python EQVPS, pornește un sandbox Firecracker, rulează cod, instalează un pachet, mută fișiere și rulează o sarcină lungă în fundal. Șase pași, cu toate comenzile, iar totul costă sub un cent.

Ghidul ăsta te duce de la zero la un sandbox funcțional în Python. Vei porni o microVM Firecracker izolată, vei rula cod în ea, vei instala un pachet, vei muta un fișier înăuntru și înapoi și vei rula ceva lung în fundal. Fiecare pas e câteva rânduri pe care le poți lipi.

Îți trebuie Python 3.8 sau mai nou și un cont EQVPS. SDK-ul nu are dependențe.

1. Obține un token

Sandboxurile se plătesc din soldul contului, deci SDK-ul are nevoie de un token de cont. Conectarea contului arată cele trei căi de a obține unul: dashboardul, API-ul sau serverul MCP. Apoi pune-l în mediu:

export EQVPS_API_KEY="your-token"

N-ai încă sold? Nicio problemă. Prima dată când un cont nou creează un sandbox fără sold suficient, primește $1 credit de sandbox, valabil 14 zile.

2. Instalează SDK-ul

pip install eqvps

3. Pornește un sandbox și rulează cod

Salvează asta ca hello.py și rulează-l:

from eqvps import Sandbox

with Sandbox.create(tariff="small") as sb:
    print(sb.id)
    r = sb.run("import platform; print(platform.python_version())")
    print(r.exit_code, r.stdout)

Ar trebui să vezi id-ul sandboxului (sb_ și încă 24 de caractere), apoi 0 3.12.x. Sandboxul a pornit în aproximativ o secundă, a rulat codul și a fost șters când s-a terminat blocul with.

Câteva lucruri bune de știut despre rezultat:

  • r.ok e true când codul de ieșire e 0 și comanda nu a depășit timpul;
  • un cod de ieșire diferit de zero nu e o excepție, deci verifică singur r.ok;
  • stdout și stderr sunt limitate la câte 1 MiB, iar r.truncated îți spune dacă ieșirea a fost tăiată.

4. Instalează un pachet și rulează comenzi shell

În sandbox ești root pe un sistem Linux mic, cu Python, Node.js, git și curl. exec rulează orice comandă shell:

from eqvps import Sandbox

with Sandbox.create(tariff="small") as sb:
    sb.exec("pip install --quiet requests", timeout=55)
    r = sb.run("import requests; print(requests.get('https://example.com').status_code)")
    print(r.stdout)   # 200

Timeoutul implicit e 30 de secunde, iar cel mai mult poate dura un apel sincron 55. Instalările mari își au locul într-o sarcină de fundal (pasul 6).

5. Mută fișiere înăuntru și înapoi

from eqvps import Sandbox

with Sandbox.create() as sb:
    sb.upload("/root/data.csv", "a,b\n1,2\n3,4\n")
    sb.run("""
import csv
rows = list(csv.DictReader(open('/root/data.csv')))
open('/root/sum.txt', 'w').write(str(sum(int(r['b']) for r in rows)))
""")
    print(sb.download_text("/root/sum.txt"))   # 6

Căile trebuie să fie absolute. Un transfer e limitat la 5 MB; download returnează bytes, download_text un șir.

6. Rulează o sarcină lungă în fundal

Dă background=True și primești o sarcină în loc să aștepți. Nu are limita de 55 de secunde:

from eqvps import Sandbox

with Sandbox.create(tariff="standard") as sb:
    task = sb.exec("for i in 1 2 3 4 5; do echo step $i; sleep 20; done", background=True)
    result = task.wait(on_output=lambda out, err: print(out, end=""))
    print(result.state, result.exit_code)   # done 0

task.wait() verifică la fiecare 2 secunde și afișează ieșirea nouă pe măsură ce apare. Poți apela și singur task.logs() sau task.kill() ca s-o oprești. Cât rulează o sarcină, sandboxul nu e șters pentru inactivitate.

Cât a costat

Fiecare bloc with de mai sus a trăit câteva secunde și a fost facturat la minimul de 60 de secunde. Pe small asta înseamnă $0.00055 per bloc, deci toate cele cinci exemple au costat împreună în jur de o treime de cent. Prețurile pentru fiecare tarif, modul persistent și plafoanele de cheltuieli sunt în limitele și facturarea sandboxurilor.

Când ceva eșuează

Erorile de la API sunt excepții pe care le poți prinde:

from eqvps import Sandbox, InsufficientBalanceError, RateLimitError

try:
    with Sandbox.create() as sb:
        print(sb.run("print(1)").stdout)
except InsufficientBalanceError:
    print("Top up the balance")
except RateLimitError as e:
    print("Too many at once, retry in", e.retry_after)

SDK-ul reîncearcă deja răspunsurile 429 și 503 de până la trei ori, când serverul spune cât să aștepte. Toate cele 11 clase de erori sunt listate în referința SDK.

Pașii următori

Întrebări frecvente

Am nevoie de un card ca să încerc?

Nu. Un cont nou primește $1 credit de sandbox prima dată când creează un sandbox fără sold suficient. Tot ghidul ăsta folosește mult sub un cent din el. După asta îți alimentezi soldul în cripto.

Pot face pip install în sandbox?

Da. Sandboxurile au acces la internet spre exterior, iar pip instalează la nivel de sistem, fără virtualenv. Pachetele grele, ca torch, au nevoie de mai mult disc și memorie, așa că folosește pentru ele tariful plus sau unul mai mare.

De ce se oprește comanda mea după 30 de secunde?

Timeoutul implicit pentru run și exec e 30 de secunde, iar maximul pentru un apel sincron e 55. Orice e mai lung ar trebui rulat cu background=True, care nu are limita asta.

Se șterge sandboxul dacă scriptul meu pică?

Cu blocul with, da: sandboxul e șters când se iese din bloc, chiar și după o excepție. Fără el, un sandbox efemer e șters după 5 minute de inactivitate, iar minutele acelea le plătești.

Comentarii

Încă nu există comentarii. Fii primul.

Lasă un comentariu

Comentariile sunt moderate înainte să apară.