این راهنما شما را از صفر به یک سندباکس کارا با پایتون میرساند. یک microVM جداشدهٔ Firecracker بالا میآورید، در آن کد اجرا میکنید، یک بسته نصب میکنید، فایلی را داخل و خارج میکنید و یک کار طولانی را در پسزمینه میگذارید. هر گام چند خط است که فقط باید جایگذاری کنید.
به پایتون ۳٫۸ یا جدیدتر و یک حساب EQVPS نیاز دارید. SDK هیچ وابستگیای ندارد.
۱. توکن بگیرید
هزینهٔ سندباکس از موجودی حساب کم میشود، پس SDK به توکن حساب نیاز دارد. صفحهٔ اتصال حساب سه راه گرفتن آن را نشان میدهد: داشبورد، API یا سرور MCP. بعد آن را در متغیرهای محیطی بگذارید:
export EQVPS_API_KEY="your-token"
هنوز موجودی ندارید؟ مشکلی نیست. حساب تازه وقتی برای اولین بار بدون موجودی کافی سندباکس میسازد، ۱ دلار اعتبار سندباکس با اعتبار ۱۴ روزه میگیرد.
۲. SDK را نصب کنید
pip install eqvps
۳. سندباکس را بالا بیاورید و کد اجرا کنید
این را با نام hello.py ذخیره و اجرا کنید:
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)
شناسهٔ سندباکس (sb_ و ۲۴ نویسهٔ دیگر) و سپس 0 3.12.x را میبینید. سندباکس در حدود یک ثانیه بالا آمد، کد را اجرا کرد و با پایان بلوک with حذف شد.
نکتههایی دربارهٔ نتیجه:
- وقتی کد خروج ۰ باشد و دستور به مهلتش نرسیده باشد،
r.okبرابر true است؛ - کد خروج غیر صفر استثنا نیست، پس
r.okرا خودتان بررسی کنید؛ - هر کدام از
stdoutوstderrتا 1 MiB محدودند وr.truncatedمیگوید خروجی بریده شده یا نه.
۴. بسته نصب کنید و دستور shell اجرا کنید
داخل سندباکس، شما root یک سیستم کوچک لینوکس با Python، Node.js، git و curl هستید. exec هر دستور 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
مهلت پیشفرض ۳۰ ثانیه است و یک فراخوانی همزمان حداکثر ۵۵ ثانیه طول میکشد. نصبهای بزرگ را در یک کار پسزمینه بگذارید (گام ۶).
۵. فایل را داخل و خارج کنید
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
مسیرها باید مطلق باشند. هر انتقال حداکثر 5 MB است؛ download بایت برمیگرداند و download_text رشته.
۶. کار طولانی را در پسزمینه اجرا کنید
background=True را بدهید تا بهجای انتظار، فوراً یک کار بگیرید. این کار محدودیت ۵۵ ثانیه ندارد:
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() هر ۲ ثانیه وضعیت را میپرسد و خروجی تازه را همین که برسد چاپ میکند. میتوانید خودتان task.logs() را صدا بزنید یا با task.kill() کار را متوقف کنید. تا وقتی کاری در حال اجراست، سندباکس به دلیل بیکاری حذف نمیشود.
چقدر هزینه شد
هر بلوک with بالا چند ثانیه زنده بود و با حداقل ۶۰ ثانیه حساب شد. روی small این یعنی 0.00055 دلار برای هر بلوک، پس هر پنج مثال روی هم حدود یکسوم سنت میشود. قیمت همهٔ تعرفهها، حالت ماندگار و سقف هزینه در محدودیتها و صورتحساب سندباکس آمده است.
وقتی چیزی خراب شد
خطاهای API استثناهایی هستند که میتوانید بگیرید:
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 خودش پاسخهای 429 و 503 را تا سه بار دوباره امتحان میکند. هر ۱۱ کلاس خطا در مرجع SDK فهرست شدهاند.
گامهای بعدی
- همین گامها با جاوااسکریپت: SDK تایپاسکریپت برای سندباکس در ۵ دقیقه.
- بگذارید یک مدل هوش مصنوعی کد بنویسد و اینجا اجرا کند: اولین کار عامل در سندباکس.
- تعرفهها، اعتبار آزمایشی و محتوای سندباکس: صفحهٔ سندباکسها.
نظرات
هنوز نظری نیست. اولین نفر باشید.