Python 如何为带有彩色文本的终端运行pexpect脚本

Python 如何为带有彩色文本的终端运行pexpect脚本,python,pexpect,Python,Pexpect,当我在交互式会话中运行时,Pexpect可以很好地工作,但是如果它有彩色文本,那么它不仅与文本匹配,还与ansi颜色匹配。这个正则表达式非常复杂和庞大。有人能给我一些建议吗 例如: 而不仅仅是寻找: “开放日-user@root" 它正在寻找: “或'\x1b[1mlogout\x1b[0m'关闭” OpenDaylight。\r\r\n\r\n\x1b。\r\r\n \r\n\x1b[36mopendaylight user\x1b[0m\x1b[1m@\x1b[0m\x1b[34mroot\

当我在交互式会话中运行时,Pexpect可以很好地工作,但是如果它有彩色文本,那么它不仅与文本匹配,还与ansi颜色匹配。这个正则表达式非常复杂和庞大。有人能给我一些建议吗

例如:

而不仅仅是寻找:

“开放日-user@root"

它正在寻找:

“或'\x1b[1mlogout\x1b[0m'关闭” 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>")
回溯(最近一次呼叫最后一次):
文件“ex07.py”,第11行,在
ex1()
ex1中第9行的文件“ex07.py”
孩子。期待(“开放日”)-user@root>")
expect中的文件“/usr/local/lib/python2.7/dist-packages/pexpect/spawnbase.py”,第321行
超时,搜索窗口大小,异步)
expect\u列表第345行的文件“/usr/local/lib/python2.7/dist packages/pexpect/spawnbase.py”
返回exp.expect\u循环(超时)
expect\u循环中的文件“/usr/local/lib/python2.7/dist packages/pexpect/expect.py”,第107行
返回自我超时(e)
文件“/usr/local/lib/python2.7/dist-packages/pexpect/expect.py”,第70行,超时
提升超时(msg)
pexpect.exceptions.TIMEOUT:超过超时时间。
命令:./karaf
参数:['./karaf','clean']
缓冲区(最后100个字符):“或'\x1b[1mlogout\x1b[0m'关闭OpenDaylight。\r\r\n\r\n\x1b[36mopendaylight user\x1b[0m\x1b[1m@\x1b[0m\x1b[34mroot\x1b[0m>”
之前(最后100个字符):“或'\x1b[1mlogout\x1b[0m'关闭OpenDaylight。\r\r\n\r\n\x1b[36mopendaylight-user\x1b[0m\x1b[1m@\x1b[0m\x1b[34mroot\x1b[0m>”
之后:
匹配:无
匹配索引:无
退出状态:无
flag_eof:False
pid:20699
儿童:5
关闭:错误
超时时间:30
分隔符:
日志文件:无
日志文件读取:无
日志文件发送:无
maxread:2000
searchwindowsize:无
发送前延迟:0.05
延迟后关闭:0.1
延迟后终止:0.1
搜索者:搜索者\u re:
0:重新编译(“opendaylight-user@root>")

我通过使用expect\u exact()而不是expect()得到了答案。expect()与正则表达式匹配,但expect\u与字符串精确匹配

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

我改变了。如果这还不够,请告诉我你希望搜索什么样的改变