1. 安装pylint
使用pip install pylint安装。
注意:安装完成之后确认pylint.exe在python安装目录下的\Scripts目录下。
如果没有,将pylint.exe所在的文件目录添加到path下即可使用pylint命令。
2. 常用的命令行参数:
--generate-rcfile :
可以使用 pylint --generate-rcfile 来生成一个配置文件示例。可以使用重定向把这个配置文件保存下来用做以后使用。也可以在前面加上其它选项,使这些选项的值被包含在这个产生的配置文件里。如:pylint -- persistent=n --generate-rcfile > pylint.conf, 查看 pylint.conf,可以看到 persistent=no,而不再是其默认值 yes。
--rcfile=
: 指定一个配置文件。把使用的配置放在配置文件中,这样不仅规范了自己代码,也可以方便地和别人共享这些规范。
-i
, --include-ids= : 在输出中包含 message 的 id, 然后通过 pylint --help-msg=<msg-id>来 查看这个错误的详细信息,这样可以具体地定位错误。
-r
, --reports= : 默认是 y, 表示 Pylint 的输出中除了包含源代码分析部分,也包含报告部分。
--files-output=
: 将每个 module /package 的 message 输出到一个以 pylint_module/package. [txt|html] 命名的文件中,如果有 report 的话,输出到名为 pylint_global.[txt|html] 的文件中。默认是输出到屏 幕上不输出到文件里。
-f
, --output-format= : 设置输出格式。可以选择的格式有 text, parseable, colorized, msvs (visual studio) 和 html, 默认的输出格式是 text。
--disable-msg=
: 禁止指定 id 的 message. 比如说输出中包含了 W0402 这个 warning 的 message, 如果不希望它在输出中出现,可以使用 --disable-msg= W0402
3. 命令行使用pylint
生成配置文件:
pylint --generate-rcfile > pylint.conf
pylint --persistent=n --generate-rcfile > pylint.conf
使用 Pylint 对一个模块 module.py 进行代码检查:
1. 进入这个模块所在的文件夹,运行
pylint [options] module.py
(e.g. pylint --rcfile=pylint.conf module.py)
这种调用方式是一直可以工作的,因为当前的工作目录会被自动加入 Python 的路径中。
2. 不进入模块所在的文件夹,运行
pylint [options] directory/module.py
这种调用方式当如下条件满足的时候是可以工作的:directory 是个 Python 包 ( 比如包含一个 __init__.py 文件 ),或者 directory 被加入了 Python 的搜索路径中。
使用 Pylint 对一个包 pakage 进行代码检查:
1. 进入这个包所在文件夹,运行
pylint [options] pakage
这种调用方式是一直可以工作的,因为当前的工作目录会被自动加入 Python 的路径中。
2. 不进入包所在的文件夹,运行
pylint [options] directory/ pakage
这种情况下当如下条件满足的时候是可以工作的:directory 被加入了 Python 的路径中。比如在 Linux 上,export PYTHONPATH=$PYTHONPATH: directory。
此外,对于安装了 tkinter 包的机器,可以使用命令 pylint-gui打开一个简单的 GUI 界面,在这里输入模块或者包的名字 ( 规则同命令行 ), 点击 Run,Pylint 的输出会在 GUI 中显示。
4. 在pycharm里配置pylint
安装后在pycharm里配置:File - Settings - External Tools 点击+号增加名为pylint的工具
配置信息如下:
--output-format=parseable
--disable=R
-rn
--msg-template="{abspath}:{line}: [{msg_id}({symbol}), {obj}] {msg}"
$DirPath$
$DirPath$ --要review的代码所在目录,目录中必须包含__init__.py文件
5. 代码自定义执行扫描
# 定义要review的项目,或者需要review的模块
review_projects = [r'D:\test1', r'test2']
# 遍历执行review扫描,并将结果记录在制定的文件里
for project in review_projects:
results = Run(['--output-format=parseable',
'-rn',
'--disable=C0103,C0301,C0330,C0326,C0304,C0412,C0411,W0703',
'--msg-template="{abspath}:{line}: [{msg_id}({symbol}), {obj}] {msg}"',
project], exit=False,)
project_name = project.split("\\")[-1] # 获取执行扫描的模块或包名
score = round(results.linter.stats["global_note"],2) # 获取扫描结果分数并保留2位小数
with open(r'D:\...\pylint_scan.txt', 'a', encoding='utf-8') as fp:
fp.write(f'{project_name} : {score}\n') #结果记录在txt文本中
# print(i.split('\\')[-1], ' ', results.linter.stats['global_note'])
为了扫描的准确性,将所有含有py文件的目录下批量添加了__init__.py
"""
此处是为了将所有py文件所在目录增加__init__.py
已存在的不用添加。并将添加的位置打印出来。
"""
import os
global a
def search_file(path, text):
"""
遍历执行每个文件查找是否存在py文件,并将没有__init__.py的文件夹下增加此文件。
:param path: 查找的根目录
:param text: 以text结尾的文件
:return:
"""
try:
files = os.listdir(path)
for f in files:
f1 = os.path.join(path, f)
if os.path.isdir(f1):
# print(f1)
search_file(f1, text)
elif os.path.isfile(f1) and f1.endswith(text):
# os.path.splitext(f1)[1] == text and
# 找到py文件
parent_dir = f1.split(os.path.basename(f1))[0]
f2 = os.listdir(parent_dir)
if '__init__.py' in f2:
print("No need to add for file: " + f1)
continue
else:
with open(os.path.join(parent_dir, '__init__.py'), 'w', encoding='utf-8') as init_f:
init_f.write("")
print("add file" + str(os.path.join(parent_dir, '__init__.py')))
except Exception as ex:
print(u'文件查询失败' + str(ex))
search_file('.', '.py')