How to see the output in pexpect?

supertren picture supertren · Aug 31, 2017 · Viewed 9.8k times · Source

I have write this program:

[mik@mikypc ~]$ cat ftp.py 
 #!/usr/bin/env python

 # This connects to the rediris ftp site
 # 
 import pexpect
 child = pexpect.spawn('ftp ftp.rediris.es')

 child.expect('Name .*: ')
 child.sendline('anonymous')
 child.expect('ftp> ')
 child.sendline('[email protected]')
 child.expect('ftp> ')
 child.sendline('lcd /tmp')
 child.expect('ftp> ')
 child.sendline('pwd')
 child.expect('ftp> ')
 child.sendline('bye')

[mik@mikypc ~]$ ./ftp.py 
[mik@mikypc ~]$ 
[mik@mikypc ~]$ 
[mik@mikypc ~]$ 

But I cannot see the output. How could I see it?. I don't see anything when I execute it. How could I see the output?.

Answer

pynexj picture pynexj · Sep 2, 2017

According to the pexpect doc:

The logfile_read and logfile_send members can be used to separately log the input from the child and output sent to the child. Sometimes you don’t want to see everything you write to the child. You only want to log what the child sends back. For example:

child = pexpect.spawn('some_command')
child.logfile_read = sys.stdout

You will need to pass an encoding to spawn in the above code if you are using Python 3.
To separately log output sent to the child use logfile_send:

child.logfile_send = fout 

See following example:

[STEP 105] # cat foo.py
import pexpect, sys

re_PS1 = 'bash-[.0-9]+[$#] $'

proc = pexpect.spawn('bash --norc')
if len(sys.argv) != 1:
    if sys.version_info[0] < 3:
        proc.logfile_read = sys.stdout
    else:
        proc.logfile_read = sys.stdout.buffer

proc.expect(re_PS1)

proc.sendline("echo hello world")
proc.expect(re_PS1)

proc.sendline('exit')
proc.expect(pexpect.EOF)
proc.close()
[STEP 106] # python foo.py
[STEP 107] # python foo.py foo
bash-4.4# echo hello world
hello world
bash-4.4# exit
exit
[STEP 108] #