本文篇幅較長,請收藏并耐心閱讀
首先請讀者原諒這個文章标題有些唬人了。借用Bruce Eckel大師的話“Life is short. You need Python”,其實你會發現萬物相通,道法歸一。目前社會節奏飛快,我們需要快速學習很多新東西,學以緻用,但沒必要糾結是否要精通。因為很多東西上升不到道法體系的層次,大多數隻是純技術、純應用,隻需做到用完即走,閱後即焚,清理累贅,落得個白茫茫大地真幹淨。
在我們有限的精力裡,總期望學的更多,幹的更好,活的更精彩。然而現實中我發現很多運維、開發人員工作不會使用python。難道python很難麼?是的,學精難,但輔助工作還是可以分秒速成的。就以我們團隊為例,都是幹運維的,因工作需要去做運維自動化平台,接觸python程式從0到1,當天即寫程式,項目一期很快就完成了。不得不承認我們隻是在應用python,我們不是理論大師,我們隻是搬運工。作為技術應用人員,我們目标就是運用python工具支撐我們的業務發展,這就足以。
人生苦短,我用python,為了精彩人生,請讓我們開啟python速成模式。本文以實際工作案例出發,提煉出極簡約的python教程,不啰嗦筆墨,節省讀者時間,旨在給大家梳理思路,快速上手。跟我來,别掉隊,沒有什麼學不會。
本文目錄内容如下,不妥之處,懇請廣大讀者批評指正,真誠期待交流互動。

