2013-10-24 44 views
1

背景:为了得到练习我正在编写一个应用程序的工作,将允许服务台用户grep |不需要他们执行SSH /终端工作的尾部日志。这些用户在Windows机器上运行,否则我会使用子进程。某些服务器使用系统帐户(并且这些服务器已预先填充到脚本中),但其他服务器则需要用户输入凭据。tkinter gui冻结时功能失败

当脚本(详情如下)运行并且用户错误地输入他们的凭证后,应用程序在抛出'没有处理程序可以被发现用于记录器'paramiko.transport''错误后挂起。当用户选择一个没有预填充凭证的选项时,系统会提示您输入用户名和密码。证书被附加到适当的列表中,弹出窗口被销毁并且日志检查功能被调用。当抛出错误时,可能会导致窗口挂起,以及处理此类问题的最佳方法是什么?

我试图添加logging.basicConfig(),但应用程序仍然挂起。

完整的脚本:http://pastebin.com/TUvs92yN

当用户第一次点击提交按钮调用如下:如果在列表中找到该主机名

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

然后出现凭据框。在用户输入用户名和密码后,调用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) 

现在你会发现你会打你的条款除外。异常消息将被“超时”,以便您可以在那里添加支票。

此外,在线程的GUI中封装类似的功能以防止整个应用程序冻结并不是一个坏主意,它很容易实现。在你的情况,你可以不喜欢你目前log_check功能重命名为_log_check,然后写一个小包装,如:

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

希望这有助于!