Architecture#

This page documents the technical architecture of conda-pypi, explaining how it integrates with conda and the internal organization of its components.

Plugin System Integration#

conda-pypi is implemented as a conda plugin using conda’s official plugin architecture. This design enables seamless integration with conda’s existing workflows without requiring modifications to conda itself.

The plugin registers several hooks with conda’s plugin system. The subcommand hook adds the conda pypi subcommand to conda through conda_pypi.plugin.conda_subcommands(), providing both conda pypi install for installing PyPI packages with conversion and conda pypi convert for converting PyPI packages without installing them.

The plugin also registers three post-command hooks that extend conda’s existing commands. The environment protection hook triggers after install, create, update, and remove commands to automatically deploy EXTERNALLY-MANAGED files that prevent accidental pip (or any other Python install tool) usage. This is implemented through ensure_target_env_has_externally_managed().

Data Flow Architecture#

Installation Flow#

conda pypi install package
         ↓
CLI Argument Parsing
         ↓
Environment Validation
         ↓
Package Classification
         ↓
    VCS/Editable? ----Yes---→ Direct pip install --> Deploy EXTERNALLY-MANAGED
         ↓ No
Dependency Resolution
         ↓
Channel Search for Dependencies
         ↓
Convert Missing from PyPI
         ↓
Install via conda
         ↓
Deploy EXTERNALLY-MANAGED

Conversion Flow#

conda pypi convert package
         ↓
Fetch from PyPI
         ↓
Download Wheels
         ↓
Convert to .conda
         ↓
Save to Output Directory

Plugin Hook Flow#

conda command executed
         ↓
Post-command hook?
    ↓        ↓           ↓
list      install/    install/create/
--explicit  create     update/remove
    ↓        ↓           ↓
Add PyPI  Process    Deploy
lines     PyPI       EXTERNALLY-
    ↓     lines      MANAGED
Output to   ↓           ↓
stdout   Install    Create marker
         PyPI       files
         packages

Key Design Principles#

The architecture of conda-pypi is built around several key design principles that ensure effective integration between conda and PyPI ecosystems.

Conda-native integration is achieved by using conda’s official plugin system and leveraging conda’s existing infrastructure including solvers, channels, and metadata systems. This approach maintains full compatibility with existing conda workflows.

This hybrid approach ensures that explicit packages always come from PyPI to respect user intent, while dependencies prefer conda channels for ecosystem compatibility. The system falls back to PyPI conversion only when needed.

This architecture enables conda-pypi to provide a seamless bridge between the conda and PyPI ecosystems while maintaining the integrity and benefits of both package management systems.