¡Acceso ilimitado 24/7 a todos nuestros libros y vídeos! Descubra la Biblioteca Online ENI. Pulse aquí
¡Acceso ilimitado 24/7 a todos nuestros libros y vídeos! Descubra la Biblioteca Online ENI. Pulse aquí
  1. Libros
  2. Scripting Python en Linux
  3. Ejemplos
Extrait - Scripting Python en Linux Desarrolle sus herramientas de sistema
Extractos del libro
Scripting Python en Linux Desarrolle sus herramientas de sistema Volver a la página de compra del libro

Ejemplos

Introducción

Los juegos son algo natural para un ser humano, pero cuando se trata de jugar con una computadora, las cosas se complican. Y es en estos casos complejos cuando nos damos cuenta de que Python proporciona soluciones comprensibles y legibles, incluso cuando somos nuevos en el lenguaje.

Este capítulo comienza con dos ejemplos basados en juegos de cartas que, casualmente, profundizan en el uso de listas y diccionarios.

A continuación, vuelve a ponerse serio con un ejemplo de generación de una estructura de árbol de archivos, con nombre y contenido aleatorios.

Luego veremos un pequeño script que se ha utilizado muchas veces en sistemas para analizar el uso de un servidor, durante un mes.

Y para análisis más profundos, ¿por qué no una instantánea de los procesos en curso, donde la mayor parte de la información estaría en una base de datos?

Este capítulo termina con un ejemplo que agrupa varios módulos, incluidos WSGI, Bottle y Jinja, que intenta mejorar la presentación estándar de la página de índice de Apache.

Python Batalla

Para empezar, aquí tiene un pequeño ejemplo sencillo para relajarse: el juego de la batalla.

Todo el mundo lo conoce, pero aquí hay un pequeño recordatorio: repartimos las cartas a partes iguales, sin mirar las nuestras, y al mismo tiempo, cada jugador presenta la carta en la parte superior de su mazo. Quien tenga la carta más alta lo gana todo, uniendo lo ganado a su mazo. Si las cartas son iguales, cada jugador agrega una más boca abajo y una boca arriba en la parte superior; el que presente la carta más alta lo gana todo.

Incluso si este juego parece simple, aún hay que modelarlo todo.

En el siguiente ejemplo, el programa juega contra sí mismo.

Primer paso: tiene que empezar creando la baraja de cartas.

Una carta es una tupla con un valor (As, Rey, Reina, etc.) y un color (Corazones, Picas, Tréboles o Diamantes).

Para crear una baraja de 52 cartas, debe calcular todas las tuplas de todos los valores para todos los colores.

De hecho, es un bucle dentro de otro bucle.

for valor in valor_carta  
   for color in simbolo  
          paquete.append( (valor, color) ) 

o una expresión de lista:

Juego_52_Cartas = [  
       (valor, color)  
           for valor in valor_carta  
                  for color in simbolo  
           ] 

para obtener...

Python, verificación de una mano de póquer

En el mismo estilo que en el ejemplo anterior, aquí se explica cómo determinar el valor de una mano en el póquer.

El póquer también es un juego simple.

A cada jugador se le reparten cinco cartas (la mano) y algunas combinaciones son más fuertes que otras.

Las combinaciones pueden ser escalera, parejas y tríos, color (no negro ni rojo, sino Corazones, Picas, Diamantes o Tréboles), etc.

Un color no es más fuerte que otro, por ejemplo el Rey de picas tiene el mismo valor que el Rey de corazones.

El valor de una combinación depende también del rango de las cartas que la componen.

Por tanto, una pareja de Ases es mayor que una pareja de Ochos.

Aquí se indica el rango de las cartas, de las más pequeña a la más fuerte:

Dos, Tres, Cuatro, Cinco, Seis, Siete, Ocho, Nueve, Diez, Jota, Dama, Rey, As.

Y aquí está la lista de manos del póquer:

Escalera real

Una escalera del mismo color partiendo del As.

Escalera de color

Una escalera del mismo color.

Póquer

Cuatro cartas idénticas, siendo el As la carta más fuerte.

Full

Un trío y una pareja.

Color

Cinco cartas del mismo color.

Escalera

Cinco cartas consecutivas sin tener en cuenta el color.

Trío

Tres cartas del mismo rango.

Dobles parejas

Dos parejas de cartas del mismo rango.

Pareja

Dos cartas de mismo rango.

Carta más alta

Si no es posible ninguna combinación, entonces la mano es igual al rango de la carta más alta.

