Crear un CLI en Python con Click es más claro y mantenible cuando organizas bien tu proyecto, defines comandos con decoradores y configuras setup.py para instalar un ejecutable. Aquí tienes el esqueleto base: estructura de archivos, comandos create/list/update/delete y un flujo de instalación editable en un virtualenv.
¿Cómo organizar la estructura de archivos en Python para un CLI con Click?
Diseñar con múltiples archivos hace el código más legible y escalable. Un subdirectorio funciona como módulo en Python y agrupa responsabilidades específicas.
Un directorio raíz para el proyecto.
Un archivo de entrada: PV.py como punto de entrada del CLI.
Subdirectorios como módulos: agrupan funciones relacionadas.
Responsabilidad única por archivo: hace el mantenimiento más simple.
¿Qué comandos y decoradores definen el CLI de clientes?
Los decoradores de Click convierten funciones en comandos. Se usa @click.group() para declarar un grupo y @clients.command() para registrar subcomandos. Con @click.pass_context se recibe un contexto mutable; aquí se inicializa como diccionario literal vacío.
¿Cómo inicializar el contexto con click pass context?
En tu punto de entrada se importa Click, se define un group y se inicializa el objeto contexto:
# PV.pyimport click
@click.group()@click.pass_contextdefCLI(ctx):# inicializar el contexto como diccionario literal vacío ctx.obj ={}# registrar el grupo de clientes desde el módulo clients.commandsfrom clients import commands as clients_commands
CLI.add_command(clients_commands.all)
Puntos clave:
ctx.obj = {}: contexto listo para compartir datos entre comandos.
Legibilidad: se importa clients.commands como alias y se registra con add_command.
¿Cómo convertir funciones en comandos del grupo clients?
Define el grupo clients y sus comandos básicos. Los docstrings alimentan la ayuda de Click, es decir: la interfaz basada en texto del CLI.
# clients/commands.pyimport click
@click.group()defclients():"""Manages the client's life cycle."""pass# placeholder para evitar error@clients.command()@click.pass_contextdefcreate(ctx, name, company, email, position):"""Create a new client."""pass@clients.command("list")# evitar colisión con palabra reservada list@click.pass_contextdeflist_cmd(ctx):"""List all clients."""pass@clients.command()@click.pass_contextdefupdate(ctx, uid):"""Updates a client."""pass@clients.command()@click.pass_contextdefdelete(ctx, uid):"""Delete a client."""pass# alias para registrar todo el grupo desde PV.pyall= clients
Detalles importantes:
Decoradores: @clients.command() marca cada función como comando.
Docstrings como ayuda: Click los muestra en --help.
Convención de espacios: dos líneas en blanco entre funciones de nivel módulo.
Alias all: simplifica el registro del grupo completo.
¿Cómo instalar y ejecutar el comando con setup.py y un virtualenv?
La instalación convierte tu CLI en un ejecutable del sistema: sin invocar directamente al intérprete de Python. Se declara el nombre del comando, la versión y el entry point hacia CLI dentro de PV.py.
Ejemplo mínimo de setup.py:
# setup.pyfrom setuptools import setup
setup( name='PV',# nombre del comando instalado version='0.1',# versión semántica py_modules=['PV'],# módulo de entrada install_requires=['click',# dependencia principal], entry_points={'console_scripts':['PV=PV:CLI',# comando=modulo:funcion_de_entrada],},)
Instalar en modo editable dentro de un virtualenv permite ver cambios al instante:
# crear y activar el ambiente virtualvirtualenv -p python3 venv
source venv/bin/activate
# instalar en modo editablepip install --editable .# verificar e inspeccionar la ayudawhich PV
PV --help
PV clients --help
Qué observarás al usar --help:
Uso y opciones del comando raíz.
El grupo clients con su descripción: "Manages the client's life cycle".