¡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. Python y Raspberry Pi
  3. Administración de la Raspberry Pi en Python
Extrait - Python y Raspberry Pi Aprenda a desarrollar en su nano-ordenador
Extractos del libro
Python y Raspberry Pi Aprenda a desarrollar en su nano-ordenador Volver a la página de compra del libro

Administración de la Raspberry Pi en Python

Introducción

Administrar la Raspberry Pi utilizando únicamente la línea de comandos y la shell puede resultar frustrante y complicado. Con la programación shell, aunque es posible realizarla con la shell Bash, la sintaxis rápidamente alcanza sus límites cuando se trata de organizar el código en clases, módulos o funciones. Una vez más, esta tarea es extremadamente sencilla gracias a Python. Este es el tema de este capítulo.

Python normalmente se utiliza para escribir scripts de administración del sistema, cuyo objetivo es limpiar los archivos obsoletos, lanzar comandos externos, listar archivos, crear carpetas, etc. Estas operaciones son fáciles de gestionar con el módulo os, porque integra una serie de funciones que permiten comunicarse fácilmente con el sistema operativo. Además, las funciones que contiene este módulo son numerosas y esta introducción solo abarca los más importantes.

Administrar el sistema con los módulos pwd y os

Hasta ahora, los scripts que hemos escrito eran más o menos sencillos y muy poco interactivos: la información a buscar habitualmente se escribía directamente en el script. Para hacer los scripts del resto del libro un poco más interactivos, vamos a utilizar la función input().

Esta función recibe como argumento una cadena de caracteres que se mostrará en pantalla. Devuelve lo que el usuario escribe por el teclado. En REPL, esto da el siguiente resultado:


>>> dia = input('¿Qué día es hoy?')  
¿Qué día es hoy? Lunes  
>>> print(dia)  
Lunes
 

Esta función hace que el programa sea dinámico, preguntando al usuario y solicitándole información. Durante el uso de su Raspberry Pi, probablemente haya tenido que administrar usuarios para añadir y eliminar algunos. En un sistema UNIX como Raspbian, la base de datos de los usuarios se representa por el archivo /etc/passwd. Este archivo plano contiene la lista de los usuarios habilitados para conectarse al sistema, así como otra información, como la shell por defecto, la carpeta personal, etc. Una vez más, Python está provisto de un módulo para ayudarle en esta tarea, se trata del módulo pwd.

El primer ejemplo va a consistir en consultar la base de datos y recuperar la información de un usuario, cuyo nombre se ha introducido por línea de comandos. pwd dispone de dos funciones para consultar a la base de datos: getpwnam() y getpwuid(), ambas funciones devuelven una instancia de la clase struct_passwd. Como salida, esta clase expone la información del usuario en forma de atributos: pw_name, pw_passwd, ... (Capitulo_5/user_1.py):


 1 #!/usr/bin/env python3  
 2 import pwd, sys  
 3   
 4 usuario = input("Indique el nombre del usuario a buscar: ")  
 5 info = None  
 6   
 7 try:  
 8     info = pwd.getpwnam(usuario)  
 9 except KeyError:  
