2015-04-12 23 views
6

Bilinmeyen bir durumdan kurtarıldıktan sonra hat üzerindeki herhangi bir karakteri temizlemeye çalışıyorum; çünkü bazı durumlarda, ileride beklenecek yöntem çağrıları için kullandıkları komutları ve diğer anahtar kelimeleri içerirler. Beklenmeyen davranışlara koşmaya devam ederken, karışık sonuçlar içeren birden çok yaklaşımı denedim.python pidhon'un temizlenmesi veya temizlenmesi

Görülme beklenmedik davranışlar (Python 2.7.9 ile pexpect V3.3 kullanarak):

  1. ben sonradan tampon okumaya çalıştığınızda, aşağıdaki kodu gerçekleştirdikten sonra bazen ben hatalı davranış nerede sadece görmeleri Birikmiş karakterlerin bir kısmı temizlendi. Bu benim aşağı akım mantığım üzerinde yıkıcıdır. Bunun, tüm ipliğin 5 saniyeliğine uyku moduna geçtiğini, dolayısıyla uyandığında, read_nonblocking() komutunu çalıştırmadan önce tam gelen arabelleği almak için zamanın olmadığına inanıyorum.

    time.sleep(5) 
    flushedStuff += child.read_nonblocking(100000, timeout=0) 
    
  2. Ben engellenmeyen bir şekilde çizgi temizlemek için .expect çağrıyı kullanmaya çalıştığınızda

    , bir ZAMAN AŞIMI istisna sonrası gelen tampon temizlenmez öğrendim. İçeriği child.before özellikte beklendiği gibi bulunabilir, ancak sonraki .expect yöntem çağrısı sırasında da ayrıştırılır. Yani bu hiç de çizgiyi temizlemiyor! Ayrıca, read_nonblocking() işlevinin yerel arabellekten okumadığını, ancak işletim sisteminden doğrudan satırdan okunduğunu fark ettim, dolayısıyla bunu görmüyor. Yani bütün bunlardan sonra, şu andaki çözüm hattını teşvik etmek güvenilir bir yol sağlamak üzere

    try: 
        child.expect("ZzqQJjSh_Impossible_String", timeout = 5) 
    except pexpect.TIMEOUT: 
        pass 
    flushedStuff = child.before 
    
spawn sınıfını genişletmek ve şu ... Bir belgesiz özelliğine erişir hangi yapan bir yöntem eklemektir:

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 

Yukarıdaki yöntem, engelleme olmayan bir uyku komutu için de kullanılabilir. Bu, basit olması gereken bir şey için bir yaklaşımın çok karmaşık bir yolu gibi görünüyor, bunun üzerine birkaç gün israf ettiğimi belirtmekten çok uzak görünüyor. Bunu yapmanın daha iyi bir yolu var mı?

Teşekkürler!

cevap

0

temizlemek pexpect verilere kadar sürekli okumak için tampon için en kolay yolu sorunu görmek için

flushedStuff = '' 
while not child.expect(r'.+', timeout=5): 
    flushedStuff += child.match.group(0) 
0

mevcuttur, aşağıdaki komut dosyasını çalıştırabilirsiniz. (Bir kabuk komut dosyası numaraları 1 ile 10 yankı ve her numaradan sonra 1 saniye uyuyacak pexpect zaman aşımı için 2 saniye bekleyin ve numaralar görülür yazdırır..):

#!/usr/bin/env python 
import pexpect 
child = pexpect.spawn('/bin/sh -c "i=0; while [ $i -lt 10 ]:; do echo $((i=i+1)); sleep 1; done"') 
while True: 
    i=child.expect ([pexpect.TIMEOUT, pexpect.EOF], timeout=2) 
    if i==0: 
     print "before=%s" % child.before 
    else: 
     break 

çıkışı (aşağıdaki gibi görünecektir

before='1\r\n2\r\n' 
before='1\r\n2\r\n3\r\n4\r\n' 
before='1\r\n2\r\n3\r\n4\r\n5\r\n6\r\n' 
before='1\r\n2\r\n3\r\n4\r\n5\r\n6\r\n7\r\n8\r\n' 
before='1\r\n2\r\n3\r\n4\r\n5\r\n6\r\n7\r\n8\r\n9\r\n10\r\n' 

iki satır komut dosyasına eklenebilir sorunu çözmek için:

#!/usr/bin/env python 
import pexpect 
child = pexpect.spawn('/bin/sh -c "i=0; while [ $i -lt 10 ]:; do echo $((i=i+1)); sleep 1; done"') 
while True: 
    i=child.expect ([pexpect.TIMEOUT, pexpect.EOF], timeout=2) 
    if i==0: 
     print "before=%s" % repr(child.before) 
     if child.before: 
      child.expect (r'.+') 
    else: 
     break 

Ve beklendiği gibi çıktı olacaktır: Biz de daha önce okunan numaralar) almak

before='1\r\n2\r\n' 
before='3\r\n4\r\n' 
before='5\r\n6\r\n' 
before='7\r\n8\r\n' 
before='9\r\n10\r\n'