背景介紹
Expect 程序主要用于人機對話的模擬,就是那種系統提問,人來回答 yes/no ,或者賬號登錄輸入用戶名和密碼等等的情況。因為這種情況特別多而且繁瑣,所以很多語言都有各種自己的實現。最初的第一個 Expect 是由 TCL 語言實現的,所以后來的 Expect 都大致參考了最初的用法和流程,整體來說大致的流程包括:
運行程序
程序要求人的判斷和輸入
Expect 通過關鍵字匹配
根據關鍵字向程序發送符合的字符串
TCL 語言實現的 Expect 功能非常強大,我曾經用它實現了防火墻設備的完整測試平臺。也因為它使用方便、范圍廣,幾乎所有腳本語言都實現了各種各樣的類似與Expect的功能,它們叫法雖然不同,但原理都相差不大
pexpect 是 Python 語言的類 Expect 實現。從我的角度來看,它在功能上與 TCL 語言的實現還是有一些差距,比如沒有buffer_full 事件、比如沒有 expect before/after 事件等,但用來做一般的應用還是足夠了。
基本使用流程
pexpect 的使用說來說去,就是圍繞3個關鍵命令做操作:
首先用 spawn 來執行一個程序
然后用 expect 來等待指定的關鍵字,這個關鍵字是被執行的程序打印到標準輸出上面的
最后當發現這個關鍵字以后,根據關鍵字用 send 方法來發送字符串給這個程序
第一步只需要做一次,但在程序中會不停的循環第二、三步來一步一步的完成整個工作。掌握這個概念之后 pexpect 的使用就很容易了。當然 pexpect 不會只有這 3 個方法,實際上還有很多外圍的其他方法,我們一個一個來說明
API
spawn() - 執行程序
spawn() 方法用來執行一個程序,它返回這個程序的操作句柄,以后可以通過操作這個句柄來對這個程序進行操作,比如:
process = pexpect.spawn('ftp sw-tftp')上面 spawn() 中的字符串就是要執行的程序,這里我們打開一個到 sw-tftp 服務器的 ftp 連接。 spawn() 中的第一個元素就是要執行的命令,除此之外還可以指定一些其他參數,比如: pexpect.spawn('ftp sw-tftp', timeout=60) 就指定了超時時間,這些具體的會在后面講解。
process 就是 spawn() 的程序操作句柄了,之后對這個程序的所有操作都是基于這個句柄的,所以它可以說是最重要的部分。盡量給它起個簡短點的名字,不然后面的程序要多打不少字的。-
注意: spawn() ,或者說 pexpect 并不會轉譯任何特殊字符 比如 | * 字符在Linux的shell中有特殊含義,但是在 pexpect 中不會轉譯它們,如果在 linux 系統中想使用這些符號的正確含義就必須加上 shell 來運行,這是很容易犯的一個錯誤。
正確的方式:
process = pexpect.spawn('/bin/bash –c "ls –l | grep LOG > log_list.txt"')process.expect(pexpect.EOF)
新聞熱點
疑難解答