Manage Python virtual environments and dependencies
| 5703 | STRIKETHROUGH = '\033[9m' |
| 5704 | |
| 5705 | class PythonEnvironmentManager: |
| 5706 | """Manage Python virtual environments and dependencies""" |
| 5707 | |
| 5708 | def __init__(self, base_dir: str = "/tmp/hexstrike_envs"): |
| 5709 | self.base_dir = Path(base_dir) |
| 5710 | self.base_dir.mkdir(exist_ok=True) |
| 5711 | |
| 5712 | def create_venv(self, env_name: str) -> Path: |
| 5713 | """Create a new virtual environment""" |
| 5714 | env_path = self.base_dir / env_name |
| 5715 | if not env_path.exists(): |
| 5716 | logger.info(f"🐍 Creating virtual environment: {env_name}") |
| 5717 | venv.create(env_path, with_pip=True) |
| 5718 | return env_path |
| 5719 | |
| 5720 | def install_package(self, env_name: str, package: str) -> bool: |
| 5721 | """Install a package in the specified environment""" |
| 5722 | env_path = self.create_venv(env_name) |
| 5723 | pip_path = env_path / "bin" / "pip" |
| 5724 | |
| 5725 | try: |
| 5726 | result = subprocess.run([str(pip_path), "install", package], |
| 5727 | capture_output=True, text=True, timeout=300) |
| 5728 | if result.returncode == 0: |
| 5729 | logger.info(f"📦 Installed package {package} in {env_name}") |
| 5730 | return True |
| 5731 | else: |
| 5732 | logger.error(f"❌ Failed to install {package}: {result.stderr}") |
| 5733 | return False |
| 5734 | except Exception as e: |
| 5735 | logger.error(f"💥 Error installing package {package}: {e}") |
| 5736 | return False |
| 5737 | |
| 5738 | def get_python_path(self, env_name: str) -> str: |
| 5739 | """Get Python executable path for environment""" |
| 5740 | env_path = self.create_venv(env_name) |
| 5741 | return str(env_path / "bin" / "python") |
| 5742 | |
| 5743 | # Global environment manager |
| 5744 | env_manager = PythonEnvironmentManager() |