Python 3, графический интерфейс Tkinter, задача Juniper Switch DevOps

#python #python-3.x #juniper #junos-automation

#python #python-3.x #juniper #junos-автоматизация

Вопрос:

Я занимаюсь python уже около 3 недель, поэтому очень новичок в нем. Не судите меня по моему коду! 🙂

Я создал приложение, позволяющее выполнять основные функции сетевых операций одним нажатием кнопки, такие задачи, как: Отключить / включить интерфейс, Отключить / Включить безопасность интерфейса, показать интерфейс Vlan / базу данных состояния коммутаторов с автоматическим поиском на основе имени компьютера.

Однако последнее, что мне нужно, это иметь возможность проверять файл журнала на коммутаторе, а затем каждые несколько секунд запускать обновление, чтобы получить последние несколько записей. Это используется для поиска пользователя путем мониторинга интерфейса на предмет состояния «Вверх» / «вниз», когда они отключают свое соединение, а затем снова подключают его.

Я получил код для извлечения файла, вырезал, разделил его на список, затем отредактировал список, чтобы отобразить последние 10 записей: для взаимодействия с коммутатором используется библиотека Junos-EZNC:

 def monitorInterface():        
    username = usernameEntry.get()      # Get username from entrybox in mainWindow
    password1 = passwordEntry.get()     # Get password from entrybox in mainWindow
    hostIP = SwitchIPEntry.get()        # Get switch IP from entrybox in mainWindow
    switchPort = SwitchPortEntry.get()  # Get switchport from entrybox in mainWindow
    count = 0
    with Device(host=hostIP, user=username, password=password1) as dev: # Logon bits
        dev.open() # Open connection

        while count < 10: 
            logReturn = dev.rpc.get_log(filename='messages') # Grab file 
            logReturn1 = etree.tostring(logReturn, encoding='unicode', pretty_print=True) # convert file to readable
            logReturn2 = logReturn1.split('n') # Split file in to list based on new line
            logReturn3 = logReturn2[-10:] # read last 10 results of the list
            TextBoxData.insert(INSERT, logReturn3) # Print List of 10 in textbox
        dev.close()

  

Проблема, с которой я сталкиваюсь, заключается в том, что я хочу, чтобы этот def включался / выключался и запускался каждые несколько секунд, чтобы он мог отображать сообщение up / down, которое появляется в журнале, который снимается с коммутатора, практически в режиме реального времени, плюс-минус несколько секунд.

На данный момент мой код блокируется во время выполнения def. То, что я ищу, — это какие-то подпроцессы? Я могу включить это, чтобы его запуск не влиял на основной цикл? Таким образом, я могу иметь «пока кнопка x имеет значение true: (выполнить функцию) и не останавливать работу графического интерфейса.

Я нахожусь на пределе своих навыков / знаний, и, похоже, я не вижу хорошего ответа в Google! может быть, я просто не знаю, как назвать исправление!

Любая помощь была бы отличной!

Райан

Комментарии:

1. и я, похоже, не вижу хорошего ответа в Google! Что вы искали? Вы изучали потоковую обработку?

2. Я посмотрю сейчас и вернусь к вам! Спасибо, что перезвонили мне!

3. while count < 10: это бесконечный цикл, учитывая, что внутри цикла ничего не меняется count .

4. Извините, в коде было, я, должно быть, пропустил это во время копирования и вставки.

Ответ №1:

AMC,

Спасибо, что указали мне правильное направление! Мне не хватало многопоточности!

Итак, после еще немного поисков в Google и ломания головы я нашел правильный пример.

 import time
import threading

def threadingFunc():
    t1 = threading.Thread(target=theFunctionToRun)
    t1.start()

def theFunchtionToRun():
    #do stuff here#

checkbox that calls the function threadingFunc
  

И это сделало свое дело, теперь мой графический интерфейс остается живым, а мой эквивалент «monitor interface-logs» работает как шарм!

Спасибо!

Райан