En primer lugar, como en el ejemplo anterior, debe crear el paquete de 52 tarjetas. Y a efectos del póquer, también es necesario crear la lista de posibles escaleras. Hay nueve.

Luego barajamos y distribuimos las cartas a cada jugador.

Luego evaluamos la mano de cada jugador.

Para eso, necesitamos dos diccionarios: uno para los valores y otro para los colores.

En estos diccionarios almacenaremos las ocurrencias de valores de cartas y colores, el número de Ases, Reyes, Damas, etc. el número de Corazones...

Generación de archivos y directorios aleatoria

Muy a menudo, sería conveniente tener suficientes directorios y archivos disponibles para realizar pruebas.

Por supuesto, es posible recuperar copias de seguridad, utilizar archivos de compañeros, pero esto a veces puede estar mal visto.

Además, si tiene una gestión estricta y obligatoria del RGPD, estará obligado a declarar este tipo de tratamientos.

A continuación se mostrará una pequeña utilidad para generar de forma aleatoria una estructura de árbol de directorios, con archivos nombrados aleatoriamente y con el contenido en sí mismo también aleatorio.

Su uso es simple: primero, ajuste los parámetros en el script, luego ejecútelo.

A continuación se muestra la descripción de los parámetros:

Argumento

Defecto

Descripción

max_rep

5

Número máximo de directorios base generados aleatoriamente

max_files

5

Número máximo de archivos generados aleatoriamente por directorio

MAX_NIVEL

3

Nivel máximo de árbol

PC_CR_NIVEL

40

Porcentaje de creación de nivel

0 = siempre / 100 = nunca

40 es un valor medio

BLOQUE

1 MB

Tamaño de bloque en bytes para crear archivos

MAX_BLOQUE

5

Tamaño máximo generado aleatoriamente para un archivo, expresado en número de bloques

A continuación se muestra el script:

#archivo: fake_rep.py  
  
import os  
import random  
from pathlib import Path  ...

Gráfica de utilización de un servidor durante un mes

En general, lo bueno de Linux y de Unix es la capacidad de encontrar soluciones a problemas actuales, incluso complejos, con herramientas básicas.

A continuación, se mostrará cómo proporcionar un buen asesoramiento, basado en un enfoque científico con gráficos de apoyo. Por lo general, esto tranquiliza al cliente, tanto si tiene conocimientos de informática o no. El objetivo no es engañarlo, sino proporcionar un análisis científico basado en datos.

Muy a menudo, cuando se ofrece una arquitectura a un cliente, se instala y luego se pone en producción, sucede que el ser humano se acostumbra a los tiempos de respuesta. Y después de unos días/meses/años de funcionamiento, este ser humano puede volverse excesivamente sensible a la más mínima desviación de las operaciones diarias. En algunos, esto desencadena la ansiedad del "problema de rendimiento".

Generalmente, la discusión es de este estilo:

<rrrriiiinnnng>

<yo> Hola, ¿qué puedo hacer para ayudarle?

<cliente> Tengo un problema de rendimiento.

<yo> ¿Ah? ¿Y qué va lento?

<cliente> Todo.

(Pulsaciones en el teclado...)

<yo> Espere, me estoy conectando. Pero no, no veo nada particularmente lento.

<cliente> Sí, sí, se lo aseguro y, sin embargo, estoy seguro de que no se ha cambiado ni actualizado nada en mucho tiempo.

<yo> Ya, sepa esto, hay algo que cambia TODOS los días.

<cliente> ¿De verdad? Pero ¿qué?

<yo> El volumen de datos ... y cuanto más volumen hay, más se puede ralentizar el funcionamiento general.

Pero bueno, este es un fenómeno normal. Recuperaré las estadísticas de uso de su servidor y haremos un balance.

Le volveré a llamar.

<Cuelgo>

Y entonces, para validar el lado científico de su enfoque, nada mejor que un magnífico gráfico de las estadísticas de SAR (System Activity Report), bien presentado, con algunas frases explicativas.

Su cliente saldrá tranquilo de que ha tomado la decisión acertada y, además, puede demostrárselo a su dirección.

A continuación se muestra un ejemplo de gráfico:...

psutil análisis de la información de los procesos

A continuación se muestra un script que permite almacenar información sobre los procesos en una base de datos.

En algunos casos, puede resultar interesante congelar la información para un análisis posterior.

Este es el propósito de proc2db.py, que recopilará información sobre los procesos en ejecución.

