
# Fichier: python_cheats/cheatsheets/pip.txt
# Cheatsheet pip Python - Guide Complet



[OK] INSTALLATION DE BASE


# Installer un package
pip install package_name

# Installer plusieurs packages
pip install package1 package2 package3

# Installer avec sortie minimale
pip install -q package_name

# Installer avec sortie détaillée
pip install -v package_name
pip install -vv package_name
pip install -vvv package_name


[OK] VERSIONS SPÉCIFIQUES


# Version exacte
pip install package==1.2.3

# Version minimum
pip install package>=1.0.0

# Version maximum
pip install package<2.0.0

# Range de versions
pip install "package>=1.0.0,<2.0.0"

# Version compatible (1.2.x seulement)
pip install package~=1.2.0

# Dernière version compatible
pip install "package>=1.0,<1.1"

# N'importe quelle version
pip install package

# Versions spécifiques multiples
pip install "package==1.2.3 || ==1.2.4"


[OK] DÉSINSTALLATION


# Désinstaller un package
pip uninstall package_name

# Désinstaller plusieurs packages
pip uninstall package1 package2 package3

# Sans confirmation
pip uninstall -y package_name

# Désinstaller tout sauf pip et setuptools
pip freeze | xargs pip uninstall -y

# Désinstaller avec dépendances (nécessite pip-autoremove)
pip install pip-autoremove
pip-autoremove package_name -y


[OK] MISE À JOUR


# Mettre à jour un package
pip install --upgrade package_name
pip install -U package_name

# Mettre à jour pip lui-même
pip install --upgrade pip
python -m pip install --upgrade pip

# Mettre à jour tous les packages (Linux/Mac)
pip list --outdated --format=freeze | grep -v '^\-e' | cut -d = -f 1 | xargs -n1 pip install -U

# Mettre à jour tous les packages (Windows PowerShell)
pip list --outdated --format=json | ConvertFrom-Json | ForEach-Object {pip install --upgrade $_.name}

# Mettre à jour tous les packages (Python script)
# import subprocess
# import pkg_resources
# packages = [dist.project_name for dist in pkg_resources.working_set]
# subprocess.call(['pip', 'install', '--upgrade'] + packages)

# Downgrade vers version spécifique
pip install --force-reinstall package==1.0.0


[OK] LISTER LES PACKAGES


# Tous les packages installés
pip list

# Packages obsolètes
pip list --outdated
pip list -o

# Format freeze (pour requirements.txt)
pip list --format=freeze

# Format JSON
pip list --format=json

# Format colonnes
pip list --format=columns

# Uniquement les packages user
pip list --user

# Packages à jour
pip list --uptodate

# Packages non requis par d'autres
pip list --not-required

# Packages modifiables (editable)
pip list -e

# Avec chemin d'installation
pip list -v


[OK] FREEZE & REQUIREMENTS


# Générer requirements.txt
pip freeze > requirements.txt

# Générer sans packages editables
pip freeze --exclude-editable > requirements.txt

# Générer seulement packages user
pip freeze --user > requirements.txt

# Générer avec commentaires de version
pip list --format=freeze > requirements.txt

# Installer depuis requirements.txt
pip install -r requirements.txt

# Installer en ignorant les erreurs
pip install -r requirements.txt --ignore-installed

# Installer sans dépendances
pip install -r requirements.txt --no-deps

# Dry run (simuler installation)
pip install -r requirements.txt --dry-run


[OK] REQUIREMENTS.TXT AVANCÉ


# Structure complète de requirements.txt:

# === requirements.txt ===
# Commentaires
# Core dependencies

# Version exacte (production)
django==4.2.0
celery==5.3.0

# Range de versions (flexible)
requests>=2.28.0,<3.0.0
numpy>=1.20,<2.0

# Version compatible (patch updates)
flask~=2.3.0

# Depuis Git (branche spécifique)
git+https://github.com/user/repo.git@main#egg=package
git+https://github.com/user/repo.git@v1.0.0#egg=package

# Depuis Git (commit spécifique)
git+https://github.com/user/repo.git@abc123#egg=package

# Depuis Git avec subdirectory
git+https://github.com/user/repo.git@main#egg=package&subdirectory=pkg_dir

# Depuis URL directe
https://github.com/user/repo/archive/master.zip

