如何在终端上运行带有彩色文本的pexpect脚本

5

当我在交互式会话中运行Pexpect时,它可以正常工作,但是如果有彩色文本,则不仅匹配文本,而且还会匹配文本及其ansi颜色。这个正则表达式非常复杂和庞大。有人能建议我如何处理吗。

例如:

不仅查找:

"opendaylight-user@root"

还要查找:

"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>".

这只是表达式的一部分。

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()

错误

   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>")

1
我已经改变了。如果不够的话,请让我知道你期望的是什么样的改变。 - user7369931
尝试搜索并忽略[转义码](https://en.wikipedia.org/wiki/ANSI_escape_code)。 - Łukasz Rogalski
1个回答

2

我是通过使用expect_exact()而非expect()得到答案的。expect()会与正则表达式匹配,但expect_exact会与字符串匹配。

  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()

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接