写点什么

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

  • 2020-03-12
  • 本文字数:1975 字

    阅读完需:约 6 分钟

开发安全、高质量代码的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文件如下:


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如下:


[[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文件,内容如下:


language: pythonpython:  - 3.7install:  - pip install -U pip  - pip install pipenv  - pipenv install --devscript:  - bandit ./*  - black --check .  - ochrona  - mypy .
复制代码


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



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



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


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


下面是一个总的评分表:



英文原文:


Top Python Tools for Developing Secure, Quality Code


2020-03-12 14:283144

评论

发布
暂无评论
发现更多内容

120Hz OLED拒绝“烧屏”!华硕无双全能轻薄本

科技热闻

测试开发【Mock 平台】08 开发:项目管理(四)编辑功能和Component抽离

MegaQi

8月月更

RocketMQ整体架构与基本概念

周杰伦本人

8月月更

企业即时通讯是什么?可以应用在哪些场景?

WorkPlus

云渲染的应用正在扩大,越来越多的行业需要可视化服务

Finovy Cloud

云渲染 GPU渲染

一次由groovy引起的fullGC问题排查

转转技术团队

开源一夏 | 自制了一个开发团队展示控制器来为成员引流【前端】

上进小菜猪

开源 8月月更

每日一R「03」Borrow 语义与引用

Samson

8月月更 ​Rust

机器学习模型验证:被低估的重要一环

澳鹏Appen

人工智能 机器学习 模型开发 模型开发训练 模型验证

MySQL高级指令

武师叔

8月月更

开源一夏 | mysql5.7 安装部署 -二进制安装

zhangpfly

MySQL 开源 MySQL 运维 #开源 8月月更

选择是公有云还或是私有云,这很重要吗?

WorkPlus

CEO对今天的CIO们真正的要求是什么?

WorkPlus

RocketMQ 消息集成:多类型业务消息——定时消息

阿里巴巴云原生

阿里云 RocketMQ 云原生 消息队列

【接入指南 之 直接接入】手把手教你快速上手接入HONOR Connect平台(下)

荣耀开发者服务平台

手机 新手指南 安卓 荣耀 honor

搭载2.8K 120Hz OLED华硕好屏 无畏Pro15 2022锐龙版屏开得胜

科技热闻

从企业的视角来看,数据中台到底意味着什么?

WorkPlus

【C#】WCF和TCP消息通信练习,实现群聊功能

南蓬幽

签约计划第三季 8月月更

What's new in dubbo-go-pixiu 0.5.1

apache/dubbo-go

dubbogo Dubbo3 Dubbo网关

兼具外观、性能、屏幕!华硕灵耀X 14火热抢购中

科技热闻

MSE 治理中心重磅升级-流量治理、数据库治理、同 AZ 优先

阿里巴巴云原生

数据库 阿里云 微服务 云原生 限流

shell运算详解,看这一篇就够了!

Albert Edison

Linux centos 运维 shell脚本编程 8月月更

开源一夏 | 提高代码可重用性,减少重复劳动--手把手带你实现Python自定义模块并上传到pypi,贡献自己创造的轮子为所有人使用,让Python开发更加简单

迷彩

Python 开源 签约计划第三季 8月月更 自定义模块

Java System.lineSeparator 方法

HoneyMoose

从Delta 2.0开始聊聊我们需要怎样的数据湖

网易数帆

大数据 数据湖 Arctic 湖仓一体

参天生长大模型:昇腾AI如何强壮模型开发与创新之根?

脑极体

接口测试进阶接口脚本使用—apipost(预/后执行脚本)

Xd

Java 接口测试

AIRIOT答疑第8期|AIRIOT的金字塔服务体系是如何搞定客户的?

AIRIOT

低代码 物联网 低代码,项目开发

什么是企业知识库?有什么作用?如何搭建?

金陵老街

vue cli 知识库 spring-boot

Apache DolphinScheduler 3.0.0 正式版发布!

Apache DolphinScheduler

海豚调度 DolphinScheduler 调度器 版本发布

超大模型工程化实践打磨,百度智能云发布云原生 AI 2.0 方案

Baidu AICLOUD

资源调度 异构计算 AI加速 GPU容器虚拟化 云原生AI

开发安全、高质量代码的5款顶级Python工具_安全_Andrew Scott_InfoQ精选文章