diff --git a/src/cli/remove.rs b/src/cli/remove.rs index 43b0d5316..95e4ec900 100644 --- a/src/cli/remove.rs +++ b/src/cli/remove.rs @@ -1,5 +1,6 @@ use clap::Parser; use miette::Context; +use pixi_manifest::FeaturesExt; use crate::environment::get_update_lock_file_and_prefix; use crate::Project; @@ -40,6 +41,26 @@ pub async fn execute(args: Args) -> miette::Result<()> { .with_cli_config(prefix_update_config.config.clone()); let dependency_type = dependency_config.dependency_type(); + // Prevent removing Python if PyPI dependencies exist + if let DependencyType::CondaDependency(_) = dependency_type { + for name in dependency_config.specs()?.keys() { + if name.as_source() == "python" { + // Check if there are any PyPI dependencies by importing the PypiDependencies trait + let pypi_deps = project.default_environment().pypi_dependencies(None); + if !pypi_deps.is_empty() { + let deps_list = pypi_deps + .iter() + .map(|(name, _)| name.as_source()) + .collect::>() + .join(", "); + return Err(miette::miette!( + "Cannot remove Python while PyPI dependencies exist. Please remove these PyPI dependencies first: {}", + deps_list + )); + } + } + } + } match dependency_type { DependencyType::PypiDependency => { for name in dependency_config.pypi_deps(&project)?.keys() {