pexpect is a popular Python module for doing different types of automated tasks. Different types of interactive applications such as telnet, ssh, ftp, etc., can be automated using this module. It is a pure Python module, and it does not require a C compiler or TCL or Expect extensions like others expect modules. It can work easily by using a Python interpreter only. This module can be used in two ways. One way is to use the run() function, and another way is to use spawn class. The run() function is easy to use than the spawn class and performs the automated tasks quickly. The particular command or a program can be executed by the run() function that returns the output. This function can be used as the alternative to the os.system() function. The spawn class is more powerful than the run() function that can spawn a child program, interact with it by sending input, and waiting for the response. This module is installed in python3 by default. The two ways of using this module have shown in this tutorial.
Using run() function
Syntax:
The syntax of the run() function is given below. It has many arguments for various purposes. But the first 3 or 4 arguments are mostly used. The first argument of this function is mandatory that takes the command that this function will execute. It can return multiple outputs. If the withexitstatus argument is used with the False value, it will only return the command’s output.
Example-1: Different uses of run() function
Three different uses of the run() function have shown in the following script. The `pwd` command’s output is executed in the first run() function that will display the current working directory path. Next, the run() function is used to determine the details of a particular file, and the filename will be taken from the user. The third run() function is used to make the ssh connection and retrieve all files and folders from the web folder.
import pexpect
import os
# Run simple command
print("The current working directory: \n%s" %pexpect.run('pwd').decode("utf-8"))
# Retrieve the information of a particular file
filename = input("Enter an existing filename: ")
# Check the file exists or not
if os.path.exists(filename):
output = pexpect.run("ls -l "+filename, withexitstatus=0)
print("Information of a particular file: \n%s" %output.decode("utf-8"))
else:
print("File does not exist.")
# Retrieve the files and folder of a particular directory using ssh command
output = pexpect.run("ssh fahmida@localhost 'ls web/'", events={'(?i)password':'12345\n'})
print("\nThe output of ssh command: \n%s" %output.decode("utf-8"))
Output
The following output will appear after executing the above script. In the output, doc1.py has given as the filename, and the details of this file have shown. Next, the list of all files of the web folder has shown using ssh connection.
Using spawn class
The syntax of the spawn class is given below. The constructor of this class can take many arguments for many purposes. The first argument is mandatory that will take the command for execution.
Example-2: Simple use of spawn class
The simple use of the spawn class has shown in the following script. The `date` command has been executed here by using the spawn class. The output of the command will be retrieved by creating the object of the spawn class, and the output is printed in human-readable format by using the decode() method.
import pexpect
# Run the date command using spawn
child = pexpect.spawn('date')
# Read the child output without generating EOF
child.expect(pexpect.EOF)
# Store the text that is expected by the string pattern
output = child.before
# Print the output
print("Today is :", output.decode("utf-8"))
Output
The following output will appear after executing the above script.
Example-3: Read the content of the directory using ssh connection
Creating ssh connection and reading the list of all files and folders of a particular directory have shown in the following script. Here, the password of the defined user will be taken from the user to make ssh connection using the spawn class. If the given password is incorrect, then the script will be terminated by showing an error message. If the given password is correct, but the terminal is not defined, then the script will show the success message for the connection, send the terminal type, and define the command prompt’s expected pattern. If the password is correct and the terminal is defined, the script will show the success message and the shell command prompt.
import pexpect
# Set the username for ssh connection
username = 'fahmida@localhost'
# Take a valid password from the user
Password = input("Enter the login password of %s: " %username)
# Run ssh command using spawn
child = pexpect.spawn('ssh ' + username)
# Wait for the password
child.expect('password:')
# Send the password taken from the user
child.sendline(Password)
# Expected three output
i = child.expect (['Permission denied', 'Terminal type', '[#\$] '])
# i will be 0 if ssh is unable to connect
if i == 0:
print("Permission denied by host. Unable to login")
child.kill(0)
# i will be 1 if ssh is able to connect but terminal is not set
elif i == 1:
print('Connected Successfully.\nTerminal type is not set.')
child.sendline('vt100')
child.expect('[#\$]')
# i will be 2 if ssh is able to connect and terminal is set
elif i == 2:
print('Connected Successfully.')
prompt = child.after
print('Shell Command Prompt:', prompt.decode("utf-8"))
Output
The following output will appear when the above script is executed with the wrong password.
The following output will appear when the above script is executed with the correct password.
Conclusion
pexpect is a very helpful module for Python users that helps them to do their regular tasks automatically. The very basic uses of the pexpect module of Python have been described in this tutorial by using easy examples to help the users to start working with this module.