# Depuis fichier local
./packages/mypackage-1.0.tar.gz
file:///path/to/package.whl

# Avec extras
celery[redis,sqs]
django[argon2,bcrypt]

# Include autre fichier requirements
-r requirements-base.txt
-r requirements-dev.txt

# Constraints (versions sans installer)
-c constraints.txt

# Editable install (dev)
-e .
-e ./src/mypackage

# Variables d'environnement
# ${PACKAGE_VERSION} ne fonctionne pas directement
# Utiliser pip-tools ou poetry pour cela

# Index alternatif
--index-url https://pypi.org/simple
--extra-index-url https://custom.pypi.org/simple

# Trusted hosts
--trusted-host pypi.org
--trusted-host custom.pypi.org

# Options globales
--no-binary :all:
--only-binary :all:
--prefer-binary


[OK] STRUCTURE REQUIREMENTS MULTI-FICHIERS


# requirements/
#   ├── base.txt          # Dépendances communes
#   ├── dev.txt           # Développement
#   ├── prod.txt          # Production
#   ├── test.txt          # Tests
#   └── docs.txt          # Documentation

# === requirements/base.txt ===
django>=4.2,<5.0
psycopg2-binary>=2.9
celery[redis]>=5.3
requests>=2.28

# === requirements/dev.txt ===
-r base.txt

# Debugging
ipython>=8.0
ipdb>=0.13
django-debug-toolbar>=4.0

# Code quality
black>=23.0
flake8>=6.0
isort>=5.12
mypy>=1.0
pylint>=2.17

# === requirements/prod.txt ===
-r base.txt

# Production servers
gunicorn>=21.0
gevent>=23.0

# Monitoring
sentry-sdk>=1.32

# === requirements/test.txt ===
-r base.txt

pytest>=7.4
pytest-django>=4.5
pytest-cov>=4.1
pytest-mock>=3.11
factory-boy>=3.3
faker>=19.0
coverage>=7.3

# === requirements/docs.txt ===
-r base.txt

sphinx>=7.0
sphinx-rtd-theme>=1.3
sphinx-autodoc-typehints>=1.24


[OK] SHOW (INFORMATIONS PACKAGE)


# Informations basiques
pip show package_name

# Avec liste des fichiers
pip show -f package_name

# Multiple packages
pip show package1 package2

# Format parsable (pour scripts)
pip show --format json package_name

# Exemple de sortie:
# Name: requests
# Version: 2.31.0
# Summary: Python HTTP library
# Home-page: https://requests.readthedocs.io
# Author: Kenneth Reitz
# License: Apache 2.0
# Location: /usr/lib/python3.11/site-packages
# Requires: charset-normalizer, idna, urllib3, certifi
# Required-by: responses, requests-oauthlib


[OK] CHECK (VÉRIFIER DÉPENDANCES)


# Vérifier les dépendances cassées
pip check

# Exemple de sortie si problème:
# package1 1.0.0 requires package2>=2.0, but you have package2 1.5

# Script pour vérifier et réparer
pip check || pip install --upgrade --force-reinstall $(pip list --format=freeze | cut -d= -f1)


[OK] DOWNLOAD (TÉLÉCHARGER)


# Télécharger package sans installer
pip download package_name

# Télécharger dans dossier spécifique
pip download package_name -d ./packages

# Télécharger depuis requirements.txt
pip download -r requirements.txt -d ./packages

# Télécharger avec dépendances
pip download package_name --dest ./packages

# Télécharger sans dépendances
pip download --no-deps package_name -d ./packages

# Télécharger pour autre plateforme
pip download --platform manylinux1_x86_64 --only-binary=:all: package_name

# Télécharger pour autre Python
pip download --python-version 3.9 package_name


[OK] INSTALL LOCAL & DÉVELOPPEMENT


# Installer depuis wheel local
pip install ./package-1.0-py3-none-any.whl

# Installer depuis tarball
pip install ./package-1.0.tar.gz

# Installer depuis dossier
pip install ./path/to/package/

# Install éditable (mode développement)
pip install -e .
pip install --editable .

# Install éditable avec extras
pip install -e .[dev]
pip install -e .[dev,test,docs]

# Install éditable depuis subdirectory
pip install -e ./src/mypackage

# Créer un wheel
pip install wheel
python setup.py bdist_wheel

# Créer source distribution
python setup.py sdist

