Pexpect ist eine Python-Bibliothek zum Erzeugen von untergeordneten Prozessen und deren automatischer Steuerung. Pexpect kann verwendet werden, um interagierende Anwendungen wie ssh, FTP, Passwort, Telnet usw. zu automatisieren. Pexpect funktioniert wie Span Child und reagiert auf erwartete Muster.

Installation:

Pexpect kann mit dem folgenden Befehl installiert werden.

pip3 install pexpect

Linux-Befehle automatisieren:

Dies kann auf verschiedene Arten erfolgen:

  • Verwenden der Methode run()
  • Verwendung der Spawn-Klasse
  • Verwendung der Methode sendline()

Sehen wir uns nach der Installation an, wie die Linux-Befehle automatisiert werden.

Methode 1: Verwenden der Methode run()

Die Methode pexpect.run() kann aufgerufen werden, um einen Befehl auszuführen und seine Ausgabe zurückzugeben. Diese Funktion kann als Ersatz für os.system verwendet werden.

Beispiel:

Python3

import pexpect
 
print(pexpect.run('echo hello'))

Abb. 1

Methode 2: Spawn-Klasse verwenden

Die Spawn-Klasse ist die Hauptschnittstelle, um einen neuen untergeordneten Prozess zu starten und zu steuern. Die Zeichenfolge innerhalb von spawn kann durch den Shell-Befehl ersetzt werden, der ausgeführt werden muss.

Syntax: pexpect.spawn(“rm ./dev”)

Die wichtigen Methoden der Klasse pexpect.spawn sind except().

Syntax: except(pattern, timeout=-1, searchwindowsize=-1, async_= False)



Diese Methode wartet darauf, dass der untergeordnete Prozess eine bestimmte Zeichenfolge zurückgibt. Das in der except-Methode angegebene Muster wird im gesamten String abgeglichen. Das Timeout wird verwendet, um pexpect.TIMEOUT zu erhöhen. Die Suchfenstergröße wird verwendet, um den Maxread der Klasse festzulegen. Legen Sie async_ = True fest, wenn Sie eine nicht blockierende Anwendung erstellen.

Beispiel:

Python3

import pexpect
 
# start a child  process with spawn
# It just echos  geeksforgeeks
child = pexpect.spawn("echo geeksforgeeks")
 
# prints he matched index of string.
print(child.expect(["hai", "welcome", "geeksforgeeks"]))

Ausgabe:

Abb. 2

Das Beispiel gibt den Index aus, der mit dem untergeordneten Prozess übereinstimmt.

Methode 3: Verwendung von sendline( s = ” “ )

Diese Methode schreibt die Zeichenfolge in den untergeordneten Prozess und gibt auch die Anzahl der geschriebenen Bytes zurück. Es erscheint dem untergeordneten Prozess, als würde jemand vom Terminal aus tippen. 

Beispiel:

Python3

import pexpect
 
# Start a child process with spawn
# This process  waits for the input
# form user
child = pexpect.spawn("cat")
 
# The input to the cat process is sent
# by the sendline()
child.sendline("hai geek")
 
# prints the index of matched string
# expressing with child process
print(child.expect(["hello", "hai geek"]))

Ausgabe:

Abb. 3

Sehen wir uns zum besseren Verständnis ein komplexes Beispiel an. Hier wird der FTP-Client verwendet, um sich bei ftp.us.debian.org anzumelden und die Datei welcome.msg herunterzuladen und die Datei auszudrucken. Hier werden wir einen FTP-Client verwenden, um uns anzumelden und Dateien von einem Remote-Computer herunterzuladen und dann zu drucken.

Sich nähern:

  • Voraussichtlich importieren.
  • spawnen Sie ein Kind mit pexpect.spawn('ftp ftp.us.debian.or').
  • Der FTP-Client fragt nach dem Benutzernamen. Vergleichen Sie das Muster mit Expect('Name .*: ')
  • Senden Sie den Benutzernamen mit der sendline-Methode an den untergeordneten Prozess.
  • Dann fragt der FTP-Client nach dem Passwort. Vergleichen Sie das Muster mit Expect('Password: ')
  • Dann hat sich der Server angemeldet. Dann können Sie Dateien herunterladen.
  • Erkennen Sie, ob Sie Befehle an den FTP-Server senden können, wenn „ftp>“ vorhanden ist.
  • Senden Sie dann den Befehl per sendline('get welcome.msg'), dies lädt nur die Datei auf den lokalen Rechner herunter.
  • Schließen Sie dann den FTP-Client mit dem Befehl „bye“.
  • Drucken Sie schließlich alle Interaktionen mit dem Kindprozess mit dem child.before. Es gibt eine Bytefolge zurück, dekodiert sie, bevor sie gedruckt wird.
  • Verwenden Sie pexpect.run, um den Inhalt der heruntergeladenen Datei vom FTP-Server zu drucken.

Python3

import pexpect
 
 
def main():
 
    # spawn a child process.
    child = pexpect.spawn('ftp ftp.us.debian.org')
 
    # search for the Name patter.
    child.expect('Name .*: ')
 
    # send the username with sendline
    child.sendline('anonymous')
 
    # search for the  Password pattern
    child.expect('Password:')
 
    # send the password to the childprocess
    # by sendline
    child.sendline('anonymous@')
 
    # detect ftp accepts command from user
    # by 'ftp> ' pattern
    child.expect('ftp> ')
 
    # If  it accepts command then download the
    # welcome.msg file from the ftp server
    child.sendline('get welcome.msg')
 
    # again check wheather ftp client accepts
    # command from user by 'ftp> ' pattern
    child.expect('ftp> ')
 
    # close the ftp client.
    child.sendline('bye')
 
    # print the interactions with the child
    # process.
    print(child.before.decode())
    child.interact()
 
    # print the downloaded file by executing cat
    # command with pexpect.run method
    print(pexpect.run('cat ./welcome.msg').decode())
 
 
if __name__ == '__main__':
    main()

Ausgabe:

Abb. 4