Creaci贸n de utilidades de l铆nea de comandos con argparse de Python

    Introducci贸n

    La mayor parte del software de cara al usuario viene con una interfaz agradable a la vista o mediante una p谩gina web decorada. En otras ocasiones, un programa puede ser tan peque帽o que no garantiza una interfaz gr谩fica de usuario completa o una aplicaci贸n web para exponer su funcionalidad al usuario final.

    En estos casos, podemos crear programas a los que se pueda acceder mediante una interfaz de l铆nea de comandos o CLI.

    En esta publicaci贸n, exploraremos Python argparse y util铆celo para crear una herramienta de l铆nea de comandos sencilla que nos ayude a acortar las URL con rapidez.

    Interfaz de l铆nea de comandos

    Una interfaz de l铆nea de comandos es una interfaz de usuario basada en texto que proporciona un medio para interactuar con una computadora a trav茅s de comandos textuales. El programa que facilita esta interacci贸n al exponer la interfaz se conoce como int茅rprete de l铆nea de comandos o shell.

    Toma comandos en forma de entrada de texto, ejecuta programas basados 鈥嬧媏n la entrada proporcionada y luego muestra la salida en la interfaz. Hay muchas Shells disponibles, siendo las primeras las m谩s populares las C谩scara de Bourne y C shell para sistemas basados 鈥嬧媏n Unix. los Bourne Again Shell (tambi茅n conocido como bash) es una extensi贸n muy popular de Bourne Shell, junto con Shell de Korn (ksh).

    Tambi茅n vale la pena se帽alar que las CLI, al igual que otros programas, requieren cuentas de usuario para trabajar con ellas. El sistema impone permisos a estos usuarios para ayudar a controlar el nivel de acceso y el l铆mite de lo que un usuario puede lograr con el sistema. Esta distinci贸n es necesaria ya que el shell es una interfaz entre el usuario y el n煤cleo del sistema operativo que controla todas las operaciones de la computadora. El acceso a esta funcionalidad debe restringirse para evitar el uso malintencionado de la interfaz de l铆nea de comandos.

    Las CLI ofrecen un mensaje, que suele ser un signo de d贸lar ($) que indica que puede ingresar su comando. Sin embargo, este mensaje tambi茅n indica que el comando ingresado se ejecutar谩 sin acceso de root.

    Cuando se concede acceso de ra铆z al usuario actual que interact煤a con la CLI, el mensaje cambia a un signo de almohadilla (#).

    Si bien las interfaces gr谩ficas de usuario (GUI) son m谩s f谩ciles de aprender y visualmente m谩s intuitivas, las CLI permiten a los usuarios interactuar con el software usando solo un teclado, lo que puede resultar en un rendimiento m谩s r谩pido. Las CLI tambi茅n consumen menos recursos inform谩ticos en comparaci贸n con las GUI, lo que las hace m谩s ligeras y r谩pidas.

    Scripting

    La mayor铆a de los int茅rpretes de l铆nea de comandos se env铆an con algunos comandos b谩sicos que pueden invocarse a trav茅s de la interfaz de l铆nea de comandos para realizar tareas espec铆ficas. Algunos comunes incluyen:

    • uptime: Indica cu谩nto tiempo ha estado encendida la computadora
    • date: Devuelve la fecha y hora actuales.
    • ls: Devuelve una lista de todos los archivos y carpetas de un directorio.
    • cd: Se utiliza para pasar de un directorio a otro
    • pwd: Se utiliza para mostrar el directorio de trabajo actual
    • man: Se utiliza para mostrar el manual o las instrucciones de cualquier comando.
    • touch: Se utiliza para crear archivos nuevos y vac铆os
    • mkdir: Se utiliza para crear nuevos directorios

    Un script de shell es un programa dise帽ado para ser ejecutado por un int茅rprete de l铆nea de comandos. Contiene una serie de comandos, como los enumerados anteriormente, junto con variables y condiciones que instruyen al shell sobre qu茅 tarea o tareas realizar.

    A trav茅s de los scripts de shell, un usuario puede ejecutar m煤ltiples comandos en r谩pida sucesi贸n sin la necesidad de recordarlos todos. Se utilizan principalmente para lograr operaciones repetitivas sin la entrada repetitiva de comandos, por lo tanto, reduciendo el esfuerzo requerido por el usuario final.

    Podemos escribir scripts de shell que constan de los comandos de shell que se ejecutar谩n, pero tambi茅n podemos ejecutar otros lenguajes de alto nivel, como Python y JavaScript.

    驴Qu茅 es argparse?

    Un script de shell de Python es simplemente un programa Python normal que ejecuta el int茅rprete de l铆nea de comandos. Al ejecutar un script de shell, los argumentos se pasan a nuestro script a trav茅s de sys.argv. Esta variable es una lista de los argumentos pasados 鈥嬧媋 nuestro programa, incluido el nombre del script, que tambi茅n es el primer argumento.

    Normalmente, podemos escribir un script simple que no requiera argumentos adicionales, como un script simple para mostrar la fecha actual. Sin embargo, esto limitar谩 la funcionalidad que podemos ofrecer. Para hacer nuestros scripts m谩s vers谩tiles y ampliar el alcance de su uso, tenemos que facilitar la personalizaci贸n a trav茅s de argumentos que brinden al usuario m谩s control y opciones en t茅rminos de funcionalidad.

    los argparse El m贸dulo nos ayuda a analizar los argumentos pasados 鈥嬧媍on nuestro script y procesarlos de una manera m谩s conveniente. Tambi茅n agrega funciones de personalizaci贸n como nombrar nuestro programa y agregar descripciones de una manera m谩s sencilla.

    argparse tambi茅n nos proporciona un medio para personalizar las instrucciones de uso de nuestro script e indicar qu茅 argumentos son necesarios y cu谩les son opcionales. Para explorar todas estas caracter铆sticas y m谩s, crearemos nuestra propia utilidad CLI de Python en la siguiente secci贸n.

    Aplicaci贸n de demostraci贸n

    Actualmente, si queremos acortar una URL, necesitaremos iniciar un navegador y navegar a un sitio de acortamiento de URL para realizar la tarea. Nuestro objetivo es acelerar y mejorar este proceso de acortamiento de URL a trav茅s de un script que podemos iniciar en cualquier momento en nuestro terminal. Solo tendremos que pasar las URL que necesitamos acortar como argumentos y recibir las URL acortadas como respuesta.

    Para esta demostraci贸n, usaremos Shorte.st como nuestro proveedor ya que su API es simple y directa.

    Despu茅s de crear una cuenta, podemos ir a la secci贸n Herramientas de enlace y seleccionar API de desarrolladores. Aqu铆 encontraremos nuestro token de acceso y la URL que usar谩 nuestro script para acortar nuestras URL.

    Una vez que el usuario proporciona una URL a nuestra utilidad de l铆nea de comandos para que se acorte, enviaremos la URL al punto final de la API de Shorte.st junto con nuestro token de acceso. La respuesta ser谩 nuestra URL abreviada y un mensaje de estado.

    Comencemos por crear un entorno virtual e instalar el m贸dulo de solicitudes, que usaremos para enviar solicitudes HTTP a la API:

    $ mkdir pyshortener && cd pyshortener
    $ virtualenv --python=python3 env --no-site-packages
    $ source env/bin/activate
    $ pip install requests
    

    En la primera l铆nea anterior hemos combinado dos comandos en uno usando el doble ampersand (&&). Esto nos permite ejecutar los comandos en secuencia, a menos que el primer comando falle, lo que evita que se ejecute el segundo comando.

    Despu茅s de crear nuestro entorno virtual y activarlo, instalamos nuestra dependencia de Python.

    Para esta demostraci贸n, primero crearemos nuestra funci贸n de acortamiento y luego ajustaremos su funcionalidad usando argparse en el gui贸n final:

    import requests
    from requests.exceptions import ConnectionError
    import json
    
    def shorten_url(url):
        try:
            response = requests.put("https://api.shorte.st/v1/data/url",
                                    {"urlToShorten": url},
                                    headers={"public-api-token": "[MY-API-TOKEN]"})
    
            api_response = json.loads(response.content)
    
            return {"status": api_response['status'],
                    "shortenedUrl": api_response['shortenedUrl'],
                    "message": "URL shortened successfully"}
    
        except ConnectionError:
            return {"status": "error",
                    "shortenedUrl": None,
                    "message": "Please ensure you are connected to the internet and try again."}
    
    shorten_url(www.Pharos.sh.com)
    

    Nuestra funci贸n toma una URL y la env铆a a la API de Shorte.st y devuelve la URL abreviada. Acortemos www.Pharos.sh.com ejecutando nuestro script:

    $ python pyshortener.py
    {'status': 'ok', 'shortenedUrl': 'http://gestyy.com/w6ph2J', 'message': 'URL shortened successfully'}
    

    Como podemos ver, nuestra funci贸n funciona pero la salida es menos que ideal. Tambi茅n tenemos que codificar la URL en el propio script, lo que nos da una entrada y salida fija.

    Vamos a llevar esto un paso m谩s all谩 y permitir que los usuarios pasen la URL como argumento cuando ejecuten el script. Para hacer esto, ahora presentaremos argparse para ayudarnos a analizar los argumentos proporcionados por el usuario:

    import requests
    from requests.exceptions import ConnectionError
    import json
    import argparse # Add the argparse import
    
    def shorten_url(url):
        # Code stays the same...
    
    # Create a parser
    parser = argparse.ArgumentParser(description='Shorten URLs on the terminal')
    
    # Add argument
    parser.add_argument('--url', default="google.com", help="The URL to be shortened")
    args = vars(parser.parse_args())
    print(args)
    

    En esta versi贸n del script, no llamamos shorten_url, sino que imprima los argumentos capturados y analizados por argparse.

    Empezamos creando un ArgumentParser objeto usando argparse, que contendr谩 toda la informaci贸n necesaria para transformar los argumentos pasados 鈥嬧媏n tipos de datos de Python con los que podamos trabajar.

    Despu茅s de crear el analizador, ahora podemos agregar argumentos usando parser.add_argument(). Esta funci贸n permite especificar la siguiente informaci贸n sobre nuestros argumentos:

    • El primer argumento es un nombre o una bandera que se usa para identificar nuestros argumentos. Los argumentos opcionales se identifican por - prefijo, en nuestro caso --url es un argumento opcional.
    • los default La opci贸n permite especificar un valor predeterminado cuando el usuario no ha proporcionado el argumento.
    • los help La opci贸n describe brevemente cu谩l es el argumento.
    • Tambi茅n podemos utilizar el choice opci贸n para especificar valores permitidos para un argumento, como s铆 y no.
    • A trav茅s de un type Tambi茅n podemos especificar el tipo al que se convertir谩 nuestro comando, por ejemplo, convertir argumentos en n煤meros enteros.

    Cuando ejecutamos nuestro script sin proporcionar ning煤n argumento, la URL predeterminada es “google.com”, tal como lo configuramos en el add_argument m茅todo:

    $ python pyshortener.py
    {'url': 'google.com'}
    

    Ahora cuando pasamos www.Pharos.sh.com utilizando el --url bandera, se establece como el valor de la url llave:

    $ python pyshortener.py --url www.Pharos.sh.com
    {'url': 'www.Pharos.sh.com'}
    

    Ahora podemos recibir la URL de un usuario a trav茅s de la l铆nea de comando y acortarla modificando nuestro script:

    if args.get('url'):
       print(shorten_url(args['url']))
    

    Cuando lo ejecutamos y pasamos una URL, deber铆amos recibir el resultado de la API Shorte.st:

    $ python pyshortener.py --url Pharos.sh.com
    {'status': 'ok', 'shortenedUrl': 'http://gestyy.com/w6pk2R', 'message': 'URL shortened successfully'}
    

    Aunque nuestra salida no es tan amigable como nos gustar铆a, as铆 que creemos una funci贸n para formatear nuestra salida de una manera m谩s deseable:

    def handle_output(result):
       """ Function to format and print the output
       """
       if result["status"] == "ok":
           print(f"{result['message']}. Your shortened URL is:n"
                 f"t{result['shortenedUrl']}")
       elif result["status"] == "error":
           print(f"{result['message']}")
    
    # Receive and process the argument
    args = vars(parser.parse_args())
    
    if args.get('url'):
       result = shorten_url(args['url'])
       handle_output(result)
    

    Cuando ejecutamos nuestro script una vez m谩s:

    $ python pyshortener.py --url www.Pharos.sh.com
    URL shortened successfully. Your shortened URL is:
            http://gestyy.com/w6pk2R
    

    Nuestra salida ahora es m谩s f谩cil de usar debido a la adici贸n de handle_output() funci贸n. Para ver como argparse ha generado el texto de ayuda para nuestro script, podemos ejecutar nuestro script con el -h bandera para mostrar el texto de ayuda de la siguiente manera:

    $ python pyshortener.py -h
    usage: pyshortener.py [-h] [--url URL]
    
    Shorten URLs on the terminal
    
    optional arguments:
      -h, --help  show this help message and exit
      --url URL   The URL to be shortened
    

    Conclusi贸n

    Hemos creado un script de shell usando Python para ayudarnos a acortar las URL r谩pidamente en la terminal. Hemos utilizado el argparse m贸dulo para analizar los argumentos que se pasan a nuestro script e incluso definen un valor predeterminado en caso de que se proporcione el argumento.

    Nuestro script ahora tambi茅n tiene un hermoso mensaje de ayuda que se puede mostrar usando el -h bandera que fue generada por el argparse m贸dulo, lo que significa que no tuvimos que escribirlo manualmente.

    El siguiente paso ser铆a mejorar nuestro script para aceptar una lista de URL o leer URL de un archivo de texto para facilitar el acortamiento por lotes de URL.

    Se puede encontrar el c贸digo fuente del script en este proyecto. aqu铆 en Github.

    Etiquetas:

    Deja una respuesta

    Tu direcci贸n de correo electr贸nico no ser谩 publicada. Los campos obligatorios est谩n marcados con *