# Build avec pyproject.toml (moderne)
pip install build
python -m build


[OK] INSTALL DEPUIS GIT


# Branche main/master
pip install git+https://github.com/user/repo.git

# Branche spécifique
pip install git+https://github.com/user/repo.git@branch-name

# Tag/Release
pip install git+https://github.com/user/repo.git@v1.0.0

# Commit spécifique
pip install git+https://github.com/user/repo.git@abc123def

# Avec subdirectory
pip install git+https://github.com/user/repo.git#subdirectory=pkg_dir

# SSH au lieu de HTTPS
pip install git+ssh://git@github.com/user/repo.git

# GitLab
pip install git+https://gitlab.com/user/repo.git

# Bitbucket
pip install git+https://bitbucket.org/user/repo.git

# En éditable depuis git
pip install -e git+https://github.com/user/repo.git#egg=package


[OK] INDEX & REPOSITORIES


# Index alternatif (remplace pypi.org)
pip install --index-url https://custom.pypi.org/simple package

# Index additionnel (complément de pypi.org)
pip install --extra-index-url https://custom.pypi.org/simple package

# Plusieurs index
pip install \
  --index-url https://primary.pypi.org/simple \
  --extra-index-url https://secondary.pypi.org/simple \
  package

# Chercher dans tous les index
pip install --find-links https://custom.pypi.org/simple package

# Trusted host (sans SSL)
pip install --trusted-host custom.pypi.org \
  --index-url http://custom.pypi.org/simple package


[OK] CACHE


# Lister le cache
pip cache list

# Informations sur le cache
pip cache info

# Vider tout le cache
pip cache purge

# Supprimer cache d'un package
pip cache remove package_name

# Désactiver cache pour une installation
pip install --no-cache-dir package_name

# Location du cache
pip cache dir

# Installer sans utiliser le cache
pip install --no-cache-dir -r requirements.txt


[OK] OPTIONS D'INSTALLATION AVANCÉES


# Install pour user seulement (sans sudo)
pip install --user package_name

# Install dans dossier spécifique
pip install --target=/custom/path package_name

# Install sans dépendances
pip install --no-deps package_name

# Force reinstall
pip install --force-reinstall package_name

# Ignore installed (réinstalle tout)
pip install --ignore-installed package_name

# Pre-release versions (alpha, beta, rc)
pip install --pre package_name

# Install depuis source (pas de wheels)
pip install --no-binary :all: package_name

# Install binaires seulement (pas de source)
pip install --only-binary :all: package_name

# Préférer binaires si disponibles
pip install --prefer-binary package_name

# Compiler extension C
pip install --global-option=build_ext package_name

# Pas d'isolation de build
pip install --no-build-isolation package_name

# Utiliser feature pip experimental
pip install --use-feature=fast-deps package_name


[OK] EXTRAS & FEATURES


# Installer avec extras
pip install package[extra]

# Multiples extras
pip install package[extra1,extra2,extra3]

# Exemples courants
pip install django[argon2]          # Hashing avancé
pip install celery[redis]           # Backend Redis
pip install requests[security]      # Sécurité SSL
pip install pytest[testing]         # Plugins de test
pip install sqlalchemy[postgresql]  # Driver PostgreSQL

# Dans requirements.txt
celery[redis,sqs,mongodb]
django[argon2,bcrypt]


[OK] CONFIGURATION pip


# Fichiers de config (par priorité):
# 1. Variables d'environnement: PIP_*
# 2. --config file
# 3. Virtuel env: $VIRTUAL_ENV/pip.conf
# 4. User: ~/.config/pip/pip.conf (Linux)
#         ~/.pip/pip.conf (Mac)
#         %APPDATA%\pip\pip.ini (Windows)
# 5. Global: /etc/pip.conf (Linux)
#           /Library/Application Support/pip/pip.conf (Mac)

# === pip.conf (Linux/Mac) ===
[global]
timeout = 60
index-url = https://pypi.org/simple
trusted-host = pypi.org
retries = 5

[install]
no-cache-dir = false
compile = no
no-warn-script-location = false

[freeze]
timeout = 10

[list]
format = columns

# === pip.ini (Windows) ===
# Même contenu mais extension .ini

# Utiliser config custom
pip install --config /path/to/pip.conf package_name

