Próbuję usunąć wszystkie znaki na linii po odzyskaniu z nieznanego stanu, ponieważ w niektórych przypadkach zawierają one podpowiedzi i inne słowa kluczowe, których używam w przyszłości oczekują wywołania metod. Próbowałem wielu podejść z mieszanym rezultatem, ponieważ ciągle mam nieoczekiwane zachowania.python pexpect wyczyszczenie lub przepłukanie linii
widziany nieoczekiwanych zachowań (używając pexpect v3.3 z Python 2.7.9):
Po wykonaniu następującego kodu, kiedy następnie spróbować odczytać z bufora, czasami widzę nieprawidłowe działanie, gdzie tylko część nagromadzonych znaków została wyczyszczona. To budzi spustoszenie w mojej logice. Zakładam, że dzieje się tak, ponieważ cały wątek zostaje uśpiony na 5 sekund, więc gdy się budzi, nie ma czasu na pobranie pełnego bufora przychodzącego przed wykonaniem polecenia read_nonblocking().
time.sleep(5) flushedStuff += child.read_nonblocking(100000, timeout=0)
Kiedy próbuję użyć .expect wezwanie do spłukiwania linię w sposób non-blocking, okazało się, że po wyjątkiem TIMEOUT bufor przychodzące nie zostanie usunięty. Jego zawartość można znaleźć zgodnie z oczekiwaniami w właściwości child.before, ale będzie ona również analizowana podczas następnego wywołania metody .expect. To w ogóle nie powoduje opróżnienia linii! Zauważyłem także, że read_nonblocking() nie czyta z lokalnego bufora, ale czyta bezpośrednio z linii przez system operacyjny, więc tego nie widzi.
try: child.expect("ZzqQJjSh_Impossible_String", timeout = 5) except pexpect.TIMEOUT: pass flushedStuff = child.before
Więc po tym wszystkim, moje obecne rozwiązanie, aby zapewnić niezawodną drogę do spłukiwania linii jest rozszerzenie klasy odradzania i dodać metodę, który wykonuje następujące ... który uzyskuje dostęp do własności nieudokumentowane:
class ExtendedSpawn(pexpect.spawn):
def flushBuffer(delay)
try:
# Greedily read in all the incoming characters
self.expect("ZzqQJjSh_Impossible_String", timeout = delay)
except pexpect.TIMEOUT:
pass
# Clear local input buffer inside the spawn Class
self.buffer = self.string_type()
return self.before
Powyższa metoda może być również użyta do niezablokowania polecenia sleep.
To chyba zbyt skomplikowane podejście do czegoś, co powinno być proste, nie wspominając, że zmarnowałem na to kilka dni. Czy jest lepszy sposób na zrobienie tego?
Dzięki!