2017-03-17 3 views
3

Pexpect fonctionne correctement lorsque je cours en sessions interactives, mais s'il contient du texte en couleur, il ne correspond pas seulement au texte, il correspond au texte avec les couleurs ansi. L'expression rationnelle pour ceci est très compliquée et grande. Quelqu'un peut-il me suggérer quelque chose comment travailler avec cela.Comment exécuter le script pexpect pour un terminal avec du texte en couleur

Par exemple:

au lieu de simplement la recherche de:

"opendaylight-utilisateur root @"

sa recherche:

« ou \ x1b [1mlogout \ x1b [0m 'pour arrêter OpenDaylight. \ r \ r \ n \ r \ n \ x1b. \ r \ r \ n
\ r \ n \ x1b [36mopendaylight-utilisateur \ x1b [0m \ x1b [1m @ \ x1b [0m \ x1b [34mroot \ x1b [0m> ".

Cela fait juste partie de l'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("[email protected]>") 
     print child.before 
ex1() 

Erreur

Traceback (most recent call last): 
    File "ex07.py", line 11, in <module> 
    ex1() 
    File "ex07.py", line 9, in ex1 
    child.expect("[email protected]>") 
    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[[email protected]\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[[email protected]\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("[email protected]>") 
+1

J'ai changé. Si ce n'est pas suffisant, faites-moi savoir quel genre de changements vous attendez – user7369931

+0

Essayez de faire une recherche pour ignorer [codes d'échappement] (https://en.wikipedia.org/wiki/ANSI_escape_code) –

Répondre

2

j'ai eu la réponse en utilisant expect_exact() plutôt que s'attendre(). expect() correspond à la regex, mais attendez_exact avec les chaînes.

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[[email protected]\x1b[0m\x1b[34mroot\x1b[0m>") 
     print child.before 
    ex1()