2013-10-24 75 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() 

希望這有助於!