将Scapy输出打印到wxPython文本控制器

将Scapy输出打印到wxPython文本控制器,python,wxpython,scapy,Python,Wxpython,Scapy,谢谢你抽出时间来看我的问题 我正在学习wxPython的诀窍,我想做一个输出到终端的工作程序,并对其进行整容。使用Scapy,我可以嗅探我的无线接口中的探测请求/探测响应,它可以按预期工作。但是,我不想输出到终端窗口,而是想将其输出到新GUI中的StaticText(tc2)框架 现在我已经使用了一个教程来创建我的GUI,但是,目前的代码仍然在加载我的GUI之前将Scapy输出到终端,因为sniff函数一直运行到被用户终止,因此从未真正加载GUI。我曾尝试将sniff函数放在wx.StaticT

谢谢你抽出时间来看我的问题

我正在学习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()

在wxPython应用程序加载之前,您不希望启动嗅探。因此,您可以在按钮或菜单事件处理程序中启动嗅探,也可以在应用程序加载后使用wx.CallLater启动执行,方法是将CallLater命令放在wx代码的init末尾

当我重定向ping命令时,我做了类似的事情。你可以看看我对这个问题的看法。如果需要有关重定向标准输出的更多背景信息,请参阅

我在这里的另一个回答中谈到了这件事的基本要点:

基本上,您希望使用如下方式重定向文本:

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

    def write(self,string):
        self.out.WriteText(string)
然后在我的ping示例中,我执行了以下操作:

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()
主要要看的是子流程调用中的stdout参数,wx.Yield()也很重要。产量允许文本“打印”(即重定向)到标准输出。没有它,文本在命令完成之前不会显示。我希望这一切都有意义

如果您需要在单独的线程中运行此功能,以下是有关该主题的两个链接:


迈克,你让我走上了正确的道路。我让它显示一行,但现在我遇到了一个问题,它冻结。我按“嗅嗅”,它就冻结了。我猜它被挂在文本重定向的某个地方。我用你的资源来指导我。这就是我所做的。我在代码中没有看到wx.Yield。您可能需要在线程内执行嗅探代码,并使用wx.CallAfter将其发回GUI。不过我对这个嗅探器不太熟悉。您可能会考虑交叉发布到wxPython邮件列表。他们在那里很有帮助!我明白你的意思,因为嗅探会一直运行直到用户关闭,所以它永远不会重定向。让我看更多关于线程的内容,我会回到这里,让你们知道它是如何进行的。谢谢你,迈克!成功了,迈克!非常感谢,我只需将wx.Yield()添加到我的packets函数的末尾,就可以了。我想你在什么地方需要收益