Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How to run the pexpect script for terminal with colored text

Tags:

python

pexpect

Pexpect works fine when I run in interactive sessions but if it has colored text then its not matching only the text,it's matching the text along with ansi colors. The regex for this is very complicated and big. Can someone suggest me anything how to work with this.

For example:

instead of just looking for:

"opendaylight-user@root"

its looking for:

"or '\x1b[1mlogout\x1b[0m' to shutdown OpenDaylight.\r\r\n\r\n\x1b.\r\r\n
\r\n\x1b[36mopendaylight-user\x1b[0m\x1b[1m@\x1b[0m\x1b[34mroot\x1b[0m>".

This is just part of the expression.

import pexpect
import os
def ex1():
      os.chdir("opendaylight/distribution-karaf-0.3.4-Lithium-SR4/bin/")
      child=pexpect.spawn("./karaf clean",cwd="/home/ubuntu/opendaylight/distribution-karaf-0.3.4-Lithium-SR4/bin/") 
      child.expect("opendaylight-user@root>")
      print child.before
ex1()

Error

   Traceback (most recent call last):
   File "ex07.py", line 11, in <module>
   ex1()
   File "ex07.py", line 9, in ex1
   child.expect("opendaylight-user@root>")
   File "/usr/local/lib/python2.7/dist-packages/pexpect/spawnbase.py", line 321, in expect
   timeout, searchwindowsize, async)
   File "/usr/local/lib/python2.7/dist-packages/pexpect/spawnbase.py", line 345, in expect_list
   return exp.expect_loop(timeout)
   File "/usr/local/lib/python2.7/dist-packages/pexpect/expect.py", line 107, in expect_loop
   return self.timeout(e)
   File "/usr/local/lib/python2.7/dist-packages/pexpect/expect.py", line 70, in timeout
   raise TIMEOUT(msg)
   pexpect.exceptions.TIMEOUT: Timeout exceeded.
   <pexpect.pty_spawn.spawn object at 0x7f2c5ca8ae10>
   command: ./karaf
   args: ['./karaf', 'clean']
   buffer (last 100 chars): " or '\x1b[1mlogout\x1b[0m' to shutdown     OpenDaylight.\r\r\n\r\n\x1b[36mopendaylight-user\x1b[0m\x1b[1m@\x1b[0m\x1b[34mroot\x1b[0m>"
   before (last 100 chars): " or '\x1b[1mlogout\x1b[0m' to shutdown  OpenDaylight.\r\r\n\r\n\x1b[36mopendaylight-  user\x1b[0m\x1b[1m@\x1b[0m\x1b[34mroot\x1b[0m>"
    after: <class 'pexpect.exceptions.TIMEOUT'>
    match: None
    match_index: None
    exitstatus: None
    flag_eof: False
    pid: 20699
    child_fd: 5
    closed: False
    timeout: 30
    delimiter: <class 'pexpect.exceptions.EOF'>
    logfile: None
    logfile_read: None
    logfile_send: None
    maxread: 2000
    searchwindowsize: None
    delaybeforesend: 0.05
    delayafterclose: 0.1
    delayafterterminate: 0.1
    searcher: searcher_re:
    0: re.compile("opendaylight-user@root>")
like image 815
user7369931 Avatar asked Oct 30 '22 10:10

user7369931


1 Answers

I got the answer by using expect_exact() rather than expect(). expect() matches with the regex but expect_exact matches with the strings.

  import pexpect
  import os
  def ex1():
      os.chdir("opendaylight/distribution-karaf-0.3.4-Lithium-SR4/bin/")
      child=pexpect.spawn("./karaf clean",cwd="/home/ubuntu/opendaylight/distribution-karaf-0.3.4-Lithium-SR4/bin/") 
      child.expect_exact("\x1b[36mopendaylight-user\x1b[0m\x1b[1m@\x1b[0m\x1b[34mroot\x1b[0m>")
      print child.before
  ex1()
like image 123
user7369931 Avatar answered Nov 15 '22 05:11

user7369931