運維幹的活很雜,很瑣碎;即高端,也很基礎;要細緻靈活,也要搬得動伺服器。
運維有很多痛苦和尴尬。任何行業工作都有其委屈尴尬的一面,背黑鍋是運維人員成熟曆練的必經之路。
運維工作的特點決定運維需要掌握很多知識技能,需要知識面寬廣,也要有所精專,更需要架構體系能力。那麼如何解決IT運維之痛呢?其實推行運維自動化很好的切入點。
通過實施運維自動化,能夠很好貫穿人、事、物、流程标準,進而有效地貫徹品質、成本、效率和安全體系。運維體系的好壞影響運維自動化的實施執行,反過來,運維自動化也會推動運維體系的建設。當雲計算時代到來的時候,面對成百上千、上萬台機器,人工手工運維顯然是不現實的,這個時候就凸顯自動化運維的優勢了。自動化運維分擔了我們很多的工作壓力,将重複、乏味的工作交給程式去做,推動運維工作更穩定,更高效、更智能。
那麼我們的運維自動化平台架構是這樣設計的:
我們運維平台使用的開發語言及工具:
後端開發主要通過Python程式實作。
資訊采集寫入ELK、Redis、MySQL資料庫。
前端WEB展示以及與背景資料層、應用層的互動通過Django架構實作。
界面修飾使用Bootstrap、Echarts等架構工具。
當時我們運維平台一期實作的功能如下:
目前Python已在各領域應用廣泛,同樣對于運維人員,python是一門很适合運維工作的語言工具。如下來自網友對python的形容:文法簡約,容易上手,适用廣泛,從抓寵物,到打外星人,啥都做…..python在linux系統裡通常是預設安裝、跨平台、可讀性好且開發效率高、有豐富的第三方庫(開發架構、各類API、科學計算、GUI等)、社群活躍,擁有衆多開發者。
好了,至此讓各位讀者瞻仰完我們開發的拙劣的運維系統,現在讓我們開始python學習速成之旅,本文所講授的python知識經驗都已在我們的運維系統中應用實踐。
Python是什麼?
Python是一種面向對象解釋型計算機程式設計語言,由Guido van Rossum(吉多·範羅蘇姆)發明,Python語言是一種既簡單又功能強大的程式設計語言,文法簡潔而清晰,具有豐富和強大的類庫,可以幫我們解決很多事情,比如做WEB開發、圖形圖像處理、科學計算、應用系統、運維管理、網絡程式等等。
Python簡單易學,擁有極其簡單的文法,是一種代表簡單主義思想的語言,正所謂:“人生苦短,我用Python”。
Linux系統預設會自動安裝Python程式包。在Windows系統下安裝需要手動安裝Python程式。對于初學者,建議可以在自己的Windows系統上安裝一個Python開放內建環境,例如notepad++,Pycharm等。對于熟悉.NET開發者,也可以使用Visual Studio內建環境。本文主要以Linux示例為主。
通常Python的解釋器被安裝在目标機器的 /usr/bin/python 目錄下。在指令行的Shell提示符下鍵入Python,啟動解釋器,>>>是Python語句的提示符。例如:
按Ctrl-d退出提示符。如果是在Windows指令行中,則按Ctrl-z再按Enter。
Python的IDE(內建開發環境)很多,比如vim、Pycharm、Visual Studio 2010、PyDev等。
Python至少應當有第一行那樣的特殊形式的注釋,它被稱作組織行,源檔案的頭兩個字元是#!,後面跟着一個程式。這行告訴你的Linux/UNIX系統當你執行程式的時候,它應該運作哪個解釋器。
執行Python腳本文法如下:
python + [python腳本名稱]
例如:#python helloworld.py
或者 #./helloworld.py
注意:上述都是在目前相對路徑下執行Python腳本。當然你也可以寫絕對路徑。
同其他語言的變量概念基本一樣,變量隻是你的計算機中存儲資訊的一部分記憶體。
變量可以處理不同類型的值,稱為資料類型。基本的類型是數和字元串。
在Python中有4種類型的數——整數、長整型、浮點數和複數。
整數是正或負整數,不帶小數點。例如1、2、-3都是整數的例子。
長整型不過是大一些的整數。整數最後是一個大寫或小寫的L。例如2344352454665L。
浮點型(floating point real values)由整數部分與小數部分組成。例如1.23、-1.23。對于很大或很小的浮點數,就用科學計數法表示,例如,0.00123可以用12.3E-4表示。E标記表示10的幂。那麼12.3E+4是多少呢?
複數(complex numbers)的虛部以字母J 或 j結尾。(1+2j)和(2.3-4.6j)是複數的例子。
以下執行個體在變量指派時數字對象将被建立:
可以使用del語句删除一些數字對象引用。del語句的文法是:
可以通過使用del語句删除單個或多個對象,例如:
字元串是字元的序列。字元串基本上就是一組單詞。
使用單引号(’):你可以用單引号訓示字元串,就如同‘hello world’這樣。所有的空白,即空格和制表符都照原樣保留。
使用雙引号(”):在雙引号中的字元串與單引号中的字元串的使用完全相同,例如”What’s your name?”。
使用三引号(’’’或”””):利用三引号,你可以訓示一個多行的字元串。你可以在三引号中自由地使用單引号和雙引号。例如:
建立字元串很簡單,隻要為變量配置設定一個值即可。例如:
注意:
字元串是不可變的。這意味着一旦你創造了一個字元串,你就不能再改變它了。
l “\”是轉義符,按字面意義級連字元串。如果你把兩個字元串按字面意義相鄰放着,它們會被Python自動級連。例如,'What\'s'' your name?'會被自動轉為"What's your name?"。
Python不支援單字元類型,單字元在Python中也是作為一個字元串使用。Python通路子字元串,可以使用方括号來截取字元串,如下執行個體:
你可以對已存在的字元串進行修改,并指派給另一個變量,如下執行個體:
假設你想要在一個字元串中包含一個單引号(’),例如,這個字元串是What’s your name?。這不能直接用’What’s your name?’來訓示它,因為Python會弄不明白這個字元串從何處開始,何處結束。可以通過轉義符(反斜杠)來完成轉義。
例如這裡使用反斜杠\’來訓示單引号即可。例如你可以把字元串表示為’What\’s your name?’。
另一個表示這個特别的字元串的方法是”What’s your name?”,即用雙引号。類似地,要在雙引号字元串中使用雙引号本身的時候,也可以借助于轉義符。此外,你可以用轉義符\來訓示反斜杠本身。
在一個字元串中,行末的單獨一個反斜杠表示字元串在下一行繼續,而不是開始一個新的行。例如:
“This is the first line.\
This is the second line.”
等價于”This is the first line. This is the second line.”
如果你想要訓示某些不需要如轉義符那樣的特别處理的字元串,那麼你需要指定一個自然字元串。自然字元串通過給字元串加上字首r或R來指定。例如:
如下示例使用r指定一個自然字元串
ASCII(American Standard Code for Information Interchange)
是一種單位元組的編碼。計算機世界裡一開始隻有英文,而單位元組可以表示256個不同的字元,可以表示所有的英文字元和許多的控制符号。ASCII 碼使用指定的7 位或8 位二進制數組合來表示128 或256 種可能的字元。
備注:想想為什麼IT行業的計算機、資訊都是0和1表示呢?
這是因為克勞德.香農定義了比特的概念,奠定了資訊論的理論基礎。它明确了資訊量的定量表示方法,即資訊以二進制符号表示。
Unicode字元串
編碼有多種,例如ASCII、GB2312, BIG5等等,後來有了一種統一編碼規範,讓所有語言的字元都用同一種字元集來表示,這就是Unicode。最初的Unicode标準UCS-2使用兩個位元組表示一個字元,是以通常Unicode使用兩個位元組表示一個字元的。當然後來還有UCS-4标準,它使用4個位元組表示一個字元。
Unicode編碼長度是固定的,無論是數字、英文還是其他文字,是以Unicode編碼有點浪費空間。于是後來又有了UTF8,它對字元的長度是動态的,可變長的,這就解決了unicode的空間浪費的問題, UTF8通常使用一至四個位元組為每個字元編碼。
占1個位元組:一個數字、英文字母
占2個位元組:拉丁文、希臘文、西裡爾字母、亞美尼亞語、希伯來文、阿拉伯文等。
占3個位元組:基本等同于GBK,通常就是一個漢字的長度
占4個位元組:中日韓超大字元集裡面的漢字
Python允許你處理Unicode文本——你隻需要在字元串前加上字首u或U,例如u”This is a Unicode string.”。
在你處理文本檔案的時候使用Unicode字元串,特别是當你知道這個檔案含有用非英語的語言寫的文本時。
此概念同Shell基本一緻。預設地,Python希望每行都隻使用一個語句,這樣使得代碼更加易讀。如果你想要在一個實體行中使用多于一個邏輯行,那麼你需要使用分号(;)來特别地标明這種用法。分号表示一個邏輯行/語句的結束。例如:
空白在Python中是重要的代表這縮進、層次、子產品。行首的空白稱為縮進。在邏輯行首的空白(空格和制表符)用來決定邏輯行的縮進層次,進而用來決定語句的分組。這意味着同一層次的語句必須有相同的縮進。每一組這樣的語句稱為一個塊。錯誤的縮進會引發錯誤。
建議你在每個縮進層次使用單個制表符或兩個或四個空格,但不要混合使用制表符和空格來縮進,因為這在跨越不同的平台的時候,可能法正常工作。
Python運算符常用文法如表所示。
表:運算符
續表
下表給出了Python的運算符優先級,從最高的優先級(最緊密地結合)到最低的優先級(最松散地結合)。
表:運算優先級
資料結構是計算機存儲、組織資料的方式。資料結構是通過某種方式組織在一起的資料元素的集合,這些資料元素可以是數字或者字元,甚至可以是其他資料結構。
序列是Python中最基本的資料結構。Python有6個序列的内置類型,即清單、元組、字元串、Unicode字元串、buffer對象和xrange對象。最常見的是清單和元組。
序列都可以進行的操作包括索引、切片、加、乘、檢查成員。序列中的每個元素都配置設定一個數字,即元素位置(索引),第一個索引是0,第二個索引是1,依此類推。
清單是最常用的Python資料類型之一,它可以作為一個方括号内的逗号分隔值出現。清單的資料項不需要具有相同的類型。建立一個清單,隻要把逗号分隔的不同的資料項使用方括号括起來即可。如下所示:
與字元串的索引一樣,清單索引從0開始。清單可以進行截取、組合等。
使用下标索引來通路清單中的值,同樣你也可以使用方括号的形式截取字元,如下所示:
可以對清單的資料項進行修改或更新,你也可以使用append()方法來添加清單項,如下所示:
以上執行個體輸出結果:
可以使用del語句來删除清單的元素,如下示例:
元組和清單十分類似,隻不過元組和字元串一樣是不可變的,即你不能修改元組。元組使用圓括号,元素之間用逗号分割。如下示例:
元組與字元串類似,下标索引從0開始,可以進行截取、組合等,可以使用下标索引來通路元組中的值,如下示例:
元組中的元素值是不允許修改的,但我們可以對元組進行連接配接組合,如下示例:
元組中的元素值是不允許删除的,但我們可以使用del語句來删除整個元組,如下示例:
字典以關鍵字為索引,字典也被稱作關聯數組或哈希表。字典可以了解為一組鍵值對(key:value pairs)的集合。
關鍵字可以是任意不可變類型,通常用字元串或數值或元組,但不能使用清單作為字典的鍵。關鍵字必須是互不相同的(在同一個字典之内)。
一對大括号可以建立一個空的字典:{}。初始化連結清單時,在大括号内放置一組逗号分隔的關鍵字:值對,這也是字典輸出的方式。字典的主要操作是依據關鍵字來存儲和析取值。
每一對鍵與值用冒号(:)隔開,每一組鍵值之間用逗号(“,”)分割,整體放在花括号({})中。鍵必須獨一無二,但值則不必唯一。例如:
把相應的鍵放入方括弧内,如下示例:
向字典添加新内容的方法是增加新的鍵/值對,修改或删除已有鍵/值對。如下示例:
能删單一的元素也能清空字典。顯式删除一個字典用del指令,如下示例:
if語句用來檢驗一個條件,如果條件為真,我們運作一塊語句(稱為if-塊),否則我們處理另外一塊語句(稱為else-塊)。else從句是可選的。文法格式如下:
while語句隻要在一個條件為真的情況下,while語句允許你重複執行一塊語句。while語句是所謂循環語句的一個例子。while語句有一個可選的else從句。while語句文法格式如下:
for循環用于周遊元素或者對象的屬性。for語句文法格式如下:
break語句是用來終止循環語句的,哪怕循環條件不是False或序列還沒有被完全遞歸,也停止執行循環語句。
注意:如果break跳出for或者while循環之後,将不再執行任何與while或者for配套的else語句。
break文法示例如下:
continue語句被用來告訴Python跳過目前循環塊中的剩餘語句,然後繼續進行下一輪循環。使用continue文法示例如下:
pass 語句表示什麼也不做。它用于那些文法上必須要有什麼語句,但程式上什麼也不要做的場合,通常用于保持格式(或語義)的完整。例如:
給定一個數集A,對A施加對應法則fun,記作fun(A),得到另一數集B,也就是B=fun(A)。那麼這個關系式就叫函數關系式,簡稱函數。你可以定義一個有自己想要的功能的函數,以下是一些文法規則:
函數代碼塊以def關鍵詞開頭,後接函數辨別符名稱和圓括号()。
任何傳入參數和自變量必須放在圓括号中間。圓括号之間可以用于定義參數。
函數的第一行語句可以選擇性地使用文檔字元串——用于存放函數說明。
函數内容以冒号起始,并且縮進。
Return[expression]結束函數,選擇性地傳回一個值給調用方。不帶表達式的return相當于傳回 None。
預設情況下,參數值和參數名稱是按函數聲明中定義的順序比對起來的。
定義函數與調用方法如下:
函數參數類型有如下。
預設參數:預設參數須以正确的順序傳入函數。調用時的數量必須和聲明時的一樣,必須傳入一個參數,不然會出現文法錯誤。
命名參數:你的某個函數有許多參數,而你隻想指定其中的一部分,那麼你可以通過命名來為這些參數指派
預設參數:預設參數的值如果沒有傳入,則被認為是預設值。
不定長參數(可變參數):你可能需要一個函數能處理比當初聲明時更多的參數。
函數參數示例如下:
func(3, 7)的時候,參數a得到值3,參數b得到值7,而參數c使用預設值10。
func(25, c=24)的時候,根據實參的位置變量a得到值25。根據命名,即命名參數,參數c得到值24。變量b根據預設值,為5。
注意:參數args,**kargs這兩個是python中的可變參數。args表示任何多個無名參數,它是一個tuple元組;kwargs表示關鍵字參數,它是一個 dict字典。另外,在同時使用*args和kwargs時,參數args需要放在在參數*kwargs前面。
傳遞參數的時候,python不允許程式員選擇采用傳值還是傳引用。Python既不是值傳遞也不是引用傳遞,這種參數傳遞方式可了解為對象傳遞。Python中的object(對象)分為兩大類。一類是mutable object(可變對象),一類是immutable object(不可變對象)。
可變對象:如清單,字典,類的執行個體等。
不可變對象:數字、字元或者元組。
可變對象作為參數傳遞時,某些操作可類似于引用傳遞。
不可變對象作為參數傳遞時,類似于值傳遞。
一個程式的所有變量并不是在哪個位置都可以通路的。通路權限決定于這個變量是在哪裡指派的。變量的作用域決定了在哪一部分程式你可以通路哪個特定的變量名稱。兩種最基本的變量作用域如下。
l 全局變量:通常定義在函數外的變量擁有全局作用域。
l 局部變量:通常定義在函數内部的變量擁有一個局部作用域。
局部變量隻能在其被聲明的函數内部通路,而全局變量可以在整個程式範圍内通路。在函數體内若需要修改全局變量的值,則需要使用global關鍵字聲明為全局變量,否則是不可能為定義在函數外的變量指派的。如下示例:
子產品讓你能夠有邏輯地組織你的Python代碼段,把相關的代碼配置設定到一個子產品裡,能讓你的代碼更好用,更易懂。子產品也是Python對象,具有随機的名字屬性用來綁定或引用。
簡單地說,子產品就是一個儲存了Python代碼的檔案,即包括Python定義和聲明的檔案。檔案名就是子產品名加上.py字尾。子產品能定義函數、類和變量。子產品裡也能包含可執行的代碼。
包是一個有層次的檔案目錄結構,由子產品和子包組成。包通常是使用用“圓點子產品名”的結構化子產品命名空間。例如,名為A.B的子產品表示了名為“A”的包中名為“B”的子子產品。
想使用Python源檔案,隻需在另一個源檔案裡執行import語句,文法如下:
當解釋器遇到import語句,子產品在目前的搜尋路徑就會被導入。 搜尋路徑是一個解釋器會先進行搜尋的所有目錄的清單。習慣上所有的import語句都放在子產品(或腳本)的開頭,但這并不是必須的。被導入的子產品名入在本子產品的全局語義表中。如下示例:
Python的from語句讓你從子產品中導入一個指定的部分到目前命名空間中。文法如下:
把一個子產品的所有内容全都導入到目前的命名空間也是可行的,隻需使用如下聲明:
這提供了一個簡單的方法來導入一個子產品中的所有項目。然而這種聲明建議不要過多地使用。
導入可使用\進行換行,
可使用as更換子產品(方法)名稱:
當你導入一個子產品,Python解析器對子產品位置的搜尋順序是:
目前目錄。
如果不在目前目錄,Python則搜尋在Shell變量PYTHONPATH下的每個目錄。
如果都找不到,Python會察看預設路徑。UNIX下,預設路徑一般為/usr/local/lib/pythonX/。
子產品搜尋路徑存儲在system子產品的sys.path變量中。變量裡包含目前目錄,PYTHONPATH和由安裝過程決定的預設目錄。
每個子產品都有一個名稱,在子產品中可以通過語句來找出子產品的名稱。
如果子產品是被導入,name的值為子產品名字
如果子產品是被直接執行,name的值為’main’
這在一個場合特别有用:例如我們隻想在程式本身被使用的時候運作主塊,而在它被别的子產品輸入的時候不運作主塊,這時可以通過子產品的name屬性完成。如下示例:
如果你以前沒有接觸過面向對象的程式設計語言,那你可能需要先了解一些面向對象語言的一些基礎知識,這樣有助于你更容易地學習Python的面向對象程式設計。
類(Class): 用來描述具有相同的屬性和方法的對象的集合。它定義了該集合中每個對象所共有的屬性和方法。對象是類的執行個體。
方法:類中定義的函數。
資料成員:類變量或者執行個體變量用于處理類及其執行個體對象的相關的資料。
繼承:即一個派生類(derived class)繼承基類(base class)的字段和方法。繼承也允許把一個派生類的對象作為一個基類對象對待。例如,有這樣一個設計:一個Dog類型的對象派生自Animal類,這是 模拟”是一個(is-a)”關系(Dog是一個Animal)。
執行個體化:建立一個類的執行個體,類的具體對象。
對象:通過類定義的資料結構執行個體。對象包括兩個資料成員(類變量和執行個體變量)和方法。
Python的類提供了面向對象程式設計語言所有的标準特性。例如:類繼承機制允許有多個基類,一個派生類可以覆寫基類中的任何方法,一個方法可以使用相同的名字調用 基類中的方法。
使用class語句來建立一個新類,class之後為類的名稱并以冒号結尾,最簡單的類定義形式如下:
在類體中往往由類成員、方法、資料屬性組成。
你可以繼承多個類,方式如下:
類的定義要經過類執行個體化并執行才能生效。以下是一個簡單的Python類執行個體化及類繼承的示例:
注意到上面類定義中的方法都有一個self參數。類的方法與普通的函數隻有一個特别的差別——它們必須有一個額外的第一個參數名稱,但是在調用這個方法的時候你不需要為這個參數指派,Python會提供這個值。這個特别的變量指對象本身,按照慣例它的名稱是self。
Python中的self類似于C++中的self指針和Java、C#中的this參考。
init方法在類的一個對象被建立時,馬上運作。這個方法可以用來對你的對象做一些你希望的初始化。注意,init字母前後各有兩個下畫線。如下是使用init方法示例:
issubclass():布爾函數判斷一個類是另一個類的子類或者子孫類,文法為issubclass(sub,sup)。
isinstance(obj, Class):布爾函數如果obj是Class類的執行個體對象或者是一個Class子類的執行個體對象則傳回true。
異常即一個事件,該事件會在程式執行過程中發生,影響了程式的正常執行。一般情況下,在Python無法正常處理程式時就會發生一個異常。 異常是Python對象,表示一個錯誤。
當Python腳本發生異常時我們需要捕獲處理它,否則程式會終止執行。
捕捉異常可以使用try/except語句。try/except語句用來檢測try語句塊中的錯誤,進而讓except語句捕獲異常資訊并處理。如果你不想在異常發生時結束你的程式,隻需在try裡捕獲它。
通過異常,我可以處理如下幾個場景:
錯誤處理,當python檢查以程式運作時的錯誤就引發異常,你可以在程式裡捕捉和處理這些錯誤,或者忽略它們。
事件通知,異常也可以作為某種條件觸發的信号、标記。
特殊情形處理,有時有些情況是很少發生的,把相應的處理代碼改為異常處理會更好一些。
控制流,異常可作為特殊的”goto”流程。
python的try語句有兩種風格—-一種是處理異常(try/except/else),一種是無論是否發生異常都将執行最後的代碼(try/finally)。
以下為簡單的try….except…else的文法:
try:
<語句> #運作别的代碼
except <名字>:
<語句> #如果在try部份引發了’name’異常
except <名字>,<資料>:
<語句> #如果引發了’name’異常,獲得附加的資料
else:
<語句> #如果沒有異常發生
try的工作原理是,當開始一個try語句後,Python就在目前程式的上下文中做标記,這樣當異常出現時就可以回到這裡,try子句先執行,接下來會發生什麼依賴于執行時是否出現異常。
如果當try後的語句執行時發生異常,Python就跳回到try并執行第一個比對該異常的except子句,異常處理完畢,控制流就通過整個try語句(除非在處理異常時又引發新的異常)。
如果在try後的語句裡發生了異常,卻沒有比對的except子句,異常将被遞交到上層的try,或者到程式的最上層(這樣将結束程式,并列印預設的出錯資訊)。
如果在try子句執行時沒有發生異常,Python将執行else語句後的語句(如果有else的話),然後控制流通過整個try語句。
<語句>
except: #捕獲所有異常
except <名字>: #隻捕獲特定的‘name’異常
except <名字>,<資料>: #捕獲特定’name’異常和它的附加資料
except (name1,name2) #隻捕獲這裡列出的異常
finally: #退出try時總會執行
執行try下的語句,如果引發異常,則執行過程會跳到第一個except語句。
如果第一個except中定義的異常與引發的異常比對,則執行該except中的語句。
如果引發的異常不比對第一個except,則會搜尋第二個except,允許編寫的except數量沒有限制。
如果所有的except都不比對,則異常會傳遞到下一個調用本代碼的最高層try代碼中。
python總會執行finally子句,無論try子句執行時是否發一異常。
如果沒有發生異常,python運作try子句,然後是finally子句,然後繼續。
如果在try子句發生了異常,python就會回來執行finally子句,然後把異常遞交給上層try,控制流不會通過整個try語句。
如下是一個處理異常的例子。
Debug 對于任何開發人員都是一項非常重要的技能,它能夠幫助我們準确的定位錯誤,發現程式中的 bug。
pdb 是 python 自帶的一個包,為 python 程式提供了一種互動的源代碼調試功能,主要特性包括設定斷點、單步調試、進入函數調試、檢視目前代碼、檢視棧片段、動态改變變量的值等。pdb 提供了一些常用的調試指令,如下表所示。
你可以很友善的通過pdb子產品在你的腳本中設定斷點。正如下面這個例子:
你可以在腳本的任何地方加入pdb.set_trace(),該函數會在那個位置設定一個斷點。示例如下:
開始調試:直接運作腳本,會停留在 pdb.set_trace() 處,選擇 n+enter 可以執行目前的 statement。在第一次按下了 n+enter 之後可以直接按 enter 表示重複執行上一條 debug 指令。
執行結果示例
上一章節主要介紹了python基本文法概念,讓讀者朋友對python開發有一個整體基礎了解。本章内容則以實際案例出發,分享作者在實際運維工作中的開發經驗。
為友善讀者了解開發思路,下文案例将增加很多注解,正所謂炮制雖繁必不敢省人工。
周遊給定IP清單,程式根據預定密碼庫以多線程方式探測系統密碼。
2.2、密碼探測—改進版
生産系統通常不能root直接登入,需要其他賬号su切換,上述代碼就無法适應了這種情況,是以需要改進為如下程式,應對切換賬号,系統互動的場景。
根據IP位址清單,統計每個IP及其網段出現的次數,并進行排序。這裡借用字典進行計數統計。本程式沒有使用list清單的count()函數進行計數,因為性能無法适應大量統計的場景。
上例程式代碼邏輯清楚,但不夠精簡,也增加了CPU時間。本例引入正則比對IP字段,通過lambda表達式簡約代碼。
周遊給的IP清單檔案,多線程批量判斷IP位址連通情況。
假入你對ip輸入想更靈活一些,你想支援如下幾種IP輸入方式:支援逗号,分号;例如192.168.10.10;192.168.10.100,102,104;192.168.1.100-105,那麼上述程式可能就需要改進,首先要處理下不同輸入格式的IP位址,本例代碼示例如何格式化輸入的IP位址内容。
學開發,需要了解資料結構,需要有程式設計思想。本例使用清單,用棧來實作括号的比對檢測。
上例程式代碼邏輯清楚,但CPU耗時不夠優化,本例通過計數方式減少程式複雜度,比棧實作更快,減少CPU計算資源消耗。
至此,本文python運維開發速成暫告一段落,不知你速成了多少,相信各位讀者應該至少都了解了99%了(不是麼,告訴我你哪個字不認識?),其實隻差那最後一點靈犀(一份實踐,一下頓悟,一種程式設計思想),知易行難,實踐出真知,未經思考的幹貨不是自己的知識,未經驗證的經曆不是自己的人生。
如果誰有100%的速成法寶,請告訴作者,我也想速成,作者微信:
更多相關文章閱讀

本文轉自 憬薇 51CTO部落格,原文連結:http://blog.51cto.com/welcomeweb/2048606