2014-02-24 81 views
1

所以我有一個腳本,它還沒有完全正常工作,但我希望它能夠一直試圖連接到服務器,直到它終於成功(使用paramiko庫)。在簡單的話來說,這就是我的代碼是這樣的:做'while while循環與try和except一起工作嗎?

canConnect = False 
while canConnect == False: 
    try: 
     stdin, stdout, stderr = ssh.exec_command('ps') 
     if stdout.read(): 
      canConnect = True 
     else: 
      # cannot connect 
      time.sleep(20) 
    except: 
     # cannot connect 
     time.sleep(20) 

現在...這將是很基本的一個簡單的if語句,而是因爲我需要使用「try」和「除」變得更加複雜。如果代碼可以成功連接(使用「ps」作爲返回內容的隨機命令並證明服務器是可連接的),我假定它傳入if條件,然後將canConnect設置爲True並停止循環。如果它不能連接,我認爲Paramiko會拋出一個異常(爲了以防萬一,我把「else」命令放在那裏),但是一旦它碰到「except」,它應該等待20秒,然後我假定while語句將會採用代碼回到開始並重新開始?我目前見證的是一些類型的循環正在發生,但它實際上並沒有試圖連接到服務器。

此外,一個無關的問題,文檔是稀缺的,但我認爲Paramiko /有/需要3個參數執行一個exec_command(不管分配的變量,他們將採取標準輸出的In,Out,Err的順序? )?我還假設除了列表或方法調用外,將多個以逗號分隔的變量分配給類似的東西並不常見?

+0

此代碼是否可用?你有錯誤嗎? – 2014-02-24 11:24:30

+2

你的問題可能是因爲你的'except:'捕獲了任何可能出錯的東西;如果與網絡無關的'ssh.exec_command'行發生任何錯誤,則會出現無限循環。 – RemcoGerlich

+0

'break','finally',你會得到更簡潔的代碼。 –

回答

1

我認爲您使用except:可能會掩蓋真正的問題,因爲它會捕獲所有異常情況並忽略它們。這將解釋some kind of loop is happening, but it doesn't actually appear to be attempting to connect to the server的行爲。考慮將其改爲如下所示:

except (paramiko.SSHException, socket.error) 
+0

我已經試過了,它仍然捕捉並且每當實際的服務器不可連接時不斷地在循環中碰到except子句。我假設你的建議是這樣的,只有當它拋出一個SSHException異常或一個socket.error時,程序纔會觸發它?我不認爲你知道打印出實際異常的方法(以防萬一它不是sshexception或socket.error?)雖然...即使它是一個不同的錯誤,我不知道爲什麼它未能滿足停止循環的第一條if語句的要求。 – Peter

+0

在except塊中加入:'import traceback'和'traceback.print_exc()'。或者只是不抓住它,看到堆棧跟蹤輸出。 – WeaselFox

+0

是的..看起來它確實會引發「paramiko.SSHException:SSH會話未激活」。我想我會一直試圖弄清楚爲什麼服務器啓動時發生這種情況。否則,我猜想我可能會重新想象一種不同的方法來測試服務器在重新啓動後是否可連接。謝謝。 – Peter