2011-06-07 198 views
1

我試圖使用Python的telnetlib自動下載Argos數據,但是我似乎無法弄清楚如何讓它下載所有的輸出。我的部分問題可能是我並不真正瞭解這些命令的看似異步的特性。Python telnetlib沒有讀取所有東西

下面的代碼:

tn = telnetlib.Telnet(host = HOST, timeout = 60) 
with open("argos_prv_{0}-1.txt".format(now_str), 'w') as of: 
    tn.read_until("Username: ") 
    tn.write(user + "\n") 
    tn.read_until("Password: ") 
    tn.write(password + "\n") 
    tn.read_until("/") 
    # Here's the command I'm trying to get the results of: 
    tn.write("prv,,ds,{0:d},009919,009920\n".format(start_doy)) 
    # At this point, it's presumably dumped it all 
    tn.read_until("ARGOS READY") 
    tn.read_until("/") 
    # Logging out 
    tn.write("lo\n") 
    lines = tn.read_all() 
    of.write(lines) 
    of.flush() 

的代碼似乎運行得很好,但是當我看到在輸出文件,它永遠不會有它的一切,在一些隨機點切割。當我在真正的telnet會話中鍵入相同的命令時,它工作得很好。

我知道它在註銷後試圖登錄read_all()tn.write("lo\n")),但是當我查看telnetlib的示例文檔時,它看起來就像這樣。

無論如何,我的問題是:任何人都可以看到我在這裏做錯了嗎?我想抓住prv,,ds命令的結果,但我只是使用這個特定的代碼來獲得一些結果。

謝謝。

回答

0
# At this point, it's presumably dumped it all 
tn.read_until("ARGOS READY") 
tn.read_until("/") 

有人猜測,這一點是吮吸數據,並無所作爲。把它想象成一對管子 - 你用write一種方式發送東西,然後用read_*回收東西。如果你已經吸了些東西,當你稍後做read_all時,它不會在管道中等待。編輯: 好的,你看到一個不同的問題。試試這個:

lines = tn.read_until("ARGOS READY") 
lines += tn.read_until("/") 
tn.write("lo\n") 
# Write out lines to file. 
+0

這將使意義,如果這是同步的,但如果你看看telnetlib例子(http://docs.python.org/library/telnetlib.html#telnet-example)他們做同樣的事情(在發送'exit'後讀取'ls'命令的結果)。 – cswingle 2011-06-07 16:43:04

+0

這不是發送退出問題。關鍵在於該示例在它想要獲取數據之前不調用'read_ *'。因此,稍後它調用read_all時數據仍在等待。嘗試在'of.write(...)'中包裝這兩行。 – 2011-06-07 16:52:59

+0

我明白你的意思了。我嘗試註釋'tn.read_until(「ARGOS READY」)和'tn.read_until(「/」)'(所以代碼寫入'prv,ds',然後'lo',然後'read_all()')但它做同樣的事情:我得到了一些'prv'輸出,但連接似乎在我全部獲得之前就終止了。 – cswingle 2011-06-07 17:14:26