WedX - журнал о программировании и компьютерных науках

Печать вывода Scapy в текстовый контроллер wxPython

Спасибо, что нашли время, чтобы посмотреть на мой вопрос.

Я изучаю основы wxPython и хочу взять работающую программу, которая выводит данные на терминал, и обновить ее. С помощью Scapy я обнюхиваю свой беспроводной интерфейс на предмет запросов/ответов зонда, и он работает, как задумано. Однако я хочу вместо вывода в окно терминала выводить его в кадр StaticText (tc2) в моем новом графическом интерфейсе.

Теперь я использую учебник для создания своего графического интерфейса, однако текущий код по-прежнему выводит Scapy на терминал даже до загрузки моего графического интерфейса, поскольку функция sniff работает до тех пор, пока ее не убьет пользователь, поэтому никогда не загружает графический интерфейс. Я попытался поместить функцию sniff в строку wx.StaticText, но не получил удовольствия от ее печати.

И моя программа Scapy, и программа с графическим интерфейсом работают сами по себе, однако они не работают одновременно. Моя цель - отображать возвращаемые значения в поле 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()
25.03.2013

Ответы:


1

Вы не хотите начинать обнюхивание, пока не загрузится приложение wxPython. Таким образом, вы либо захотите начать сниффинг в обработчике событий кнопки или меню, либо вы можете использовать wx.CallLater, чтобы начать выполнение ПОСЛЕ загрузки приложения, поместив команду CallLater в конец вашего кода wx.

Я сделал что-то вроде этого, когда перенаправлял команду ping (среди прочего). Вы можете взглянуть на мой учебник по этому вопросу. Если вам нужна дополнительная информация о перенаправлении stdout, см. здесь. .

Основная суть вопроса была раскрыта в другом моем ответе здесь: Перенаправить вывод командной строки в окно, сгенерированное Python

В основном вы хотите перенаправить текст, используя что-то вроде этого:

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()

Главное, на что нужно обратить внимание, это параметр stdout в вашем вызове подпроцесса, и wx.Yield() также важен. Yield позволяет тексту «печататься» (т.е. перенаправляться) на стандартный вывод. Без него текст не будет отображаться до тех пор, пока команда не будет завершена. Я надеюсь, что все имело смысл.

Если вам нужно запустить это в отдельном потоке, вот пара ссылок на эту тему:

25.03.2013
  • Майк, ты наставил меня на верный путь. Я заставил его отображать одну строку, но теперь у меня возникла проблема с зависанием. Я нажимаю Sniff, и он зависает. Я предполагаю, что он зависает где-то в перенаправлении текста. Я использовал ваши ресурсы, чтобы направлять меня. Вот что я сделал. 26.03.2013
  • Я не вижу wx.Yield нигде в вашем коде. Возможно, вам потребуется выполнить код Sniff внутри потока и использовать wx.CallAfter, чтобы отправить его обратно в графический интерфейс. Хотя я не знаком с этим снифером. Вы можете подумать о перекрестной публикации в списке рассылки wxPython. Там очень помогают! 26.03.2013
  • Я вижу, к чему вы клоните, и, поскольку снифф продолжает работать до тех пор, пока пользователь не закроет его, он никогда не будет перенаправляться. Позвольте мне больше узнать о многопоточности, и я вернусь к этому и сообщу вам, как все прошло. Спасибо, Майк! 26.03.2013
  • Получил работу, Майк! Большое спасибо, мне просто нужно было добавить wx.Yield() в конец моей функции пакетов, и это сработало. 26.03.2013
  • Прохладный. Я подумал, что тебе где-то нужен Yield 26.03.2013
  • Новые материалы

    Объяснение документов 02: BERT
    BERT представил двухступенчатую структуру обучения: предварительное обучение и тонкая настройка. Во время предварительного обучения модель обучается на неразмеченных данных с помощью..

    Как проанализировать работу вашего классификатора?
    Не всегда просто знать, какие показатели использовать С развитием глубокого обучения все больше и больше людей учатся обучать свой первый классификатор. Но как только вы закончите..

    Работа с цепями Маркова, часть 4 (Машинное обучение)
    Нелинейные цепи Маркова с агрегатором и их приложения (arXiv) Автор : Бар Лайт Аннотация: Изучаются свойства подкласса случайных процессов, называемых дискретными нелинейными цепями Маркова..

    Crazy Laravel Livewire упростил мне создание электронной коммерции (панель администратора и API) [Часть 3]
    Как вы сегодня, ребята? В этой части мы создадим CRUD для данных о продукте. Думаю, в этой части я не буду слишком много делиться теорией, но чаще буду делиться своим кодом. Потому что..

    Использование машинного обучения и Python для классификации 1000 сезонов новичков MLB Hitter
    Чему может научиться машина, глядя на сезоны новичков 1000 игроков MLB? Это то, что исследует это приложение. В этом процессе мы будем использовать неконтролируемое обучение, чтобы..

    Учебные заметки: создание моего первого пакета Node.js
    Это мои обучающие заметки, когда я научился создавать свой самый первый пакет Node.js, распространяемый через npm. Оглавление Глоссарий I. Новый пакет 1.1 советы по инициализации..

    Забудьте о Matplotlib: улучшите визуализацию данных с помощью умопомрачительных функций Seaborn!
    Примечание. Эта запись в блоге предполагает базовое знакомство с Python и концепциями анализа данных. Привет, энтузиасты данных! Добро пожаловать в мой блог, где я расскажу о невероятных..


    Для любых предложений по сайту: [email protected]