# run_local.py — Teste local para app2.py com YOLO + OpenCV import os import sys import types from pathlib import Path from fastapi.responses import HTMLResponse import uvicorn # ================================================================ # 0️⃣ Preparar ambiente fake ANTES de importar app2.py # ================================================================ # Variáveis de ambiente fake para evitar erros no import os.environ.setdefault("AWS_ACCESS_KEY_ID", "fake") os.environ.setdefault("AWS_SECRET_ACCESS_KEY", "fake") os.environ.setdefault("AWS_S3_BUCKET_NAME", "fake-bucket") os.environ.setdefault("AWS_S3_REGION", "us-east-1") os.environ.setdefault("SUPABASE_URL", "http://fake.supabase") os.environ.setdefault("SUPABASE_KEY", "fake-key") os.environ.setdefault("YOLO_MODEL_PATH", "best.pt") # opcional # Fake ultralytics caso você não queira instalar local try: import ultralytics # tenta usar real se tiver except ImportError: ultra_mod = types.ModuleType("ultralytics") class DummyBox: def __init__(self): pass class DummyResult: def __init__(self): self.names = {0: "screw"} self.boxes = None class DummyYOLO: def __init__(self, *args, **kwargs): pass def predict(self, img, *args, **kwargs): return [DummyResult()] ultra_mod.YOLO = DummyYOLO sys.modules["ultralytics"] = ultra_mod print("[Fake] ultralytics carregado!") # ================================================================ # 1️⃣ Importar app real # ================================================================ import app2 app = app2.app # reusar FastAPI original # ================================================================ # 2️⃣ Fake S3 e Fake Supabase # ================================================================ LOCAL_ROOT = Path("./local_storage").resolve() (LOCAL_ROOT / "imagens_originais").mkdir(parents=True, exist_ok=True) (LOCAL_ROOT / "imagens_resultados").mkdir(parents=True, exist_ok=True) class FakeS3: def put_object(self, Bucket, Key, Body, ContentType): dest = LOCAL_ROOT / Key dest.parent.mkdir(parents=True, exist_ok=True) with open(dest, "wb") as f: f.write(Body) print(f"[FakeS3] gravado: {dest}") def delete_object(self, Bucket, Key): dest = LOCAL_ROOT / Key try: dest.unlink() except: pass def generate_presigned_url(self, *_args, **kwargs): key = kwargs["Params"]["Key"] print(f"[FakeS3] URL gerada local para {key}") return f"file://{(LOCAL_ROOT / key).as_posix()}" class _FakeResp: def __init__(self, data): self.data = data def execute(self): return self class FakeTable: def __init__(self, store): self.store = store def insert(self, payload): new_id = self.store["next_id"] self.store["next_id"] += 1 row = dict(payload) row["id"] = new_id self.store["rows"][new_id] = row print(f"[FakeSupabase] inserido id={new_id}") return _FakeResp([row]) def select(self, *_cols): class _Sel: def __init__(self, table): self.table=table; self._id=None def eq(self, fld, val): if fld=="id": self._id = int(val) return self def single(self): return _FakeResp(self.table.store["rows"].get(self._id)) return _Sel(self) class FakeSupabase: def __init__(self): self.tables = {"amostras": {"next_id": 1, "rows": {}}} def from_(self, name): return FakeTable(self.tables[name]) # Patchar os clientes globais do app app2.s3_client = FakeS3() app2.supabase_client = FakeSupabase() # ================================================================ # 3️⃣ Interface Web Local (UI) # ================================================================ @app.get("/ui", response_class=HTMLResponse) def local_ui(): return """