# Variables d'environnement
export PIP_INDEX_URL=https://custom.pypi.org/simple
export PIP_TRUSTED_HOST=custom.pypi.org
export PIP_TIMEOUT=60
export PIP_RETRIES=5
export PIP_NO_CACHE_DIR=1


[OK] PIPX (OUTILS CLI ISOLÉS)


# Installer pipx
pip install pipx
pipx ensurepath

# Installer outil CLI dans environnement isolé
pipx install black
pipx install flake8
pipx install pylint
pipx install poetry
pipx install cookiecutter

# Lister outils installés
pipx list

# Mettre à jour outil
pipx upgrade black
pipx upgrade-all

# Désinstaller outil
pipx uninstall black

# Exécuter sans installer
pipx run cowsay "Hello"
pipx run black --check myfile.py

# Installer avec extras
pipx install 'package[extra]'

# Réinstaller
pipx reinstall black

# Inject dependency dans outil
pipx inject black mypy


[OK] WHEEL


# Installer wheel support
pip install wheel

# Créer wheel depuis setup.py
python setup.py bdist_wheel

# Créer wheel depuis pyproject.toml
pip install build
python -m build --wheel

# Installer depuis wheel
pip install package-1.0-py3-none-any.whl

# Télécharger wheels
pip wheel package_name

# Créer wheels pour requirements
pip wheel -r requirements.txt -w ./wheelhouse

# Installer depuis wheelhouse
pip install --no-index --find-links=./wheelhouse package_name

# Wheel universel (Python 2/3)
# setup.cfg:
# [bdist_wheel]
# universal = 1


[OK] VIRTUAL ENVIRONMENTS


# Créer venv
python -m venv venv
python3 -m venv venv

# Activer (Linux/Mac)
source venv/bin/activate

# Activer (Windows)
venv\Scripts\activate

# Désactiver
deactivate

# Créer avec pip spécifique
python -m venv --system-site-packages venv

# Installer dans venv
pip install package_name

# Lister packages du venv seulement
pip list --local

# Freeze du venv
pip freeze --local > requirements.txt


[OK] pip-tools (GESTION DÉPENDANCES)


# Installer pip-tools
pip install pip-tools

# Créer requirements.in (dépendances high-level)
# === requirements.in ===
django
celery
requests

# Compiler requirements.txt avec versions pinnées
pip-compile requirements.in

# Mettre à jour requirements.txt
pip-compile --upgrade requirements.in

# Sync venv avec requirements.txt (installe/désinstalle)
pip-sync requirements.txt

# Dev requirements
pip-compile requirements-dev.in
pip-sync requirements.txt requirements-dev.txt


[OK] DÉPANNAGE & DEBUG


# Verbose (niveaux de détail)
pip install -v package_name      # Niveau 1
pip install -vv package_name     # Niveau 2
pip install -vvv package_name    # Niveau 3 (maximum)

# Mode debug
pip --debug install package_name

# Pas de couleur (pour logs)
pip --no-color install package_name

# Timeout custom
pip install --timeout=30 package_name

# Retries custom
pip install --retries=10 package_name

# Ignorer erreurs SSL ([ATTENTION] non recommandé)
pip install --trusted-host pypi.org \
  --trusted-host files.pythonhosted.org \
  package_name

# Tester connexion PyPI
pip search test 2>/dev/null || echo "Connexion échouée"

# Logs détaillés
pip install package_name 2>&1 | tee pip-install.log

# Vérifier checksums
pip install --require-hashes -r requirements.txt

# requirements.txt avec hashes:
# package==1.0.0 \
#   --hash=sha256:abc123...


[OK] SÉCURITÉ


# Vérifier vulnérabilités (nécessite safety)
pip install safety
safety check
safety check --json

# Audit avec pip-audit
pip install pip-audit
pip-audit
pip-audit -r requirements.txt

# Vérifier signatures
pip install --require-hashes -r requirements.txt

# Utiliser HTTPS seulement
pip install --index-url https://pypi.org/simple package

# Trusted packages seulement
pip install --trusted-host pypi.org package


[OK] PERFORMANCE


# Installation parallèle (expérimental)
pip install --use-feature=fast-deps package_name

# Désactiver cache (économiser espace)
pip install --no-cache-dir package_name

# Install binaires seulement (plus rapide)
pip install --only-binary :all: package_name

# Plusieurs workers
pip install --parallel 4 package_name


