[問題] 請問telnetlib裡的read_until()

看板Python作者時間6年前 (2019/02/20 11:20), 6年前編輯推噓4(404)
留言8則, 2人參與, 6年前最新討論串1/1
文件上的說明是直到預期的byte字串才讀進來,用PTT來測試的話 import telnetlib import time tn = telnetlib.Telnet('ptt.cc') account = 'username'.encode('utf-8') password = 'password'.encode('utf-8') tn.read_until(b'test', timeout=10) tn.write(account + b'\r\n') tn.read_until(b'test', timeout=10) tn.write(password + b'\r\n') time.sleep(2) tn.write(b'\r\n') 發現這樣還是可以成功登入,比方說一開使要判斷是否有'請輸入代號'的字串,有的話才 輸入帳號,可是就算是用其它的字元去判斷還是沒有差別。然後又看到文件後面說: When no match is found, return whatever is available instead, possibly empty b ytes. 所以應該是沒有讀到預期的字串,所以就把能讀的讀進來這樣。原本以為如果預期的字串 一直都沒來,timeout 到了之後就什麼也不讀,也就是為空,然後藉此去判斷是否讀入預 期的字串。 後來又發現只寫這樣也能登入,當然這是因為知道輸入帳號後接著輸入密碼的緣故。 time.sleep(2) tn.write(account + b'\r\n') time.sleep(2) tn.write(password + b'\r\n') 所以我不太明白read_until()的用途?另外有看到另一種寫法是用 read_very_eager(), 然後用字串是否在讀入的內容裡判斷這樣,像是 if read in tn.read_very_eager(): 想請問如果要判斷當指定的字串被讀入要執行對應的動作時,該怎麼寫比較好。 -- ※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 36.232.47.202 ※ 文章網址: https://www.ptt.cc/bbs/Python/M.1550632858.A.598.html

02/20 13:06, 6年前 , 1F
是要練習嗎??版上應該有別人寫好的版本了?
02/20 13:06, 1F

02/20 14:01, 6年前 , 2F
read_util 意思是讀到xxxx 就中斷 剩下的就不管了
02/20 14:01, 2F

02/20 14:01, 6年前 , 3F
你 sleep 2 秒了 當然 ptt 一訂都載入完了 所以可以登
02/20 14:01, 3F
我的意思是當使用read_until時,假設預期要讀的是xxxx,可是當讀不到xxxx沒有時,它 還是會讀一些其它的東西進來,比方說以PTT為例,預期讀到'請輸入代號'後去輸入帳號, 可是就算把它改成預期讀'請輸入您的密碼',read_until 還是會把整串東西讀起來,而裡 面並沒有包含'請輸入您的密碼',也就是說讀進了不想讀的東西進來, 所以我不太明白它 的用途在哪 ※ 編輯: jijuan (36.232.47.202), 02/20/2019 15:57:14

02/20 17:39, 6年前 , 4F
誠如我推文所說 讀到 xxxx 就可以做下一步了
02/20 17:39, 4F

02/20 17:39, 6年前 , 5F
不用在那邊等兩秒...你光輸入帳密就要四秒...
02/20 17:39, 5F

02/20 17:40, 6年前 , 6F
版眾寫的 PTT Library 已經處理掉所有案例登入成功了
02/20 17:40, 6F

02/24 14:38, 6年前 , 7F
所以我都用 read_very_eager,一直讀直到沒東西為止
02/24 14:38, 7F

02/24 14:38, 6年前 , 8F
如果你要偵測畫面變化的話就要自己多加一層buffer處
02/24 14:38, 8F
文章代碼(AID): #1SRCUQMO (Python)
文章代碼(AID): #1SRCUQMO (Python)