Sin embargo, para obtener cierta información, hay que ser ’root’. Y cuando usamos un comando sudo o su, perdemos el entorno virtual con el intérprete de Python.

La técnica consiste en lanzar un comando ’sudo bash’ y luego obtener el script ’activate’ del entorno necesario, para finalmente ejecutar el script en modo "super user".

Ejemplo

$ sudo bash  
# source /home/chris/.virtualenvs/<entorno>/bin/activate 

El script es bastante simple. Solo es cuestión de declarar una base de datos con SQLAlchemy, después de la definición de las tablas que pueden contener toda la información que puede proporcionar el módulo psutil.

La tabla principal es la tabla PROC, que contiene información básica del proceso.

A continuación vienen las tablas secundarias:

CPUTIME

El detalle del uso de la CPU para este proceso.

MEMORY

El detalle de la memoria utilizada para este proceso.

OPENFILE

Los archivos abiertos por este proceso.

PIO

Estadísticas de entradas/salidas del proceso.

THREADS

El detalle de los threads para este proceso.

A continuación se muestra el script:

## ==================================================  
## Utilización de SQL Alchemy + PSUTIL  
## ==================================================  
  
import os  
import sys  
  
from sqlalchemy import sql  
from sqlalchemy import Column, ForeignKey  
from sqlalchemy import Integer, String, DateTime, Date, Numeric, 
BigInteger, Float  
from sqlalchemy import Text  
from sqlalchemy.ext.declarative import declarative_base  
from sqlalchemy.orm import relationship  
from sqlalchemy import create_engine  
from sqlalchemy.orm import sessionmaker  
  
import datetime  
import random  
# archivo: psutil/proc2db/proc2db.py  
  
import csv  ...

Mejorar Apache Index Of

En una organización pequeña, muy a menudo, la división de tareas suele ser más flexible que en un gran departamento de informática. Por tanto, la disponibilidad o gestión de los medios de instalación, corresponde a los responsables de la instalación.

Afortunadamente, ahora es suficiente con descargar los archivos ISO equivalentes de DVD y CD-ROM de hace unos años.

Pero en una pequeña estructura dividida en diferentes entidades, lo mejor es disponer de un pequeño sitio servido por Apache, para que todos puedan usarlo según sus necesidades.

Muchos hosts ofrecen un espacio por un coste ridículo y una interfaz para administrar dominios y subdominios de manera muy sencilla.

Pero un Apache predeterminado proporciona una interfaz como esta:

images/16ei02.png

Index Of estándar

Es funcional, pero ahora que conocemos Python, deberíamos poder hacerlo mejor.

1. WSGI

En primer lugar, nos hubiera gustado crear un script CGI (Common Gateway Interface) en Python, pero no estaba realmente actualizado.

Hoy en día existen muchas GI (Gateway Interface), incluida una para el lenguaje Python.

El host (IONOS, https://www.ionos.es/), aunque especializado en PHP, permite declarar una interfaz WSGI en un subdominio.

La Web Server Gateway Interface (WSGI), es una especificación que define una interfaz entre los servidores y las aplicaciones web para el lenguaje Python (fuente: https://es.wikipedia.org/wiki/Interfaz_de_entrada_com%C3%BAn).

En pocas palabras, se trata de una interfaz estandarizada con una aplicación Python, que espera recibir un objeto Python para la solicitud y debe proporcionar un objeto Python para la respuesta.

Todo está orquestado (en este host) por ’Phusion Passenger server’, un servidor de aplicaciones web de código abierto. Gestiona consultas HTTP, procesos y recursos y permite la administración, el seguimiento y el diagnóstico.

Es perfecto. Solo tiene que determinar en la interfaz Cpanel (una interfaz estándar para host), los siguientes parámetros:

Argumentos

Descripción

Python version

La elección de la última versión posible

Application root

Un directorio en nuestro espacio

Application URL

Un subdominio; es mejor crear uno para probar

Application startup file

Startup.py predeterminado

Application Entry point

’Aplicación’ predeterminada...

Resumen

Esté seguro de que encontrar ejemplos no es fácil. Como autor de estas líneas, tuve que aprovechar lo divertido, lo que nos hizo un favor y lo que nos podría servir.

Todos ellos son ejemplos originales, que disfrutamos escribiendo o reescribiendo en Python.

La programación es un gran espacio para jugar. Además, con una herramienta como Internet, es fácil encontrar una solución a los problemas que surgen durante el desarrollo o puesta a punto.

Y no olvide el famoso lema de Shadok: "Si no hay solución, entonces no hay problema".