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
命令的結果,但我只是使用這個特定的代碼來獲得一些結果。
謝謝。
這將使意義,如果這是同步的,但如果你看看telnetlib例子(http://docs.python.org/library/telnetlib.html#telnet-example)他們做同樣的事情(在發送'exit'後讀取'ls'命令的結果)。 – cswingle 2011-06-07 16:43:04
這不是發送退出問題。關鍵在於該示例在它想要獲取數據之前不調用'read_ *'。因此,稍後它調用read_all時數據仍在等待。嘗試在'of.write(...)'中包裝這兩行。 – 2011-06-07 16:52:59
我明白你的意思了。我嘗試註釋'tn.read_until(「ARGOS READY」)和'tn.read_until(「/」)'(所以代碼寫入'prv,ds',然後'lo',然後'read_all()')但它做同樣的事情:我得到了一些'prv'輸出,但連接似乎在我全部獲得之前就終止了。 – cswingle 2011-06-07 17:14:26