Búsqueda PIP

Trucos y Utilidades 1 de sep. de 2025

El paquete pip y sus sucesores pip3, ya no permiten realizar busquedas usando pip search, y muestran el siguiente error:

ERROR: XMLRPC request failed [code: -32500]
RuntimeError: PyPI no longer supports 'pip search' (or XML-RPC search). 
Please use https://pypi.org/search (via a browser) instead. 
See https://warehouse.pypa.io/api-reference/xml-rpc.html#deprecated-methods for more information.

Debido a que en algunos servidores no disponemos de entorno gráfico y unicamente disponemos de un terminal, este proyecto personal es para poder buscar un paquete Python a partir de un patron de texto y además poder obtener información del paquete localizado, todo ello desde la consola.

Busqueda pip_busca

El programa pip_busca está escrito en Python y localiza en la bbdd de internet todos los paquetes que cumplan con la cadena de texto indicada en la busqueda.

pip_busca 

══════════════════════════════════════════════════════════════
Uso: pip_busca <cadena_busqueda>

Busca paquetes en PyPI cuyo nombre contenga la cadena indicada
Ejemplo: pip_busca ansi
══════════════════════════════════════════════════════════════
  • Ejemplo: Buscar todos los modulos ó aplicaciones python que contengan cobol
    Usaremos: pip_busca cobol:
Localizar aplicaciones/módulos Python que contengan "cobol"

Información pip_info

El programa pip_info esta escrito en Bash y obtiene la información relevante del paquete indicado, el nombre debe de indicarse exactamente, ya que no realiza busquedas de paquetes.

Si necesita localizar el paquete exacto deberá de usar pip_busca
/pip_info --help
════════════════════════════════════════════════════════════════════════════════
Uso: pip_info <nombre_paquete> [--all]

Opciones:
  --all     Muestra todas las versiones disponibles (incluye alphas, betas, etc.)

Por defecto, se muestran las últimas 10 versiones estables.
Nota: Se indica entre paréntesis la version de Python requerida
════════════════════════════════════════════════════════════════════════════════
  • Ejemplo: Obtener información del paquete/modulo pip
    Usaremos: pip_info pip:

INSTALACIÓN

Debian (y derivados) mediante .deb

  1. Descargar el fichero pipbusqueda.deb
  2. Cambiarse al directorio de descarga
  3. Instalarlo: sudo apt install ./pipbusqueda.deb

Manual

  1. Descargar los ficheros pip_busca y pip_info
  2. Poner permisos de ejecución: chmod +x pip_busca pip_info
  3. Copiarlos a /usr/local/bin/: sudo cp pip_* /usr/local/bin/

Repositorio

El repositorio con todo el código fuente lo teneis disponible en mi repositorio GIT autoalojado:

pip_busqueda
pip_busqueda

PIP_BUSQUEDA en mi repositorio personal autoalojado

En detalle son dos scripts, uno en python para la búsqueda y otro en bash para obtener información. Ambos son mejorables, tanto a la hora de obtener información o en velocidad...

Os dejo el codigo de ambos programas, en caso de que no querais entrar al repositorio a ver el código.

pip_busca:

#!/usr/bin/env python3
'''
Author: LuisGuLo
Release: v1.6
ChangeLog:
    v1.6: Peticion simple y extraccion
    v1.5: browsers de consola y dumps
    v1.4: Uso de requests-html
    v1.3: Modulos y venv
    v1.2: Peticion con user-agent
    v1.1: Peticion web mediante query
    v1.0: PoC inicial bash. Cambio a python.
'''
import sys
import requests
from bs4 import BeautifulSoup

def mostrar_ayuda():
    print("══════════════════════════════════════════════════════════════")
    print("Uso: pip_busca <cadena_busqueda>")
    print("\nBusca paquetes en PyPI cuyo nombre contenga la cadena indicada")
    print("Ejemplo: pip_busca ansi")
    print("══════════════════════════════════════════════════════════════")

if len(sys.argv) < 2 or sys.argv[1] in ["--help", "-h"]:
    mostrar_ayuda()
    sys.exit(0)

busqueda = sys.argv[1].lower()
url = "https://pypi.org/simple/"

try:
    response = requests.get(url)
    response.raise_for_status()
except requests.RequestException as e:
    print(f"❌ Error al conectar con PyPI: {e}")
    sys.exit(1)

