簡介
Flake8 是由Python官方發布的一款輔助檢測Python代碼是否規范的工具,相對於目前熱度比較高的Pylint來說,Flake8檢查規則靈活,支持集成額外插件,擴展性強。Flake8是對下面三個工具的封裝:
1)PyFlakes:靜態檢查Python代碼邏輯錯誤的工具。
2)Pep8: 靜態檢查PEP8編碼風格的工具。
3)NedBatchelder’s McCabe script:靜態分析Python代碼復雜度的工具。
不光對以上三個工具的封裝,Flake8還提供了擴展的開發接口。
官方文檔:https://pypi.python.org/pypi/flake8/
安裝
這里介紹兩種安裝方法:
1.在Ubuntu 16.04安裝Flake8。
apt-get update
apt-get install python-flake8
2.在Windows安裝Python之后,打開cmd,通過命令:
python<version> -m pip install flake8
其中,<verison>代表着Python的版本號,可通過python –v或者python –version進行查看。
當然也可以直接按默認配置安裝Flake8:
python -m pip install flake8
可通過flake8 –help查看是否安裝成功。
建議還是按照Python版本號來鏡像安裝,Windows下以默認安裝形式做靜態代碼檢查,會檢測到與Python3一些沖突的地方,如下:
使用方法
文件結構如下:

1.檢查指定文件:Flake8 + Python項目名,標紅框表示通過Flake8默認配置檢測出來的問題。

從紅色方框中可以看到 Flake8檢測到了四個errors,歸類為H101、H233、F821,H開頭的是安裝hacking插件后檢測出來的錯誤,Flake8基礎錯誤返回碼一共有三類:
E***/W***: PEP8中的error和warning。F***: 通過PyFlakes檢測出的error,其實PyFlakes本身是不提供錯誤返回碼的,flake8對pyflakes返回的錯誤消息進行了分類。C9**: 通過McCabe檢測出的代碼復雜度。Flake8提供一個擴展選項:--max-complexity,如果函數的McCabe復雜度比給定的值更高將發出一個告警。該功能對於發現代碼過度復雜非常有用,根據Thomas J. McCabe, Sr(Cyclomaticcomplexity的創造者)研究,代碼復雜度不宜超過10,而Flake8官網建議值為12。
2.展示特定錯誤
假如靜態代碼檢查中想展示項目下的H233特定錯誤怎么辦呢?可以通過flake8 --select命令來實現:
flake8 --select H233 shadowtest
如果需要選擇以特定類型開頭的錯誤碼,eg:以E開頭
flake8 --select E shadowtest
如果需要選擇多個特定錯誤碼用逗號隔開就可以了,eg:錯誤碼1,錯誤碼2。
3.忽略特定錯誤碼
靜態代碼檢查忽略H233類型錯誤,設定多個忽略方法同上
flake8 --ignore H233 shadowtest
4.忽略特定文件/文件夾
靜態代碼檢查忽略test2.py文件,設定多個忽略方法同上
flake8 --exclude shadowtest/path2/test2.py shadowtest
靜態代碼檢查忽略path2整個文件,設定多個忽略方法同上
flake8 --exclude shadowtest/path2/shadowtest
5.輸出修改格式
flake8 --format=%(path)s::%(row)d,%(col)d::%(code)s::%(text)s shadowtest
假如想把代碼復雜度設為其他值,只看幾種類型的錯誤,並且有幾個文件夾下的內容不需要檢查是不是每次檢查都要把上面的設置重新輸入一遍?解決如下:配置文件。
Flake8它是支持將個人設定保存在配置文件里面的,我們可以通過以setup.cfg, tox.ini, 或者.flake8以上三種文件形式保存配置。
以tox.ini為例:

輸出結果前后對比:
未加入配置前:

加入tox.ini配置后:
假如ignore里面包含H101,但是select也包含H101怎么辦?
經過試驗:select的優先級比ignore高,兩者都含有相同的錯誤類型下,ignore的這一錯誤類型的檢查會被忽略掉。
假如存在多個配置文件,怎么處理?
可以通過flake8 --config=配置文件項目名稱,這種方式解決。
6.通過setup.py檢查工程中所有的python文件
關於setup.py相關概念參考這篇文章:http://lingxiankong.github.io/blog/2013/12/23/python-setup/
7.配置其他
關於Flake8更多命令參考:flake8 –help
Flake8的小插件
Flake8相比其他Python靜態代碼檢查工具的優勢在於其良好的擴展性,以下是介紹Flake8幾款比較流行的插件:
1.hacking
由於Python是OpenStack的官方語言,hacking則是根據OpenStack Style Guidelines所產生,基於原有的Google Python Style Guide和OpenStack自有規則而形成的。hacking官方文檔:https://pypi.python.org/pypi/hacking
插件安裝也非常簡單,通過pip安裝hacking,Windows cmd窗口執行:
python –m pip install
hackinghacking插件安裝完成之后,會新增一類錯誤返回碼以H開頭:H***:hacking返回的錯誤類型。
在hacking中有些錯誤類型檢測是默認關閉的,可以通過命令行或者配置文件修改開關:enable-extensions= H106,H203
2.pep8-naming
針對目前pep8尚未支持命名規范的檢查,有人開發出了此款插件作為規則補充。
pep8-naming插件安裝完成之后,會新增一類錯誤返回碼以N開頭:
N***: pep8-naming返回的錯誤類型。
其他插件可以通過命令:pip search flake8來搜索,肯定有你需要的,安裝也非常簡單:pip install 插件名稱
有些坑先提示一下:
規則檢查插件與插件之間,可能會存在重復提示,假如要排除一類則你的配置文件會越來越復雜,並不是安裝越多越好,工具不在於過多,而在於會用。插件與插件之間,尤其是兩個新的插件可能無法完美兼容。eg:為了可視化,本人在flake8上面安裝了flake8-chart 0.1.5這一插件,
通過這一插件將flake8的分析結果轉化為圖形(只支持餅圖和柱狀圖)。
執行以下命令:
flake8 --statistics shadowtest |flake8chart--chart-type=BAR --chart-output=shadow.svg


在Jenkins上分析flake8的報告
在Flake8上安裝插件,flake8-junit-report將flake8的報告轉換為junit format,可以通過構建后操作 Publish Junit testresult report能不能輸出文檔:
1.安裝flake8-junit-report
2. pip install flake8-junit-report
3.輸出Flake8測試報告
4.flake8 --output-file flake8.txt shadowtest
5.轉換成junit測試結果的xml
6.python -m junit_conversor flake8.txt flake8_junit.xml
7.轉換成junit.xml報告:

8.在Jenkins上面展示:

以上由網易企業服務-企業信息化服務提供商:湖南領先網絡科技有限公司 整理發布。
網易企業服務是網易憑借其20年品牌優勢與經驗打造的企業級產品矩陣,致力於提供一站式企業信息化解決方案。網易企業服務的推出是網易在企業郵箱的基礎上對企業市場的進一步重要布局。湖南領先網絡科技是網易企業產品一級經銷商,專業為企業提供一站式信息化解決方案。
本文僅代表作者觀點,不代表百度立場。系作者授權百家號發表,未經許可不得轉載。