[OK] CI/CD & AUTOMATION


# GitHub Actions
# .github/workflows/ci.yml
# - name: Install dependencies
#   run: |
#     python -m pip install --upgrade pip
#     pip install -r requirements.txt

# GitLab CI
# .gitlab-ci.yml
# before_script:
#   - pip install --upgrade pip
#   - pip install -r requirements.txt

# Docker
# Dockerfile
# RUN pip install --no-cache-dir -r requirements.txt

# Makefile
# install:
# 	pip install -r requirements.txt
# 
# install-dev:
# 	pip install -r requirements/dev.txt


[OK] SCRIPTS UTILES


# Mettre à jour tous les packages (script Python)
"""
import subprocess
import json

result = subprocess.run(
    ['pip', 'list', '--outdated', '--format=json'],
    capture_output=True, text=True
)
packages = json.loads(result.stdout)

for pkg in packages:
    subprocess.run(['pip', 'install', '--upgrade', pkg['name']])
"""

# Nettoyer cache et réinstaller (Bash)
"""
#!/bin/bash
pip cache purge
pip uninstall -y -r <(pip freeze)
pip install -r requirements.txt
"""

# Générer requirements avec versions actuelles (Python)
"""
import pkg_resources
packages = [f"{d.project_name}=={d.version}" 
            for d in pkg_resources.working_set]
with open('requirements.txt', 'w') as f:
    f.write('\n'.join(sorted(packages)))
"""


[OK] ALTERNATIVES À pip


# Poetry (gestion moderne)
pip install poetry
poetry init
poetry add package_name
poetry install

# Pipenv (pip + venv combinés)
pip install pipenv
pipenv install package_name
pipenv shell

# Conda (scientifique)
conda install package_name

# PDM (PEP 582)
pip install pdm
pdm add package_name


[OK] BONNES PRATIQUES


# [OK] Toujours utiliser virtual environments
# [OK] Pin versions exactes en production (==)
# [OK] Use ranges en développement (>=,<)
# [OK] Séparer requirements (base, dev, prod, test)
# [OK] Utiliser pip-tools ou poetry pour lock files
# [OK] Vérifier vulnérabilités avec safety/pip-audit
# [OK] Mettre à jour pip: pip install --upgrade pip
# [OK] Utiliser requirements.txt en version control
# [OK] Documenter pourquoi chaque dépendance existe
# [OK] Audit régulier des dépendances inutilisées

# [X] Ne jamais utiliser sudo pip install
# [X] Ne jamais installer sans version en production
# [X] Ne pas commiter venv/ dans git
# [X] Ne pas mélanger conda et pip sans précaution
# [X] Ne pas ignorer les warnings de dépendances


[OK] COMMANDES COURANTES PAR SCÉNARIO


# Nouveau projet
python -m venv venv
source venv/bin/activate  # ou venv\Scripts\activate sur Windows
pip install --upgrade pip
pip install -r requirements.txt

# Ajouter package
pip install package_name
pip freeze > requirements.txt

# Déploiement production
pip install --no-cache-dir -r requirements.txt

# Développement local
pip install -r requirements/dev.txt
pip install -e .

# Tests CI/CD
pip install --upgrade pip
pip install -r requirements/test.txt
pytest

# Mise à jour dépendances
pip list --outdated
pip install --upgrade package_name
pip freeze > requirements.txt


[OK] ERREURS COURANTES & SOLUTIONS


# [X] Permission denied
[OK] Utiliser --user ou venv

# [X] Command not found: pip
[OK] python -m pip install ...

# [X] Could not find a version
[OK] Vérifier nom package, Python version, OS

# [X] No module named pip
[OK] python -m ensurepip --upgrade

# [X] SSL Certificate error
[OK] pip install --trusted-host pypi.org package

# [X] Requirement already satisfied
[OK] pip install --upgrade --force-reinstall

# [X] Cannot uninstall package (externally managed)
[OK] Utiliser venv ou --user ou --break-system-packages ([ATTENTION])


[OK] RESSOURCES


# Documentation officielle: https://pip.pypa.io/
# PyPI: https://pypi.org/
# pip-tools: https://github.com/jazzband/pip-tools
# Poetry: https://python-poetry.org/
# Pipenv: https://pipenv.pypa.io/
# Safety: https://github.com/pyupio/safety