pexpect庫run函式的使用詳解

帶著紅領巾的雷鋒發表於2017-06-21

  前面我們pexpect庫的spawn類的方法,在pexpect庫中,除了spawn類以外,還有其他工具和類。現在來看在pexpect庫中有哪些其他工具和類。

  其他工具和類

  1、run函式,是pexpect庫中用於執行簡單命令的基本函式。主要用於快速執行不用與其互動或僅需很少互動的程式。

  2.它是簡化版的spawn類。

  3.直接返回子程式執行的輸出資訊。

  4.commond主要是用於提供一個單獨的命令列,或者帶引數的命令列。在run函式中其他相關引數和spawn類的構造方法的引數基本是一樣的。

  5.在run這個函式中,withexistatus為True時,返回輸出和退出狀態。也就是說如果將這個引數為預設值,此時在run函式在執行完子程式以後,直接輸出的就是群執行的程式,它的所有的輸出資訊。如果將這個引數為True時,run函式不僅返回子程式的輸入資訊,同時還返回子程式的退出狀態,一般的正常退出為0。

  對run函式,還可以用於與子程式進行簡單的互動,實現與子程式進行互動的引數是events。

  events幾種形式

  1.列表形式。在列表的每一項中,給出了子程式輸出某種資訊時我們應該給它的應答是什麼。

  2.字典形式。即字典的建是用於匹配的項。字典的建所定的值是應答子程式的字串。要注意的是這裡應答子程式的字串的末尾應有\n換行符。

  pattern是要匹配的正規表示式或者字串。resp可以是子命令。resp可以是一個函式,接受一個字典引數,其中儲存的是run()中定義的變數及其值。

  run函式基本使用的例項

  首先開啟虛擬機器,啟動一個終端,啟動Python3,匯入pexpect庫。首先看一下,用run來執行一個基本的命令,比如執行ls目錄,這時我們指定它的工作目錄。和spawn類一樣,我們可以指定cwd這個引數。可以看到ls這個命令執行完以後,相應的資訊也輸出了。為了觀看的方便,還可以將它進行解碼。複製它,可以看到這裡列出了home djx目錄下的所有檔案,以及資料夾,當然在 run的引數中,子命令中,我們還可以為ls命令提供一個引數,比如:加上一個-l。同樣還是讓它列出djx目錄下的檔案和目錄。它列出的資訊比ls單獨的不帶引數的要更詳細一些。

  enter image description here

  現在來看,當提供withexitstatus引數為true時,它的返回狀況。我們執行最簡單的withexitstatus,可以看到此時的返回是一個原主的形式。它的原主的第一個部分從這個位置到這個位置的命令輸出,然後後面跟一個0,表示執行的ls這條命令是正常退出的返回碼為0。當然run函式還可以通過events這個引數與子程式進行互動。

  下面我們用run的events引數與子程式互動的方法。首先嚐試通過ftp命令來登入伺服器,然後登入完以後再退出這個伺服器。首先啟動伺服器,檢視本機的ip地址可以看到本機的ip地址為192.168.1.3,下面呼叫run這個函式,來登入ftp伺服器。輸出的結果儲存在out中。提供的引數為ftp192.168.1.3 ,提供互動的引數為events。由於這個互動的引數既可以為列表也可以為字典形式,這裡首先用字典形式來定義互動。登入ftp的使用者名稱為命名使用者,這裡要提供換行符。登入的密碼為ab這個簡單的字串,也要提供換行符。登入成功時,伺服器返回的是230,然後輸入fine直接退出。輸出out,可以看到此時已經連線到ftp伺服器上了。當連線完成以後,輸入fine命令退出伺服器。通過ftp的日誌也可以看出登入了ftp伺服器使用命名使用者,然後使用ab來通過登入,最後退出ftp伺服器。

  enter image description here

  下面我們將為run提供一個events引數,events引數為列表形式,同樣的輸出資訊放到out中,此命令為192.168.1.3,也就是訪問本機的ftp伺服器。第一個仍然是匹配name,也就是輸入使用者名稱為命名使用者,密碼為ab,當要求使用者輸入密碼的時候,就用ab來替代。當成功登入時候返回的是230程式碼,並輸入fine來退出ftp。檢視out,可以看出也是連線上ftp伺服器,並且成功以後也退出了登入。這裡是以字典的形式,這裡是以列表的形式提供引數的。下面接著看對這個應答資訊,提供一個函式作為一個引數的情況,首先定義一個函式,它需要接受一個引數d,也就是一個字典引數,在這個應答資訊中,我們不進行其他的動作,也就是返回為空,但我們將run這個函式它相關選項直接列印出來。然後我們檢視執行nslookup,查詢麥子學院的ip地址。然後提供events引數,當輸出的資訊中含有server,就呼叫這個resp函式。可以看到執行的時候它匹配到了這個server,這個輸出資訊中有server內容。此時會呼叫resp這個函式,輸出d也就是run當中所定義的所有變數字典。這個字典正好在這個位置。

  enter image description here

 

  原文連結:http://www.maiziedu.com/wiki/library/run/

相關文章