2013-03-25 39 views
0

感謝您花時間看看我的問題。將scapy輸出打印到wxPython文本控制器

我正在學習wxPython的繩索,我想要一個輸出到終端的工作程序,並給它一個整容。通過Scapy,我正在嗅探無線接口以獲取探測請求/探測響應,並按預期工作。然而,我想要輸出到終端窗口,而不是輸出到我的新GUI中的StaticText(tc2)幀。

現在我一直在使用一個教程來創建我的GUI,但是,當前的代碼仍然在加載我的GUI之前輸出Scapy到終端,因爲sniff函數運行直到它被用戶殺死,因此從未真正加載GUI。我已經嘗試將sniff函數放在wx.StaticText行中,但沒有將它打印在那裏的樂趣。

我的Scapy程序和GUI程序都可以獨立工作,但它們不能同時工作。我的目標是將返回值顯示在StaticText框中。以下是我的代碼與我的問題相關的一小部分。

tc2 = wx.TextCtrl(panel, wx.ID_ANY, size=(300,100), style = wx.TE_MULTILINE|wx.TE_READONLY|wx.HSCROLL) 

btn1 = wx.Button(panel, label='Sniff', size=(70, 30)) 
self.Bind(wx.EVT_BUTTON, self.OnSniff, btn1) 

redir=RedirectText(tc2) 
sys.stdout=redir 

def OnSniff(self,e): 
sniff(iface="mon0",prn=packets,store=0) 

def packets(p): 
if p.haslayer(Dot11ProbeReq): 
    dstmac=p.addr1 
    mac=p.addr2 
    if p.info == "": 
    ssid="BROADCAST" 
    else: 
    ssid=p.info 

    print "%s is probing %s %s" % (mac,dstmac,ssid) 

if p.haslayer(Dot11ProbeResp): 
    dstmac=p.addr1 
    bssid=p.addr2 
     ssid=p.info 
     print "%s (%s) Probe Response to %s" % (ssid,bssid,dstmac) 

wx.Yield() 

回答

1

您不想在wxPython應用程序加載之前開始嗅探。所以你要麼要在按鈕或菜單事件處理程序中啓動嗅探,要麼可以使用wx.CallLater在應用程序加載後通過將CallLater命令放在wx代碼的init結尾處開始執行。

當我重定向ping命令(其中包括)時,我做了一些類似的事情。你可以看看我的tutorial關於這個問題。如果您需要更多背景來重定向標準輸出,請參閱here

事情的基本內容已涵蓋在另一個我的答案在這裏:Redirect command prompt output to a python generated window

基本上你想用這樣的文字來重定向:

class RedirectText: 
    def __init__(self,aWxTextCtrl): 
     self.out=aWxTextCtrl 

    def write(self,string): 
     self.out.WriteText(string) 

然後在我的平例如,我做了以下內容:

def pingIP(self, ip): 
    proc = subprocess.Popen("ping %s" % ip, shell=True, 
          stdout=subprocess.PIPE) 
    print 
    while True: 
     line = proc.stdout.readline()       
     wx.Yield() 
     if line.strip() == "": 
      pass 
     else: 
      print line.strip() 
     if not line: break 
    proc.wait() 

看最主要的是標準輸出參數在子呼叫和wx.Yield()是祁門功夫也是如此。 Yield允許文本「打印」(即重定向)到標準輸出。沒有它,文本將不會顯示,直到命令完成。我希望這一切都有道理。

如果你需要在一個單獨的線程中運行,這裏有關於這個問題的幾個鏈接:

+0

邁克,你讓我去上正確的軌道上。我得到它顯示一行,但現在我遇到了凍結問題。我按嗅,它凍結。我猜測它在文本重定向的某個地方被掛起了。我用你的資源來指導我。這是我所做的。 – pyRabbit 2013-03-25 21:10:03

+0

查看我對OP的更改。 – pyRabbit 2013-03-25 21:16:28

+0

我在代碼中的任何地方都看不到wx.Yield。您可能需要在線程內執行Sniff代碼,並使用wx.CallAfter將其發回GUI。雖然我不熟悉這個嗅探器。你可能會考慮交叉發佈到wxPython郵件列表。他們在那裏非常有幫助! – 2013-03-25 21:29:05

相關問題