10     print("El usuario '{0}' no existe en este  
 sistema.".format(usuario))  
11     sys.exit(1)  
12   
13 print("Nombre del usuario :", info.pw_name)  
14 print('Contraseña...

Interactuar con el compilador Python a través del módulo sys

Otro módulo muy utilizado para escribir scripts es el módulo sys. En efecto, este módulo permite comunicarse con el compilador Python con el objetivo de recuperar el nombre del sistema operativo, la versión de Python utilizada, etc.

Intentemos importar el módulo y preguntar al compilador Python:


>>> import sys  
>>> print(sys.version)  
3.4.3 (default, Oct  9 2015, 18:04:57) 
[GCC 4.7.3] 
>>> print(sys.version_info) 
sys.version_info(major=3, minor=4, micro=3, releaselevel='final' , 
 serial=0) 
>>> print(sys.executable) 
/usr/bin/python3.4 
>>> sys.platform 
'linux' 
>>> sys.prefix 
'/usr'
 

También podemos obtener la lista de módulos Python instalados en nuestra Raspberry Pi:


>> print(sys.modules.keys())  
dict_keys(['_codecs', '_random', 'tkinter.dialog',  
 'idlelib.AutoComplete', '_thread' , 'tkinter.commondialog', 
 'hashlib', 'heapq', ...
 

Así como las diferentes rutas desde las que el compilador Python carga estos módulos y dónde se instalan:


>>> sys.path  
['', '/usr/lib64/python34.zip', '/usr/lib64/python3.4',  ...

Lanzar los comandos shell con el módulo subprocess

Desde un script habitualmente es necesario ejecutar comandos externos o comandos UNIX, ejecutables a través de una shell Bash. El módulo subprocess permite ejecutar un comando y recuperar el código de retorno de este. El módulo subprocess permite recuperar el resultado generado en forma de flujo de texto mediante la ejecución de un comando, con el objetivo de poder trabajar con aquel. Este módulo va a permitir lanzar comandos shell para recuperar, una vez más, información acerca de la Raspberry Pi. Para poder lanzar un comando, es necesario utilizar la función call() del módulo, tal y como se muestra a continuación:


>>> import subprocess 
>>> subprocess.call(['ls', '/'], shell=False) 
bin  boot  dev  etc  home  lib  lib32  lib64  lost+found  media 
  mnt  opt  proc  root  run  sbin  sys  tmp  usr  var 
0
 

Observe la llamada a la función, usando como argumento shell=False. Esto significa que Python no invoca a la shell para ejecutar el comando que se pasa como argumento, sino que llama directamente al comando. Observe también el 0 después del resultado del comando. Esta cifra se corresponde con el código devuelto por el comando ejecutado. Sin embargo...

Filtrar una cadena de caracteres con el módulo re

Las funciones estándares para el tratamiento de las cadenas de caracteres que ofrece Python, son suficientes para las operaciones sencillas. Para tratamientos un poco más complicados, será necesario escribir expresiones regulares, compilarlas y compararlas a la o las cadenas de caracteres que deseamos analizar. Esto es lo que permite hacer el módulo re. Aunque no sea el tema del libro, esta sección aborda brevemente qué son las expresiones regulares y cómo se escriben.

En primer lugar, ¿qué es una expresión regular? Una expresión regular es una cadena de caracteres que describe un conjunto de cadenas de caracteres. Este conjunto define, respecto a un flujo de datos que normalmente es texto, lo que el programa debe o no filtrar.

Empecemos con ejemplos sencillos que se deberán ejecutar en REPL:


>>> import re  
>>> pattern = re.compile('abc')  
>>> pattern.match('ab')  
>>> pattern.match('bc')   
>>> pattern.match('abc')  
<_sre.SRE_Match object; span=(0, 3), match='abc'>
 

La llamada a la función re.compile() compila una expresión regular, también llamada pattern en inglés. Esta expresión regular representa el filtro que se debe aplicar a la cadena de caracteres...

Escritura de scripts con el módulo argparse

Para cerrar este capítulo, vamos a estudiar el módulo argparse destinado a facilitar la escritura de los programas en línea de comandos. Habitualmente, durante la escritura de este tipo de programas, se presenta rápidamente el problema de la personalización: ¿cómo definir una opción? Una vez definida, ¿cómo recuperar este valor? ¿Cómo mostrar la ayuda? ¿Cómo mostrar la versión actual del script?

Observe que el módulo argparse es una revisión general de otro módulo llamado optparse. Con la transición a Python 3 y su inclusión en la librería estándar, el módulo optparse cayó en desuso aunque sigue estando disponible.

Para responder a estas preguntas, veamos directamente un ejemplo para explicar de qué es capaz este módulo. Como es habitual, la escritura de este script se hace utilizando IDLE (Capitulo_5/argparse_1.py):


 1 #!/usr/bin/env python3  
 2 import argparse  
 3 version = """%(prog)s 0.1"""  
 4 descripcion = """Demostración del módulo argparse."""  
 5   
 6 parser = argparse.ArgumentParser(descripcion=descripcion)  
 7   
 8 parser.add_argumento('--version',  
 9                      action='version',  
10                      version=version)  
11 parser.add_argumento('-n', '--nombre',  
12                      dest='nombre',  
13                      default='Python',  
14                      help='nombre por defecto',  
15                      tipo=str)  
16 parser.add_argumento('-a', '--edad',  
17                      dest='edad',  
18  ...

Conclusión

Este capítulo explica los diferentes módulos que se pueden utilizar para administrar la Raspberry Pi.