使用pexpert自動化工具在open文件時時報TypeError

  pexpert,是python自動化運維領域中一個重要工具,是DonLibes的Expect語言的一個Python實現(形象化理解爲pexpert=python+expert),在功能與fabric等工具很類似,是將terminal環境下的一些命令封裝成函數或類,這些命令做到跨平臺,事先寫好一系列語句放在腳本中,通過運行腳本文件進而避免一句一句的輸入,做到一鍵自動化操作(就是將按序執行的命令集**事先**寫成語句放到py文件中或其它能夠被執行的文件,然後通過執行文件(腳本),儘量減少時間成本和人員的投入,這個過程可以理解爲自動化),如在win中可以使用這些函數對Linux進行遠程操作。

最近想學一點python自動化運維方面的知識,有幸知曉該工具,就碼上一碼,場景:在使用pexpert做ssh遠程登錄,並將寫入日誌文件。代碼如下(
代碼運行環境:Anconada3, 若尚未安裝pexpert,請運行pip install pexpect下載安裝):

#-*-coding:utf-8-*-

import pexpect
import sys
child = pexpect.spawn("ssh [email protected]") # 可以理解遠程操作終端,在終端環境中創建子進程的方式來運行後續命令
fout = open("mylog.text", "w") # 文件對象
child.logfile = fout # logfile指向mylog文件,即child所產生在終端交互產生的信息寫入該文件,相當於橋樑
child.expect("password:") # 在終端產生的信息使用正則匹配password:
child.sendline("root1234") # 發密碼
child.expect("#") # 匹配 登錄成功後的符號"#"
child.sendline("ls /home") # 在登錄後的主機上執行終端命令
child.expect("#")

上述代碼雖少,當涉及的知識還是挺多的,如pexpert創建遠程子進程,ssh遠程登錄及實時交互信息,寫入日誌,隱式正則等等。 在運行過程中報
"TypeError: write() argument must be str, not bytes"錯誤. 實質上就是在終端輸入的"root1234"寫不到mylog.txt中,就是root1234的類型和文件的類型不一致造成的。網上找了找沒有找到解決之法。開始嘗試在open中指定encoding="utf-8", 不成;在expect中使用decode,還是不成功;無路看了看源碼(不貼了,有興趣自己可以看看底層代碼),瞎貓撞上死耗子,無意間使用wb模式open文件,哈哈使用pexpert自動化工具在open文件時時報TypeError,居然搞定了。
趁熱打碟,究其因,抓其本,繼續閱讀該碼,發現平時雖然很少在open上掉坑,但其中還是有不少鮮爲人知的內在細節,open的常用模式有:'r' (讀取) 、 “w”(寫入)、 "x"(讀寫混合)、 "a"(追加) 、 "t"(文本文件類型), "b"(二進制文件類型), 各種組合可分爲讀取和寫入兩大類。
很多人知道open默認是r模式,對了一半,其實默認是rt模式,即默認讀取文件類型,返回string類型,還用根據編碼encoding或coding手動進行解碼(decode);而b返回的是byte,不需decode。
1.如果open指定"
t"模式,則返回的TextIOWrapper對象;
2.指定"rb", 返回BufferedReader;
3.指定"wb", 返回BufferedWriter對象;
4."xb", 返回BufferedRandom對象;

attention☞☞☞`:在terminal的命令是放到buffer緩衝區中,系統自動創建buffer對象, 故本代碼要以"wb"模式才能將buffer對象寫入日誌中(留意:如果在非系統終端環境下所輸入的信息一般不會以buffer類型寫入文件,而是以string,bytes等類型寫入, 故此情況下若是普通文件open寫入, 一般用"w"即可(注意隱士"t"),不能使用"wb"(針對二進制文件如圖片,視頻等))。


閱讀完之後: 你知道本代碼爲什麼出現typeError了嗎?該怎麼解決?
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章