首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

开发安全、高质量代码的5款顶级Python工具

为提高代码的质量、安全性和可维护性,软件工程师每天会用到无数工具。

我会列出一些自己最喜欢的python工具,并从易用性(是否易于安装、运行和自动化)、质量影响(能否阻止可预见的bug)、可维护性影响(是否让工作更轻松)和安全性影响(能否发现并阻止安全性问题)对它们进行打分,以供读者参考。

并且,我还将介绍如何将这些工具全包含进CI pipeline,从而实现自动化和高效。

1.Pipenv

是为Python设计的开发管理和依赖管理的工具,最早由Requests的作者Kenneth Reitz编写。

如果你用python做过一段时间的开发,那么管理环境,你可能用过 virtualenvvenv;依赖管理可能用过较可靠的pip freeze > requirements.txt

大多数情况下,这完全没问题。但是,我发现pipenv更方便,且很强大,加上它通过PipfilePipfile.lock近乎去掉固定依赖的做法,很大程度上替代了requirements.txt,从而带来更可靠的部署。

不过,我对pipenv的未来有点担忧,因为Python基金会已搁置对pip的改进。而且,pipenv在2019年缺乏实质性进展。但是,我仍然认为,对大多数python用户来说,pipenv是绝佳的工具。

官网下载地址

月下载量: 2111976

备选方案:poetryvirtualenvvenv

2.Ochrona

这里,我有点私心,因为Ochrona是我积极开发并希望2020年发布的工具。不过,我还会介绍这个工具的替代方案。

Ochrona是一款依赖分析和软件组成分析的工具,它可以用来检查你的开源依赖是否存在已知漏洞。这个领域,另一款很流行的开源工具是pyup.io的Safety

我认为,Ochrona比Safety更好的地方在于:

  1. 无论是用于开源项目还是商业项目,它都提供免费方案,而且免费方案始终跟进最新的漏洞信息。
  2. 磁盘和IO使用非常少。不同于需要拉取整个漏洞数据库的本地工具,它是SaaS模式,只需调用一次公开的API。
  3. 它提供优秀的漏洞数据并且每天更新,并比其他工具提供更多的漏洞详细信息,包括免费用户。

官网下载地址

月下载量: 尚未发布

备选方案:safetysnyk (收费)

3.Bandit

如果必须推荐一个可提高python项目安全性的工具,那我推荐Bandit

据悉,Bandit出自OpenStack,但现在由PyCQA维护。它是一款开源的SAST(静态应用安全测试)工具,免费、可配置且快速。从某些方面来讲,它就像是关注安全领域的linter。

Bandit很适合用来发现问题,比如不安全的配置、已知的不安全模块使用情况等。

官网下载地址

月下载量: 575101

备选方案:pyrepytdodgy

4.Black

Black是一款独特的代码格式化工具。它能自动将你的代码更正为Black样式(一个Pep-8的超集)。

传统的linter通常需要你把代码改为合规代码,而Black可以节省不少时间。并且,Black只需有限的配置,这意味着你如果用过Black,其他任何项目你都会觉得眼熟。

官网下载地址

月下载量: 1891711

备选方案:flake8、pylint

5.Mypy

是python一个可选的静态类型检查器。PEP 484引入python的类型提示,Mypy则利用这些类型提示对项目进行静态类型检查。

Python依然有动态的duck类型,不过,添加静态类型检查能帮你减少测试和调试时间,更早发现错误。

目前,大公司也在跟进python的静态类型检查。在Guido van Rossum任职期间,Dropbox用Mypy检查了400多万行代码。其他的python用户,比如Instagram也开始做静态类型检查。

官网下载地址

月下载量: 2487228

备选方案:pyre

全部集成到一起

这个例子种,我会用到Travis-CI,配置其他CI工具的过程与之类似相似,只是语法上会有差异。这里,我用一个简单、不安全且有问题的flask应用作为例子。

app.py文件如下:

代码语言:javascript
复制
from flask import Flask 
	 
app = Flask(__name__) 
	
@app.route('/<name>') 
def hello_world(name: str) -> str: 
	return hello_name(name)
def hello_name(name: str) -> int:
	return f"hello, {name}"
	
if __name__ == '__main__': 
	app.run(debug=True)

Pipfile如下:

代码语言:javascript
复制
[[source]]
name = "pypi"
url = "https://pypi.org/simple"
verify_ssl = true

[dev-packages]
bandit = "*"
v = {editable = true,version = "*"}
black = "*"
mypy = "*"
ochrona = "*"

[packages]
flask = "==0.12.2"

[requires]
python_version = "3.7"

最后在根目录下创建一个.travis.yml文件,内容如下:

代码语言:javascript
复制
language: python
python:
  - 3.7
install:
  - pip install -U pip
  - pip install pipenv
  - pipenv install --dev
script:
  - bandit ./*
  - black --check .
  - ochrona
  - mypy .

如果查看这里的构建,你会发现每个工具都标出错误或指出需修改的地方。那么,我们来做一些修正,如这个PR所示,构建就可以通过。

将Flask升级到一个没有已知漏洞的版本

修复类型注释,禁用调试模式,规范格式

虽然这个例子只涉及一个CI平台,但其实和集成到其他大多数平台的方法都很相似。

下面是一个总的评分表:

英文原文:

Top Python Tools for Developing Secure, Quality Code

  • 发表于:
  • 本文为 InfoQ 中文站特供稿件
  • 首发地址https://www.infoq.cn/article/mzh1iqwfbppbBYkA4w4K
  • 如有侵权,请联系 cloudcommunity@tencent.com 删除。

扫码

添加站长 进交流群

领取专属 10元无门槛券

私享最新 技术干货

扫码加入开发者社群
领券