diff --git a/src/py/flwr/cli/install.py b/src/py/flwr/cli/install.py index a1a66e42fd65..749a4516f65c 100644 --- a/src/py/flwr/cli/install.py +++ b/src/py/flwr/cli/install.py @@ -16,6 +16,7 @@ import shutil +import subprocess import tempfile import zipfile from io import BytesIO @@ -192,6 +193,21 @@ def validate_and_install( else: shutil.copy2(item, install_dir / item.name) + try: + subprocess.run( + ["pip", "install", "-e", install_dir, "--no-deps"], + capture_output=True, + text=True, + check=True, + ) + except subprocess.CalledProcessError as e: + typer.secho( + f"❌ Failed to `pip install` package(s) from {install_dir}:\n{e.stderr}", + fg=typer.colors.RED, + bold=True, + ) + raise typer.Exit(code=1) from e + typer.secho( f"🎊 Successfully installed {project_name} to {install_dir}.", fg=typer.colors.GREEN, diff --git a/src/py/flwr/superexec/deployment.py b/src/py/flwr/superexec/deployment.py index bbe7882692f0..d012d408a9ff 100644 --- a/src/py/flwr/superexec/deployment.py +++ b/src/py/flwr/superexec/deployment.py @@ -15,7 +15,6 @@ """Deployment engine executor.""" import subprocess -import sys from logging import ERROR, INFO from pathlib import Path from typing import Dict, Optional @@ -131,14 +130,7 @@ def start_run( try: # Install FAB to flwr dir fab_version, fab_id = get_fab_metadata(fab_file) - fab_path = install_from_fab(fab_file, None, True) - - # Install FAB Python package - subprocess.check_call( - [sys.executable, "-m", "pip", "install", "--no-deps", str(fab_path)], - stdout=subprocess.DEVNULL, - stderr=subprocess.DEVNULL, - ) + install_from_fab(fab_file, None, True) # Call SuperLink to create run run_id: int = self._create_run(fab_id, fab_version, override_config)