soup = BeautifulSoup(response.text, "html.parser")
paquetes = [a.text for a in soup.find_all("a")]
coincidentes = [p for p in paquetes if busqueda in p.lower()]

print(f"\n🔍 Paquetes que contienen '{busqueda}':\n")
if not coincidentes:
    print("❌ No se encontraron coincidencias.")
else:
    for nombre in coincidentes:
        print(f"📦 {nombre}")

pip_info:

#!/bin/bash
: ' ---
 Author: Luis GuLo
 Release: 1.3
 Changelog:
 	1.3: Mostrar version Python requerida
 	1.2: Ayuda + Mostrar por defecto 10 ultimas versiones disponibles, con opcion a todas
 	1.1: Compactar salida de todas las versiones disponibles
 	1.0: Localizar paquete y mostrar ultima version + disponibles
---'

mostrar_ayuda() {
  echo "════════════════════════════════════════════════════════════════════════════════"
  echo "Uso: $0 <nombre_paquete> [--all]"
  echo ""
  echo "Opciones:"
  echo "  --all     Muestra todas las versiones disponibles (incluye alphas, betas, etc.)"
  echo ""
  echo "Por defecto, se muestran las últimas 10 versiones estables."
  echo "Nota: Se indica entre paréntesis la version de Python requerida"
  echo "════════════════════════════════════════════════════════════════════════════════"
}

# Verifica si se pidió ayuda
if [[ "$1" == "--help" || "$1" == "-h" ]]; then
  mostrar_ayuda
  exit 0
fi

# Verifica que se haya pasado un nombre de paquete
if [ -z "$1" ]; then
  echo "❌ Error: Debe indicar el nombre del paquete."
  mostrar_ayuda
  exit 1
fi

PAQUETE="$1"
# Verificar orden: paquete + opcion
if [ "$PAQUETE" == "--all" ] ; then
  echo  "❌ Error: Orden en sintaxis obligatoria."
  mostrar_ayuda
  exit 0
fi

URL="https://pypi.org/pypi/$PAQUETE/json"
RESPUESTA=$(curl -s "$URL")

# Verifica si la respuesta contiene información válida
if echo "$RESPUESTA" | grep -q '"info"'; then
  NOMBRE=$(echo "$RESPUESTA" | jq -r '.info.name')
  VERSION=$(echo "$RESPUESTA" | jq -r '.info.version')
  DESCRIPCION=$(echo "$RESPUESTA" | jq -r '.info.summary')
  echo "📦 Paquete: $NOMBRE"
  echo "🔢 Última versión: $VERSION"
  echo "📝 Descripción: $DESCRIPCION"

#  echo -e "\n📚 Versiones disponibles:"

mostrar_versiones() {
  echo "$RESPUESTA" | jq -r '.releases | to_entries[] | "\(.key) \(.value[0].requires_python // "N/A")"' \
    | grep -E '^[0-9]+\.[0-9]+\.[0-9]+ ' \
    | sort -k1 -V -r \
    | head -n 10 \
    | awk '{printf "%s (%s) ", $1, $2}'
  echo
}

mostrar_todas_versiones() {
  echo "$RESPUESTA" | jq -r '.releases | to_entries[] | "\(.key) \(.value[0].requires_python // "N/A")"' \
    | sort -k1 -V -r \
    | awk '{printf "%s (%s) ", $1, $2}'
  echo
}

  if [[ "$2" == "--all" ]]; then
  	echo -e "\n📚 Versiones disponibles:"
    #echo "$RESPUESTA" | jq -r '.releases | keys[]' | sort -V -r | xargs
	mostrar_todas_versiones
  else
  	echo -e "\n📚 Ultimas 10 Versiones estables disponibles:"
    #echo "$RESPUESTA" | jq -r '.releases | keys[]' \
    #  | grep -E '^[0-9]+\.[0-9]+\.[0-9]+$' \
    #  | sort -V -r \
    #  | head -n 10 \
    #  | xargs
	mostrar_versiones
  fi
else
  echo "❌ No se encontró información para el paquete '$PAQUETE'"
fi

Etiquetas

Luis GuLo

🐧 SysAdmin GNU/Linux - 🐳 Docker - 🖥️ Bash Scripting - 🐪 Perl - 🐬 MySQL - 👥 Formador de TI - 👥 Formador de SysAdmin's - 💢 Ansible - ☁️ Cloud Computing - ❤️ Debian GNU/Linux