Python how to read output from pexpect child?

110,966

Solution 1

In pexpect the before and after attributes are populated after an expect method. The most common thing used in this situation is waiting for the prompt (so you'll know that the previous command finished execution). So, in your case, the code might look something like this:

child = pexpect.spawn ('/bin/bash')
child.expect("Your bash prompt here")
child.sendline('ls')
#If you are using pxssh you can use this
#child.prompt()
child.expect("Your bash prompt here")
print(child.before)

Solution 2

Try the following:

import pexpect
child = pexpect.spawn('ls')
print child.read() # not readline

The read() will give you the entire output of the ls.

Solution 3

#!/usr/bin/env python

import pexpect
child = pexpect.spawn("ssh [email protected] -p 2222")
child.logfile = open("/tmp/mylog", "w")
child.expect(".*assword:")
child.send("XXXXXXX\r")
child.expect(".*\$ ")
child.sendline("ls\r")
child.expect(".*\$ ")

go to open your logfile:- go to terminal

$gedit /tmp/mylog

As Per https://pexpect.readthedocs.io/en/stable/api/pexpect.html#spawn-class

# In Python 3, we'll use the ``encoding`` argument to decode data
# from the subprocess and handle it as unicode:
 child = pexpect.spawn('some_command', encoding='utf-8')
 child.logfile = sys.stdout

Solution 4

I think all you need is:

p = pexpect.spawn('ls')
p.expect(pexpect.EOF)
print(p.before)

or

p = pexpect.spawn('/bin/ls')
p.expect(pexpect.EOF)
print(p.before)

or

p = pexpect.spawn('/bin/bash -c "ls"')
p.expect(pexpect.EOF)
print(p.before)

or even

print(pexpect.run('ls'))

Solution 5

import sys
import pexpect
child = pexpect.spawn('ls')
child.logfile = sys.stdout
child.expect(pexpect.EOF)

See the manual entry on the subject.

Share:
110,966
user2579116
Author by

user2579116

Updated on July 09, 2022

Comments

  • user2579116
    user2579116 almost 2 years
    child = pexpect.spawn ('/bin/bash')
    child.sendline('ls')
    print(child.readline())
    print child.before, child.after
    

    All I get with this code in my output is

    ls
    
    ls 
    

    But when my code is

    child = pexpect.spawn('ls')
    print(child.readline())
    print child.before, child.after
    

    Then it works, but only for the first 2 prints. Am I using the wrong send command? I tried send, write, sendline, and couldn't find anymore.