2013-10-24 6 views
1

Фон: Чтобы получить практику, я пишу приложение для работы, которое позволит пользователям службы справки grep | хвостовых журналов, не требуя от них выполнения SSH/терминальной работы. Эти пользователи работают на машинах Windows, иначе я бы использовал подпроцесс. Некоторые из серверов используют системные учетные записи (и они заполняются в сценарии), но другие требуют, чтобы пользователь вводил учетные данные.tkinter gui зависает, когда функция не работает

Когда выполняется сценарий (подробности ниже), и пользователь неправильно вводит свои учетные данные, приложение зависает после того, как вы выбрали «Обработчики ошибок» для журнала «paramiko.transport». Когда пользователь выбирает параметр, который не имеет предварительно заполненных учетных данных, им предлагается ввести имя пользователя и пароль. Учетные данные добавляются в соответствующий список, всплывающее окно уничтожается и вызывается функция проверки журнала. Что может заставлять окно зависать, когда возникает ошибка, и каков наилучший способ решения таких проблем?

Я попытался добавить logging.basicConfig(), но приложение все еще зависает. затем появляется окно Учетные

lambda: credentials() if hosts[log.get()][0] in needs_pass else log_check() 

Если имя хоста находится в списке:

Полный сценарий: http://pastebin.com/TUvs92yN

Когда пользователь первым нажмет кнопку представить следующее вызывается. После того, как пользователь вводит свой логин и пароль функция submit_cred() называется:

def submit_cred(): 
    if len(hosts[log.get()]) < 3: 
     hosts[log.get()].append(username_prompt.get()) 
     hosts[log.get()].append(password_prompt.get()) 
    prompt.destroy() 
    log_check() 

Это где начинается проблема. Если учетные данные были правильными, приложение отображает результаты, как ожидалось, но если не вызывается log_check() после того, как окно будет уничтожено, будет получена ошибка и приложение зависает. Я попытался справиться с задачами проверки подлинности в log_check(), но на данный момент, похоже, он не достаточно далеко, чтобы это имело значение.

ответ

1

Я считаю, что проблема связана с вызовом метода paramiko ssh connect. Метод принимает необязательный аргумент тайм-аута, но для таймаута по умолчанию установлено значение «Нет», и поэтому он никогда не возвращается. Если вы установите это значение на что-то более разумное для пользователя, что-то вроде 5 секунд (вы можете установить, что немного больше на практике):

# Verify connectivity/authenticate. 
    try: 
     ssh.connect(host, username=user, password=passwd, timeout=5) 

Теперь вы заметите, вы попадаете за исключением пункта , Сообщение об исключении будет «отключено», поэтому вы можете добавить туда чек.

Кроме того, неплохо было бы обернуть такие функции в графическом интерфейсе в потоке, чтобы предотвратить зависание всего приложения, его довольно легко реализовать. В вашем случае, вы могли бы сделать что-то вроде переименовать текущую log_check функции _log_check, а затем написать небольшую обертку, как:

def log_check(self): 
    t = Thread(target=_log_check) 
    t.start() 

Надеется, что это помогает!

Смежные вопросы