Saltar al contenido

Cómo utilizar el módulo Pexpect

Este artículo se basa en documentación de http://www.noah.org/wiki/pexpect y http://pypi.python.org/pypi/pexpect/

La razón por la que comencé a usar Pexepect fue porque estaba buscando un módulo que pueda ocuparse de algunas de las necesidades de automatización que tengo (principalmente con ssh y ftp).

Puede utilizar otros módulos como subproceso, pero encuentro este módulo más fácil de usar.

Tenga en cuenta que esta publicación no es para principiantes en Python, pero siempre es divertido aprender cosas nuevas.

¿Qué es Pexpect?

Pexpect es un módulo de Python puro que hace de Python una mejor herramienta para controlar
y automatizar otros programas.

Pexpect es básicamente un sistema de coincidencia de patrones. Ejecuta programa y relojes
producción.

Cuando la salida coincide con un patrón dado, Pexpect puede responder como si un humano fuera
escribiendo respuestas.

¿Para qué se puede utilizar Pexpect?

Pexpect se puede utilizar para automatización, pruebas y raspado de pantalla.

Pexpect se puede utilizar para automatizar aplicaciones de consola interactiva como
ssh, ftp, passwd, telnet, etc.

También se puede utilizar para controlar aplicaciones web a través de `lynx`,` w3m` o algunos
otro navegador web basado en texto.

Instalación de Pexpect

Se puede encontrar la última versión de Pexpect aquí

wget http://pexpect.sourceforge.net/pexpect-2.3.tar.gz
tar xzf pexpect-2.3.tar.gz
cd pexpect-2.3
sudo python ./setup.py install
 
# If your systems support yum or apt-get, you might be able to use the
# commands below to install the pexpect package. 

sudo yum install pexpect.noarch

# or

sudo apt-get install python-pexpect

Métodos de Pexpect

Hay dos métodos importantes en Pexpect: esperar () y enviar () (o línea de envío ()
que es como send () con un salto de línea).

El método de esperar ()

Espera a que la aplicación secundaria devuelva un fuerte determinado.

La cadena que especifica es una expresión regular, por lo que puede hacer coincidir complicadas
patrones.

Recuerde que cada vez que intente hacer coincidir un patrón que necesita una anticipación,
siempre obtendrás una coincidencia mínima.

Entrenamiento de Python recomendado

Para el entrenamiento de Python, nuestra principal recomendación es DataCamp.

Lo siguiente siempre devolverá un solo carácter:
child.expect (‘. +’)

Especifique correctamente el texto que espera volver, puede agregar ‘. *’ Al principio
o al final del texto que espera para asegurarse de que está captando
personajes inesperados

Este ejemplo coincidirá con éxito, pero siempre no devolverá ningún carácter:
child.expect (‘. *’)

Generalmente, cualquier expresión de estrella * coincidirá lo menos posible.

El patrón dado para esperar () también puede ser una lista de expresiones regulares,
esto le permite hacer coincidir múltiples respuestas opcionales.
(ejemplo, si recibe varias respuestas del servidor)

El método send ()

Escribe una cadena en la aplicación secundaria.

Desde el punto de vista del niño, parece como si alguien hubiera escrito el texto de
una terminal.

Las propiedades del antes y el después

Después de cada llamada a esperar (), las propiedades de antes y después se establecerán en la
texto impreso por la aplicación del niño.

La propiedad anterior contendrá todo el texto hasta el patrón de cadena esperado.

Puede usar child.before para imprimir la salida desde el otro lado de la conexión

La cadena posterior contendrá el texto que coincide con el patrón esperado.

La propiedad del partido se establece en re MatchObject.

Conectar y descargar un archivo desde un servidor FTP remoto

Esto se conecta al sitio ftp de openbsd y descarga el directorio recursivo
listado.

Puede utilizar esta técnica con cualquier aplicación.

Esto es especialmente útil si está escribiendo herramientas de prueba automatizadas.

Nuevamente, este ejemplo se copia de aquí

import pexpect
child = pexpect.spawn ('ftp ftp.openbsd.org')
child.expect ('Name .*: ')
child.sendline ('anonymous')
child.expect ('Password:')
child.sendline ('[email protected]')
child.expect ('ftp> ')
child.sendline ('cd pub')
child.expect('ftp> ')
child.sendline ('get ls-lR.gz')
child.expect('ftp> ')
child.sendline ('bye')

En el segundo ejemplo, podemos ver cómo recuperar el control de Pexpect

Conéctese a un servidor FTP remoto y obtenga el control

Este ejemplo usa ftp para iniciar sesión en el sitio de OpenBSD (igual que arriba),
enumerar archivos en un directorio y luego pasar el control interactivo de la sesión ftp
al usuario humano.

import pexpect
child = pexpect.spawn ('ftp ftp.openbsd.org')
child.expect ('Name .*: ')
child.sendline ('anonymous')
child.expect ('Password:')
child.sendline ('[email protected]')
child.expect ('ftp> ')
child.sendline ('ls /pub/OpenBSD/')
child.expect ('ftp> ')
print child.before    # Print the result of the ls command.
child.interact()       # Give control of the child to the user.

EOF, tiempo de espera y fin de línea

Hay patrones especiales para coincidir con el fin de archivo o una condición de tiempo de espera.

No escribiré sobre eso en este artículo, pero me refiero al oficial documentación
porque es bueno saber cómo funciona.

Entrenamiento de Python recomendado

Para el entrenamiento de Python, nuestra principal recomendación es DataCamp.