File size: 3,736 Bytes
f98bbe8 01c4625 f98bbe8 01c4625 f98bbe8 01c4625 f98bbe8 |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 |
#!/usr/bin/env python3
"""
Bootstrap environnement portable pour BOB.
Force l'utilisation des ressources locales (ffmpeg, modèles, caches) et
offre un point unique pour configurer les variables d'environnement.
"""
from __future__ import annotations
import os
import sys
from pathlib import Path
def _prepend_path(dir_path: Path) -> None:
p = str(dir_path)
current = os.environ.get("PATH", "")
if p and p not in current:
os.environ["PATH"] = p + (";" if current else "") + current
def setup_portable_env(base_dir: Path | None = None, force_ollama_portable: bool | None = None) -> Path:
"""
Configure l'environnement pour n'utiliser que le dossier courant.
- Ajoute vendor/ffmpeg/bin au PATH
- Fige les caches HF/Transformers/Whisper dans resources/models
- Définit le répertoire des modèles Ollama local
- Optionnellement force l'hôte Ollama portable (localhost:11435 par défaut)
Retourne base_dir normalisé.
"""
if base_dir is None:
# Détection robuste du répertoire de base (compatible PyInstaller)
if getattr(sys, 'frozen', False) and hasattr(sys, '_MEIPASS'):
# Application packagée avec PyInstaller
# sys.executable pointe vers BOB.exe dans le bon dossier
base_dir = Path(sys.executable).parent.resolve()
else:
# Développement normal
here = Path(__file__).resolve().parent
base_dir = (here.parent).resolve()
# Expo pour d'autres modules
os.environ.setdefault("BOB_BASE_DIR", str(base_dir))
# 1) FFmpeg local
ffmpeg_bin = base_dir / "vendor" / "ffmpeg" / "bin"
if ffmpeg_bin.exists():
_prepend_path(ffmpeg_bin)
# 2) Caches et modèles locaux
models_root = base_dir / "resources" / "models"
hf_cache = models_root / "huggingface"
whisper_cache = models_root / "whisper"
numba_cache = models_root / "numba_cache"
for d in (hf_cache, whisper_cache, numba_cache):
d.mkdir(parents=True, exist_ok=True)
# Hugging Face caches
os.environ.setdefault("HF_HOME", str(hf_cache))
os.environ.setdefault("TRANSFORMERS_CACHE", str(hf_cache))
os.environ.setdefault("HUGGINGFACE_HUB_CACHE", str(hf_cache))
# Whisper cache (openai-whisper regarde XDG_CACHE_HOME/WHISPER_CACHE_DIR)
os.environ.setdefault("WHISPER_CACHE_DIR", str(whisper_cache))
os.environ.setdefault("XDG_CACHE_HOME", str(models_root))
# NumPy/Numba
os.environ.setdefault("NUMBA_CACHE_DIR", str(numba_cache))
# 3) Dossiers d'E/S par défaut
os.environ.setdefault("BOB_INPUT_DIR", str(base_dir / "input"))
os.environ.setdefault("BOB_TRANSCRIPTIONS_DIR", str(base_dir / "output" / "transcriptions"))
os.environ.setdefault("BOB_OUTPUT_FILE", str(base_dir / "output" / "resume_bob.txt"))
# 4) Ollama portable (modèles + host)
ollama_models = base_dir / "resources" / "ollama" / "models"
ollama_models.mkdir(parents=True, exist_ok=True)
# OLLAMA_MODELS est reconnu par Ollama pour localiser les modèles
os.environ.setdefault("OLLAMA_MODELS", str(ollama_models))
# Forçage Ollama portable si demandé
if force_ollama_portable is None:
force_ollama_portable = os.environ.get("BOB_FORCE_PORTABLE_OLLAMA", "0") == "1"
if force_ollama_portable:
os.environ["BOB_FORCE_PORTABLE_OLLAMA"] = "1"
# Permettre override externe, sinon 11434 (port standard Ollama)
portable_host = os.environ.get("PORTABLE_OLLAMA_HOST", "http://localhost:11434")
os.environ["OLLAMA_HOST"] = portable_host
return base_dir
__all__ = ["setup_portable_env"]
|