终于把所有的Python库,都整理出来啦!

来源:法纳斯特
大家好,我是东哥。
今天给大家总结整理了1000+常用Python库,主要分为以下几个部分👇

Python常用库A

Chardet字符编码探测器,可以自动检测文本、网页、xml的编码。
colorama主要用来给文本添加各种颜色,并且非常简单易用。
Prettytable主要用于在终端或浏览器端构建格式化的输出。
difflib,[Python]标准库,计算文本差异
Levenshtein,快速计算字符串相似度。
fuzzywuzzy,字符串模糊匹配。
esmre,正则表达式的加速器。
shortuuid,一组简洁URL/UUID函数库。
ftfy,Unicode文本工具7
unidecode,ascii和Unicode文本转换函数。
xpinyin,将汉字转换为拼音的函数库
pangu.py,调整对中日韩文字当中的字母、数字间距。
pyfiglet,Python写的figlet程序,使用字符组成ASCII艺术图片
uniout,提取字符串中可读写的字符
awesome slugify,一个Python slugify库,用于处理Unicode。
python-slugify,转换Unicode为ASCII内码的slugify函数库。
unicode-slugify,生成unicode内码,Django的依赖包。
ply,Python版的lex和yacc的解析工具
phonenumbers,解析电话号码,格式,存储和验证的国际电话号码。
python-user-agents,浏览器的用户代理(user-agents)的解析器。
sqlparse,SQL解析器。
pygments,一个通用的语法高亮工具。
python-nameparser,解析人名,分解为单独的成分。
pyparsing,通用解析器生成框架。
tablib,表格数据格式,包括,XLS、CSV,JSON,YAML。
python-docx,docx文档读取,查询和修改,微软Word 2007 / 2008的docx文件。
xlwt/xlrd,读写Excel格式的数据文件。
xlsxwriter,创建Excel格式的xlsx文件。
xlwings,利用Python调用Excel
csvkit,CSV文件工具包。
marmir,把Python[数据结构],转化为电子表格。
pdfminer,从PDF文件中提取信息。
pypdf2, 合并和转换PDF页面的函数库。
Python-Markdown,轻量级标记语言Markdown的Python实现。
Mistune,,快速、全功能的纯Python编写的Markdown解释器。
dateutil,标准的Python官方datetime模块的扩展包,字符串日期工具,其中parser是根据字符串解析成datetime,而rrule是则是根据定义的规则来生成datetime。
arrow,更好的日期和时间处理Python库
chronyk,一个Python 3版函数库,用于解析人写的时间和日期。
delorean,清理期时间的函数库。
when.py,为见的日期和时间,提供人性化的功能。
moment,类似Moment.js的日期/时间Python库
pytz,世界时区,使用tz database时区信息[数据库]
BeautifulSoup,基于Python的HTML/XML解析器,简单易用, 功能很强大,即使是有bug,有问题的html代码,也可以解析
lxml,快速,易用、灵活的HTML和XML处理库,功能超强,在遇到有缺陷、不规范的xml时,Python自带的xml处理器可能无法解析。报错时,程序会尝试再用lxml的修复模式解析。
htmlparser,官方版解析HTML DOM树,偶尔搞搞命令行自动表单提交用得上。
pyyaml,Python版本的YAML解释器。
html5lib,-标准库,解析和序列化HTML文档和片段。
pyquery,类似[jQuery]的的HTML解释器函数库。
cssutils,Python CSS库。
MarkupSafe,XML或HTML / XHTML安全字符串标记工具。
cssutils – ACSS library for Python., MarkupSafe – Implements a XML/HTML/XHTML
bleach,漂白,基于HTML的白名单函数库。
xmltodict,类似JSON的XML工具包。
xhtml2pdf,HTML / CSS格式转换器,看生成pdf文档。
untangle,把XML文档,转换为Python对象,方便访问。

文件处理

Mimetypes,Python标准库,映射文件名到MIME类型。
imghdr,Python标准库,确定图像类型。python-magic,libmagic文件类型识别库,Python接口格式。path.py,os.path模块的二次封装。
watchdog,一组API和shell实用程序,用于监视文件系统事件。
Unipath,面向对象的文件/目录的操作工具包。pathlib,-(Python 3.4版已经作为Python标准库),一个跨平台,面向path的函数库。
pickle/cPickle,python的pickle模块实现了基本的数据序列和反序列化。通过pickle模块的序列化操作我们能够将程序中运行的对象信息保存到文件中去,永久存储;通过pickle模块的反序列化操作,我们能够从文件中创建上一次程序保存的对象。
cPickle是[C语言]实现的版本,速度更快。
ConfigParser,Python标准库,INI文件解析器。
configobj,INI文件解析器。config,分层次配置,logging作者编写。
profig,多格式配置转换工具。
logging,Python标准库,日志文件生成管理函数库。
logbook,logging的替换品。
Sentry,实时log服务器。Raven,哨兵Sentry的Python客户端。
Sphinx,斯芬克斯(狮身人面像),Python文档生成器。
reStructuredText,标记语法和解析工具,Docutils组件。mkdocs,Markdown格式文档生成器。
pycco,简单快速、编程风格的文档生成器。
pdoc,自动生成的Python库API文档epydoc,从源码注释中生成各种格式文档的工具

图像处理

PIL(Python Image Library),基于Python的图像处理库,功能强大,对图形文件的格式支持广泛,内置许多图像处理函数,如图像增强、滤波[算法]等Pillow,图像处理库,PIL图像库的分支和升级替代产品。Matplotlib,著名的绘图库,提供了整套和matlab相似的命令API,用以绘制一些高质量的数学二维图形,十分适合交互式地进行制图。brewer2mpl,有一个专业的python配色工具包,提供了从美术角度来讲的精美配色。
PyGame基于Python的多媒体开发和游戏软件开发模块,包含大量游戏和图像处理功能Box2d,开源的2d物理引擎,愤怒的小鸟就是使用了这款物理引擎进行开发的,Box2d物理引擎内部模拟了一个世界,你可以设置这个世界里的重力,然后往这个世界里添加各种物体,以及他们的一些物理特性,比如质量,摩擦,阻尼等等。
Pymunk,类似box2d的开源物理图形模拟库OpenCV, 目前最好的开源图像/视觉库,包括图像处理和计算机视觉方面、[机器学习]的很多通用算法。SimpleCV,计算机视觉开源框架,类似opencv。VTK,视觉化工具函式库(VTK, Visualization Toolkit)是一个开放源码,跨平台、支援平行处理(VTK曾用于处理大小近乎1个Petabyte的资料,其平台为美国Los Alamos国家实验室所有的具1024个处理器之大型系统)的图形应用函式库。
2005年时曾被美国陆军研究实验室用于即时模拟俄罗斯制反导弹战车ZSU23-4受到平面波攻击的情形,其计算节点高达2.5兆个之多。cgkit,Python Computer Graphics Kit,其module 主要分两个部分,
1、与3d相关的一些python module 例如the vector, matrix and quaternion types, the RenderMan bindings, noise functions 这些模块可以在maya houdini nuke blender 等有Python扩展的程序中直接用;
2、提供完整的场景操作的module, 他类似其他三维软件,在内存中保留完整的描述场景的信息。
不能直接用于maya 等CGAL,
Computational Geometry Algorithms Library,计算几何算法库,提供计算几何相关的数据结构和算法,诸如三角剖分(2D约束三角剖分及二维和三维Delaunay三角剖分),
Voronoi图(二维和三维的点,2D加权Voronoi图,分割Voronoi图等),
多边形(布尔操作,偏置),多面体(布尔运算),曲线整理及其应用,
网格生成(二维Delaunay网格生成和三维表面和体积网格生成等),几何处理(表面网格简化,细分和参数化等),
凸壳算法(2D,3D和dD),搜索结构(近邻搜索,kd树等),插值,形状分析,拟合,距离等。
Aggdraw,开源图像库,几乎涵盖了2d image操作的所有功能,使用起来非常灵活Pycairo,开源矢量绘图库Cairo开罗的python接口,
cairo提供在多个背景下做2-D的绘图,高级的更可以使用硬件加速功能。wand,Python绑定魔杖工具(MagickWand),C语言API接口。
thumbor, -智能成像工具,可调整大小和翻转图像。
imgSeek,查询相似的图像。
python-qrcode,纯Python的二维码(QR码)生成器。
pyBarcode,创建条码,无需PIL模块。
pygram,Instagram像图像过滤器。
Quads,基于四叉树的计算机艺术。
nude.py,裸体检测函数。
scikit-image,scikit工具箱的图像处理库。
hmap,图像直方图工具。
bokeh,交互的Web绘图。
plotly,Web协同的Python和Matplotlib绘制。
vincent,文森特,Python Vega的函数库。
d3py,Python绘图库,基于D3.JS, ggplot -API兼容R语言的ggplot2.Kartograph.py,在Python绘制漂亮的SVG地图。pygal, SVG图表的创造者。
pygraphviz,Graphviz的Python接口。
Fonttlools,ttf字体工具函数包,用于fontforge、ttx等字体软件。

游戏和多媒体

audiolazy,数字信号处理(DSP)的Python工具包。
audioread,跨平台(GStreamer + Core Audio + MAD + FFmpeg)音频解码库。
beets,音乐库管理。
dejavu,音频指纹识别算法。
Dejavu 听一次音频后就会记录该音频的指纹信息,然后可通过麦克风对输入的音频进行识别是否同一首歌。django-elastic-transcoder,Django +亚马逊elastic转码。eyeD3,音频文件工具,特别是MP3文件包含的ID3元数据。
id3reader,用于读取MP3的元数据。
mutagen,处理音频元数据。
pydub,-操纵音频和简单的高层次的接口。
pyechonest,Echo Nest API客户端。talkbox,语音和信号处理的Python库。
TimeSide,开放的网络音频处理框架。
tinytag,读取音乐文件元数据,包括的MP3,OGG,FLAC和wave文件。
m3u8,用于解析m3u8文件。
moviepy,多格式视频编辑脚本模块,包括GIF动画。
shorten.tv,视频摘要。
scikit视频,SciPy视频处理例程。
GeoDjango,一个世界级的地理Web框架。
geopy,Geo地理编码的工具箱。
pygeoip,纯Python写的GeoIP API。
GeoIP,Python API接口,使用高精度GeoIP Legacy Database数据库。
geojson,GeoJSON函数库django-countries,一个Django程序,提供国家选择,国旗图标的静态文件,和一个国家的地域模型。
Pygame,Python游戏设计模块。
Cocos2d,2D游戏框架,演示,和其他的图形/交互应用,基于pyglet。Cocos2d- cocos2d is a framework for building 2D games, demos, and other graphical/interactive applications. It is based on pyglet.,PySDL2,SDL2的封装库。
Panda3D- 3D游戏引擎,迪士尼开发。用C++写的,完全兼容Python。PyOgre,OGRE 3D渲染引擎,可用于游戏,模拟,任何3D。
PyOpenGL,绑定OpenGL和它相关的API。
PySFML,Python绑定SFMLRenPy,视觉小说引擎。

大数据与科学计算

pycuda/opencl,GPU高性能并发计算Pandas,python实现的类似R语言的数据统计、分析平台。基于NumPy和Matplotlib开发的,主要用于数据分析和数据可视化,它的数据结构DataFrame和R语言里的data.frame很像,特别是对于时间序列数据有自己的一套分析机制,非常不错。
Open Mining,商业智能(BI),Pandas的Web界面。blaze,NumPy和Pandas大数据界面。
SciPy,开源的Python算法库和数学工具包,SciPy包含的模块有最优化、线性代数、积分、插值、特殊函数、快速傅里叶变换、信号处理和图像处理、常微分方程求解和其他科学与工程中常用的计算。
其功能与软件MATLAB、Scilab和GNU Octave类似。
Numpy和Scipy常常结合着使用,Python大多数机器学习库都依赖于这两个模块。
ScientificPython,一组经过挑选的Python程序模块,用于科学计算,包括几何学(矢量、张量、变换、矢量和张量场),四元数,自动求导数,(线性)插值,多项式,基础统计学,非线性最小二乘拟合,单位计算,Fortran兼容的文本格式,通过VRML的3D显示,以及两个Tk小工具,分别用于绘制线图和3D网格模型。
此外还具有到netCDF,MPI和BSPlib库的接口。
NumPy科学计算库,提供了矩阵,线性代数,傅立叶变换等等的解决方案, 最常用的是它的N维数组对象. NumPy提供了两种基本的对象:
ndarray(N-dimensional array object)和 ufunc(universal function object)。
ndarray是存储单一数据类型的多维数组,而ufunc则是能够对数组进行处理的函数。
Cvxopt,最优化计算包,可进行线性规划、二次规划、半正定规划等的计算。
Numba,科学计算速度优化编译器。pymvpa2,是为大数据集提供统计学习分析的Python工具包,它提供了一个灵活可扩展的框架。
它提供的功能有分类、回归、特征选择、数据导入导出、可视化等NetworkX,复杂网络的优化软件包。zipline,交易算法的函数库。
PyDy, Python动态建模函数库。
SymPy,符号数学的Python库。statsmodels,Python的统计建模和计量经济学。
astropy,天文学界的Python库。
orange,橙色,数据挖掘,数据可视化,通过可视化编程或Python脚本学习机分析。
RDKit,化学信息学和机器学习的软件。
Open Babel,巴贝尔,开放的化学工具箱。
cclib,化学软件包的计算函数库。
Biopython,免费的生物计算工具包。
bccb,生物分析相关的代码集。bcbio-nextgen,提供完全自动化、高通量、测序分析的工具包。
visvis, 可视化计算模块库,可进行一维到四维数据的可视化。
MapReduce是Google提出的一个软件[架构],用于大规模数据集(大于1TB)的并行运算。
概念“Map(映射)”和“Reduce(归纳)”,及他们的主要思想,都是从函数式编程语言借来的MapReduce函数库。Framworks and libraries for MapReduce.,PySpark,[Spark]的Python API。dpark,Spark的Python克隆,Python中的MapReduce框架。luigi,为批量工作,建立复杂的管道。mrjob,运行在[Hadoop],或亚马逊网络服务的,MapReduce工作。

人工智能与机器学习

NLTK(natural language toolkit),是python的自然语言处理工具包。2001年推出,包括了大量的词料库,以及自然语言处理方面的算法实现:
分词, 词根计算, 分类, 语义分析等。
Pattern,数据挖掘模块,包括自然语言处理,机器学习工具,等等。
textblob,提供API为自然语言处理、分解NLP任务。基于NLTK和Pattern模块。
jieba,结巴,中文分词工具。snownlp,用于处理中文文本库。
loso,中文分词函数库。
genius,中文CRF基础库,条件随机场(conditional random field,简称 CRF),是一种鉴别式机率模型,是随机场的一种,常用于标注或分析序列资料,如自然语言文字或是生物序列Gensim,一个相当专业的主题模型Python工具包,无论是代码还是文档,可用于如何计算两个文档的相似度LIBSVM,是台湾大学林智仁(Lin Chih-Jen)教授等开发设计的一个简单、易于使用和快速有效的SVM模式识别与回归的软件包,他不但提供了编译好的可在Windows系列系统的执行文件,还提供了源代码,方便改进、修改以及在其它[操作系统]上应用;
该软件对SVM所涉及的参数调节相对比较少,提供了很多的默认参数,利用这些默认参数可以解决很多问题;
并提供了交互检验(Cross Validation)的功能。
该软件可以解决C-SVM、ν-SVM、ε-SVR和ν-SVR等问题,包括基于一对一算法的多类模式识别问题。
scikits.learn,构建在SciPy之上用于机器学习的 Python 模块。它包括简单而高效的工具,可用于数据挖掘和数据分析。
涵盖分类,回归和聚类算法,例如SVM, 逻辑回归,朴素贝叶斯,随机森林,k-means等算法,代码和文档都非常不错,在许多Python项目中都有应用。
例如在我们熟悉的NLTK中,分类器方面就有专门针对scikit-learn的接口,可以调用scikit-learn的分类算法以及训练数据来训练分类器模型。PyMC,机器学习采样工具包,scikit-learn似乎是所有人的宠儿,有人认为,PyMC更有魅力。
PyMC主要用来做Bayesian分析。Orange,基于组件的数据挖掘和机器学习软件套装,它的功能即友好,又很强大,快速而又多功能的可视化编程前端,以便浏览数据分析和可视化,包含了完整的一系列的组件以进行数据预处理,并提供了数据帐目,过渡,建模,模式评估和勘探的功能。
侧重数据挖掘,可以用可视化语言或Python进行操作,拥有机器学习组件,还具有生物信息学以及文本挖掘的插件。
Milk,机器学习工具箱,其重点是提供监督分类法与几种有效的分类分析:SVMs(基于libsvm),K-NN,随机森林经济和决策树。
它还可以进行特征选择。这些分类可以在许多方面相结合,形成不同的分类系统。对于无监督学习,它提供K-means和affinity propagation聚类算法。
PyMVPA(Multivariate Pattern Analysis in Python),是为大数据集提供统计学习分析的Python工具包,它提供了一个灵活可扩展的框架。它提供的功能有分类、回归、特征选择、数据导入导出、可视化等NuPIC,开源人工智能平台。
该项目由Grok(原名 Numenta)公司开发,其中包括了公司的算法和软件架构。
NuPIC 的运作接近于人脑,“当模式变化的时候,它会忘掉旧模式,记忆新模式”。如人脑一样,CLA 算法能够适应新的变化。Pylearn2,-基于Theano的机器学习库。
hebel,GPU加速,[深度学习]Python库。
gensim,机器学习库。pybrain,机器学习模块,它的目标是为机器学习任务提供灵活、易应、强大的机器学习算法。
pybrain包括神经网络、强化学习(及二者结合)、无监督学习、进化算法。以神经网络为核心,所有的训练方法都以神经网络为一个实例Mahout,是 Apache Software Foundation(ASF) 旗下的一个开源项目,提供一些可扩展的机器学习领域经典算法的实现,旨在帮助开发人员更加方便快捷地创建智能应用程序。
Mahout包含许多实现,包括聚类、分类、推荐过滤、频繁子项挖掘。此外,通过使用 Apache Hadoop 库,Mahout 可以有效地扩展到云中。
Crab,灵活的,快速的推荐引擎。python-recsys,娱乐系统分析,推荐系统。vowpal_porpoise,Vowpal Wabbit轻量级Python封装。
Theano,用来定义、优化和模拟数学表达式计算,用于高效的解决多维数组的计算问题的python软件包。它使得写深度学习模型更加容易,同时也给出了一些关于在GPU上训练它们的选项。

系统与命令行

threading,Python标准线程库,更高级别的线程接口。
envoy,特使,Python子线程的函数库。
sh,成熟的子线程替换函数库。sarge,封装线程。subprocess,调用shell命令的神器argparse,写命令行脚本必备,强大的命令行差数解析工具timeit,计算代码运行的时间等等unp,命令行工具,解压文件。
eventlet开销很少的多线程模块,使用的是 green threads 概念,例如,pool = eventlet.GreenPool(10000) 这样一条语句便创建了一个可以处理 10000 个客户端连接的线程池。
类似Gevent线程库Gevent,多线程模块pytools,著名的python通用函数、工具包SendKeys, 键盘鼠标操作模块, 模拟键盘鼠标模拟操作。
pyHook,基于Python的“钩子”库,主要用于监听当前电脑上鼠标和键盘的事件。
这个库依赖于另一个Python库PyWin32,如同名字所显示的,PyWin32只能运行在Windows平台,所以PyHook也只能运行在Windows平台。
pstuil,跨平台地很方便获取和控制系统的进程,以及读取系统的CPU占用内存占用等信息.cement,一个轻量级的、功能齐全的命令行工具click,简单优雅的的命令行接口。
clint,Python命令行工具。cliff,创造多层次指令的命令行程序框架。
Clime, 可以转换任何模块为多的CLI命令程序,无任何配置。
docopt,Python命令行参数分析器。
pycli,命令行应用程序,支持的标准命令行解析,测井,单元[测试]和功能测试。
Gooey,打开命令行程序,作为为一个完整的GUI应用程序,cookiecutter,命令行工具,从cookiecutters(项目模板)创建项目。
例如,Python包项目,jQuery插件项目。
percol,为UNIX传统管道pipe命令,添加交互式选择风格。
rainbowstream,聪明和漂亮的推特客户终端。Django Models,Django的一部分SQLAlchemy,Python SQL工具包和对象关系映射。
peewee,小型的ORM解析器。
PonyORM,为ORM提供了一种面向SQL的接口。MongoEngine,Python对象文件映射,使用[MongoDB]。
, Django MongoDB引擎MongoDB , Django后台。
django-mongodb-engine,Django后台.redisco,一个简单的模型和容器库,使用[Redis]flywheel,Amazon DynamoDB对象映射。
butterdb,谷歌电子表格的ORM,Python版。celery,芹菜,异步任务队列/工作,基于分布式消息队列。
huey,休伊,轻量级,多线程任务队列。
mrq,队列先生,分布式任务队列,使用redis & Gevent。rq,简单的工作队列。
Queue,Queue模块可以用来实现多线程间通讯,让各个线程共享数据,生产者把货物放到Queue中,供消费者(线程)去使用。
simpleq,简单的,可扩展的队列,Amazon SQS基础队列。
Psyco,超强的python性能优化工具,psyco 的神奇在于它只需要在代码的入口处调用短短两行代码,性能就能提升 40% 或更多,真可谓是立竿见影!如果你的客户觉得你的程序有点慢,敬请不要急着去优化代码,psyco 或许能让他立即改变看法。
psyco 堪称 Python 的 jit。fn.py,Python函数编程:缺失的功能享受FP的实现。funcy,函数编程工具。
Toolz,函数编程工具:迭代器、函数,字典。CyToolz,Toolz的Cython实现,高性能的函数编程工具。Ansible,安塞波,极为简单的自动化平台。
SaltStack,基础设施的自动化管理系统。
Fabric,织物,一个简单,远程执行和部署的语言工具。
Fabtools,Fabric的工具函数。
cuisine,热门的Fabric的工具函数。
psutil,跨平台的过程和系统工具模块。
pexpect,控制互动节目。
provy,易于使用的配置系统的Python。honcho,Foreman的Python接口,用于管理procfile应用工具。
gunnery,多任务执行工具,与网络接口的分布式系统。
fig,快速。独立的开发环境中使用泊坞窗。
APScheduler,轻量级、但功能强大的在线任务调度程序。
django-schedule,Django日程应用程序。doit,任务流道/生成工具。
Joblib,Python提供的轻量级的流水线工具函数。
Plan,简易生成crontab文件。
Spiff,纯Python实现的,功能强大的工作流引擎。
schedule,Python作业调度。TaskFlow,有助于使任务执行简单。
ctypes,Python标准库,速度更快,Python调用C代码的外部函数接口。cffi,Python调用C代码外部函数接口,类似于ctypes直接在python程序中调用c程序,但是比ctypes更方便不要求编译成so再调用。
Cytoolz,python 加速库SWIG,简化封装和接口生成器。
,Cython,Python优化静态编译器。
PyPy,Python解释器的 Python实现。
Stackless Python,一个增强版本的Python。它使程序员从基于线程的编程方式中获得好处,并避免传统线程所带来的性能与复杂度问题。
Stackless为 Python带来的微线程扩展,是一种低开销、轻量级的便利工具Pyston,使用LLVM和现代JIT技术,对python进行性能优化。
pythonlibs,非官方的Windows(32 / 64位)的Python扩展包scapy,优秀的数据包处理库。
ino,Arduino命令行工具。Pyro,Python的机器人工具包。
pluginbase,一个简单而灵活的Python的插件系统。
itsdangerous,数据安全传输工具。blinker,快速Python中的信号/事件调度系统。
pychievements,用于创建和跟踪成果框架。
python-patterns,Python中的设计模式。
pefileWindows PE文件解析器SIP,自动为C和C++库生成Python扩展模块的工具

数据库

MySQLdb,成熟的[MySQL]数据库模块,Baresql,SQL数据库包ZODB,Python本地对象数据库。一个K-V对象图数据库。
pickledb,简单和轻量级的K-V键值存储。
TinyDB, 轻量级,面向文档的数据库。
mysql-python,MySQL的Python工具库。
mysqlclient,mysql-python分支,支持Python 3.,PyMySQL,纯Python写的 MySQL驱动程序,兼容mysql-python。mysql-connector-python,MySQL连接器,来自[Oracle],纯Python编写。
oursql,MySQL连接器,提供本地话指令语句和BLOBs支持。
psycopg2,最流行的Python PostgreSQL适配器。txpostgres,于Twisted的异步驱动,用于PostgreSQL。
queries,psycopg2函数库,用于PostgreSQL。
dataset,存储Python字典数据,用于SQLite,MySQL和PostgreSQL。
cassandra-python-driver,开源分布式NoSQL数据库系统Apache Cassandra系统的Python驱动.pycassa,简化的cassandra数据库Python驱动。
HappyBase,友好的Apache [Hbase]的函数库。
PyMongo,MongoDB官方客户端。
Plyvel,LevelDB快速和功能丰富的Python接口。redis-py,redis客户端。
py2neo,Python客户端(基于Neo4j的RESTful接口).telephus,基于Twisted的cassandra客户端。
txRedis,基于Twisted的Redis客户端。

网络

Curl,Pycurl包是一个libcurl的Python接口,它是由C语言编写的。
与urllib相比,它的速度要快很多。
Libcurl是一个支持FTP, FTPS, HTTP, HTTPS, GOPHER, TELNET, DICT, FILE 和 LDAP的客户端URL传输库.libcurl也支持HTTPS认证,HTTP POST,HTTP PUT,FTP上传,代理,Cookies,基本身份验证,FTP文件断点继传,HTTP代理通道等等。
Requests,用Python语言编写,基于 urllib的开源 HTTP 库。
它比 urllib 更加方便,更加 Pythoner。
支持 Python3。httpie,命令行HTTP客户端,用户友好的cURL的替换工具。
s3cmd,命令行工具,用于管理Amazon S3和CloudFront。
youtube-dl,命令行程序,从YouTube下载视频。
you-get,Python3写的视频下载工具,可用于YouTube/Youku优酷/Niconico视频下载Coursera,从coursera.org下载视频,可重新命名文件wikiteam,wiki下载工具。
subliminal,命令行工具,搜索和下载字幕的函数库requests,HTTP函数库,更加人性化。grequests,异步HTTP请求+ Gevent(高性能高并发函数库)。
urllib3,一个线程安全的HTTP连接池,支持文件post。
httplib2,综合HTTP的客户端函数库。treq, Python API接口,Twisted的HTTP客户。
Mininet,流行的网络仿真器,API采用python编写。
POX,基于Python的开源软件定义网络(SDN)控制开发平台的应用,如OpenFlow的SDN控制器。
Pyretic,SDN的编程语言,提供了强大的抽象在网络交换机或仿真器。SDX Platform,基于SDN的IXP实现,利用最小网络,痘和热。inbox.py,Python的SMTP服务器。imbox, Python版本IMAP库。inbox,收件箱,开源邮件工具包。
lamson,SMTP服务器。flanker,侧卫,电子邮件地址和MIME解析库。
marrow.mailer,高性能可扩展邮件交付框架。
django-celery-ses, Django电子邮件后台,使用AWS SES和Celery。
modoboa,邮件托管和管理平台,包括现代和简化Web UI。
envelopes,邮件工具。
mailjet,批量邮寄mailjet API接口,带统计。Talon,利爪,Mailgun库,提取消息和签名。
mailjet- Mailjet API implementation for batch mailing, statistics and more., Talon – Mailgun library to extract message quotations and signatures.,pyzmail,编写,发送和解析电子邮件。
furl,燃料,小型的的URL解析库库。purl,简单的,干净的API,操纵URL。
pyshorteners,纯Python库,URL短网址编辑。
short_url,短网址生成。
Scrapy,快速屏幕截取和网页抓取的框架。
portia,波西亚,Scrapy的可视化扩展。
feedparser,信息源解释器RoboBrowser,简单的网页浏览Python函数库,没有使用Web浏览器。
MechanicalSoup,网站自动化互动测试工具包。
mechanize,网页浏览编程工具。
Demiurge,造物主,-PyQuery的轻量级工具。
newspaper,提取报纸新闻。html2text,转换HTML为 Markdown格式的文本。
python-goose,HTML内容提取器。
lassie,莱西,人性化的网站内容检索。
micawber,通过UR抓提网页的函数库。
sumy,概要,文本和HTML网页的自动文摘模块。
Haul,距离,可扩展的图像爬虫。
python-readability,可读性工具Arc90,快速的Python接口。
opengraph,OpenGraphProtocol协议解析模块,textract,从任何文件,Word,PowerPoint,PDF文件中提取文本,等。
sanitize,消毒,使混乱的数据变的理智。
AutobahnPython, WebSocket和WAMP的函数库,使用 Twisted和PythonWebSocket-for-Python,websocket客户端和服务器端函数库。SimpleXMLRPCServer,python标准库,简单的XML-RPC服务器,单线程。
SimpleJSONRPCServer,JSON-RPC规范实施函数库。
zeroRPC,基于ZeroMQ和MessagePack的RPC实现。
apache-libcloud,所有云服务的Python接口库。
wifi,WiFi -一套个Python库和命令行工具与WiFi,用于[Linux]。
streamparse,运行Python代码和数据的实时流。
集成了Apache Storm。
boto,亚马逊网络服务接口。
twython,Twitter推特API。google-api-python-client,谷歌客户端API。
gspread,谷歌电子表格的Python API。
facebook-sdk,facebook平台Python SDK。
facepy,简易的facebook图形APIgmail,Gmail的Python接口。
django-wordpress,Django的WordPress的模型和视图。

Web框架

Django,最流行的Python-Web框架,鼓励快速开发,并遵循MVC设计,开发周期短
ActiveGrid企业级的Web2.0解决方案
Karrigell简单的Web框架,自身包含了Web服务,py脚本引擎和纯python的数据库PyDBLitewebpy一个小巧灵活的Web框架,虽然简单但是功能强大CherryPy基于Python的Web应用程序开发框架Pylons基于Python的一个极其高效和可靠的Web开发框架Zope开源的Web应用服务器TurboGears基于Python的MVC风格的Web应用程序框架Twisted流行的网络编程库,大型Web框架QuixoteWeb开发框架Flask,轻量级web框架Bottle,快速,简单和轻量级的WSGI模式Web框架。
Pyramid,轻量级,快速,稳定的开源Web框架。
web2py,简单易用的全堆栈Web框架和平台。
web.py,强大、简单的Web框架。TurboGears,便于扩展的Web框架。
CherryPy,极简Python Web框架,支持,HTTP 1.1和WSGI线程池。
Grok,基于Zope3的Web框架。
Bluebream,开源的Web应用服务器,原名Zope 3。
guava,轻量级,高性能的Python-Web框架,采用c语言编写。
django-cms,基于Django企业级开源CMS。
djedi-cms轻量级但功能强大的Django CMS的插件,内联编辑和性能优化。
FeinCMS,基于Django的先进内容管理系统。
Kotte,高层次的Python的Web应用框架,基于Pyramid。Mezzanine,强大,一致,灵活的内容管理平台。
Opps,基于Django的CMS,用于高流量的报纸、杂志和门户网站。
Plone,基于Zope的开源应用服务器Zope。
Quokka,灵活,可扩展的,轻量级的CMS系统,使用Flask和MongoDB。
Wagtail,Django内容管理系统。
Widgy,CMS框架,基于Django。
django-oscar,Django奥斯卡,开源的电子商务框架。
django-shop,基于Django的网店系统。
merchant,支持多种付款处理工具。
money,可扩展的货币兑换解决方案。
python-currencies,货币显示格式。
cornice,Pyramid的REST框架。
django-rest-framework,Django框架,强大灵活的工具,可以很容易地构建Web API。
django-tastypie,创造精美的Django应用程序API接口。
django-formapi,创建JSON API、HMAC认证和Django表单验证。flask-api,提供统一的浏览器体验,基于Django框架。
flask-restful,快速构建REST API支持扩展。
flask-api-utils,flask的扩展。falcon,猎鹰,高性能的Python框架,构建云API和Web应用程序后端。
eve,夏娃,REST API框架,使用Flask,MongoDB和良好意愿。
sandman,睡魔,为现有的数据库驱动的系统,自动生成REST API。restless,类似TastyPie的框架。
savory-pie,REST API构建函数库(Django,及其他)Jinja2,现代设计师友好的语言模板。
Genshi,网络感知输出模板工具包。
Mako,马可,Python平台的超高速、轻型模板。
Chameleon,变色龙,一个HTML / XML模板引擎。
仿照ZPT,优化速度。
Spitfire,快速的Python编译模板。
django-haystack,大海捞针,Django模块搜索。
elasticsearch-py,Elasticsearch官方低级的Python客户端。
solrpy,solr客户端。
Whoosh,呼,快速,纯Python搜索引擎库。
Feedly,建立新闻和通知系统的函数库,使用Cassandra和Redis。
django-activity-stream,Django活动流,从你网站上的行动,产生通用的活动流。
Beaker,烧杯,一个缓存和会话使用的Web应用程序,独立的Python脚本和应用程序库。
dogpile.cache,是Beaker作者的下一代替代作品。HermesCache,Python的缓存库,基于标签的失效及预防Dogpile效果。
django-cache-machine,Django缓存机,自动缓存失效,使用ORM。django-cacheops,自动颗粒事件驱动,ORM缓存失效。johnny-cache,约翰尼高速缓存框架,Django应用程序。
django-viewlet,渲染模板部件扩展缓存控制。pylibmc,在libmemcached接口。
WTForms-JSON,JSON表单数据处理扩展。Deform, HTML表单生成的函数库。
django-bootstrap3,bootstrap3,集成了Django。django-crispy-forms,Django程序,可以创建优雅的表单。django-remote-forms,Django的远程表单,Django表格的序列化程序。
django-simple-spam-blocker,Django简单的垃圾邮件拦截器。
django-simple-captcha,Django简单验证码,简单的和高度可定制的Django应用程序,用于添加验证码图像Ajenti,服务器管理面板。
Grappelli,界面花哨的django皮肤。django-suit,Django替代o界面(仅用于非商业用途)。
django-xadmin,Django管理面板替代工具。
flask-admin,简单的flask管理界面框架flower,实时监控和Web管理面板。
Pelican,鹈鹕,Markdown或ReST,字王内容主题。支持 DVCS, Disqus. AGPL。
Cactus,仙人掌,设计师的网站静态生成器。
Hyde,海德, 基于Jinja2的静态网站生成器。
Nikola,尼古拉-一个静态网站和博客生成器。
Tags,标签,最简单的静态网站生成器。
Tinkerer,工匠,基于Sphinx的静态网站生成器。
asyncio,(在Python 3.4 +是Python标准库),异步I/O,事件循环,协同任务。
gevent,基于Python的网络库。
Twisted,扭曲,事件驱动的网络引擎。
Tornado,龙卷风,Web框架和异步网络的函数库。
pulsar,脉冲星,事件驱动的并行框架的Python。
diesel,柴油,绿色的,基于事件的I/O框架。
eventlet,WSGI支持异步框架。
pyzmq, 0MQ消息库的Python封装。
txZMQ,基于Twisted的0MQ消息库封Crossbar,开源统一应用路由器(WebSocket和WAMP)。
wsgiref,Python标准库,WSGI封装实现,单线程。
Werkzeug,机床,WSGI工具函数库,很容易地嵌入到你自己的项目框架。
paste,粘贴,多线程,稳定的,久经考验的WSGI工具。
rocket,火箭,多线程服务,基于Pyramid。
netius,快速的、异步WSGI服务器,gunicorn,forked前身,部分用C写的。
fapws3,异步网络,用C写的。meinheld,异步WSGI服务器,是用C写的。
bjoern,-快速的、异步WSGI服务器,用C写的。

安全

Permissions函数库,允许或拒绝用户访问数据或函数。
django-guardian,Django守护者,管理每个对象的权限,用于Django 1.2 +Carteblanche,管理导航和权限。
Authomatic,简单强大的认证/授权客户端。
OAuthLib, 通用,规范,OAuth请求签约工具。
rauth,用于OAuth 1.0,2.0,的Python库。
python-oauth2,利用全面测试,抽象接口来创建OAuth的客户端和服务器。
python-social-auth,易于安装的社会认证机制。
,django-oauth-toolkit,Django OAuth工具包django-oauth2-provider,Django OAuth2工具包。
django-allauth,Django认证的应用程序。
Flask-OAuthlib,Flask的OAuth工具包sanction,制裁,简单的oauth2客户端。
jose,[JavaScript]对象签名和加密(JOSE)草案实施,标记状态。
python-jwt,JSON的Web令牌生成和验证模块。
pyjwt,JSON的Web令牌草案01。
python-jws,JSON的Web令牌草案02。
PyCrypto,Python的加密工具包。
Paramiko,sshv2协议的实现,提供了客户端和服务器端的功能。
cryptography,密码开发工具包。
PyNac,网络和密码(NaCl)函数库。hashids,hashids的 Python函数库。
Passlib,安全的密码存储/哈希库,非常高的水平。
hashlib,md5, sha等hash算法,用来替换md5和sha模块,并使他们的API一致。
它由OpenSSL支持,支持如下算法:md5,sha1, sha224, sha256, sha384, sha512.
GUI
PyGtk,基于Python的GUI程序开发GTK+库
PyQt用于Python的QT开发库
WxPythonPython下的GUI编程框架,其消息机制与MFC的架构相似,入门非常简单,需要快速开发相关的应用可以使用这个
TkinterPython下标准的界面编程包,因此不算是第三方库了
PySide,跨平台Qt的应用程序和用户界面框架,支撑Qt v4框架。
wxPython,混合wxWidgets的C++类库。
kivy,创建应用程序GUI函数库,看运行于Windows,Linux,MAC OS X,[Android]和[iOS]。
curse,用于创建终端GUI应用程序。
urwid,创建终端GUI应用程序窗体的函数库,支持事件,色彩丰富。
pyglet,跨平台的窗口和多媒体库的Python。
Tkinter,是Python事实上的标准GUI软件包。
enaml,创建漂亮的用户界面,语法类似QML。
Toga,托加,OS原生GUI工具包。

构建封装

pyenv,简单的Python版本管理。
virtualenv,创建独立的Python环境,用于同时安装不同版本的python环境。
virtualenvwrapper,是virtualenv的一组扩展。
pew,一套管理多个虚拟环境的工具。
vex,使运行指定的virtualenv命令。
PyRun,一个单文件,无需安装的Python版本管理工具。
PIP,Python包和依赖的管理工具。
easy_install,软件包管理系统,提供一个标准的分配Python软件和 函式库的格式。是一个附带设置工具的模块,和一个第三方函式库。旨在加快Python函式库的分配程式的速度。类似Ruby语言的RubyGems 。
conda,跨平台,二进制软件包管理器。,
Curdling,一个管理Python包的命令行工具。
wheel,Python发行的新标准,旨在替代eggs.
cx-Freeze,跨平台的,用于打包成可执行文件的库
py2exe, Windows平台的Freeze脚本工具,Py2exe ,将python脚本转换为windows上可以独立运行的可执行程序
py2app,MAC OS X平台的Freeze脚本工具
pyinstaller,-转换成独立的可执行文件的Python程序(跨平台)。
pynsist,构建Windows安装程序的工具,用Python编写。
dh-virtualenv,建立和分发virtualenv(Debian软件包格式)
PyPI,新一代的Python包库管理工具。
warehouse,新一代的Python包库(PyPI)管理工具。
devpi,PyPI服务器和包装/测试/发布工具。
localshop,PyPI官方包镜像服务器,支持本地(私人)包上传。
buildout,创建,组装和部署应用程序的多个部分,其中一些可能是非基于Python的。
SCons,软件构造工具。
platformio,一个控制台的工具,构建的代码可用于不同的开发平台。
bitbake,特殊设计的工具,用于创建和部署[嵌入式]Linux软件包
fabricate,自动为任何编程语言,生成依赖包。
django-compressor,Django压缩机,压缩和内联JavaScript或CSS,链接到一个单一的缓存文件。
jinja-assets-compressor,金贾压缩机,一个Jinja扩展,通过编译,压缩你的资源。
webassets,优化管理,静态资源,独特的缓存清除。
fanstatic,球迷,包优化,提供静态文件。
fileconveyor,监控资源变化,,可保存到CDN(内容分发网络)和文件系统。
django-storages,一组自定义存储Django后台。
glue,胶胶,一个简单的命令行工具,生成CSS Sprites。
libsass-python,Sass (层叠样式表)的Python接口。
Flask-Assets,整合应用程序资源。

代码调试

unittest,Python标准库,单元测试框架。
nose,鼻子,unittest延伸产品。
pytest,成熟的全功能的Python测试工具。
mamba,曼巴,Python的权威测试工具。出自BDD的旗下。
contexts,背景,BDD测试框架,基于C#。
pyshould,should风格的测试框架,基于PyHamcrest.
pyvows,BDD风格测试框架
Selenium,web测试框架,Python绑定Selenium。
splinter,分裂,测试Web应用程序的开源工具。
locust,刺槐,可扩展的用户负载测试工具,用Python写的。
sixpack,语言无关的A/B测试框架。
mock,模拟对象(英语:mock object,也译作模仿对象),模拟测试库。
responses,工具函数,用于mock模拟测试。
doublex-强大的测试框架。
freezegun,通过时间调整,测试模块。
httpretty, HTTP请求的模拟工具。
httmock,mock模拟测试。
coverage,代码覆盖度量测试。
faker,生成模拟测试数据的Python包。
mixer,混频器,产生模拟数据,用于Django ORM,SQLAlchemy,
Peewee, MongoEngine, Pony ORM等
model_mommy,在Django创建测试随机工具。
ForgeryPy,易用的模拟数据发生器。
radar,雷达,生成随机日期/时间。
FuckIt.py,测试Python代码运行。
Code Analysispysonar2,Python类型索引。
pycallgraph,可视化的流量(调用图)应用程序。
code2flow,转换Python和JavaScript代码到流程图。
LinterFlake8,源代码模块检查器
pylama,Python和JavaScript代码审计工具。
Pylint,源代码分析器,它查找编程错误,帮助执行一个代码标准和嗅探一些代码味道。注意:相比于PyChecker,Pylint是一个高阶的Python代码分析工具,它分析Python代码中的错误。
Pyflakes,一个用于检查Python源文件错误的简单程序。Pyflakes分析程序并且检查各种错误。它通过解析源文件实现,无需导入。
pdb,Python标准库,Python调试器。
ipdb,IPython使用的PDB。
winpdb独立于平台的GUI调试器。
pudb,全屏,基于python调试控制台。
pyringe,-可附着于及注入代码到Python程序的调试器。
python-statsd,statsd服务器客户端。
memory_profiler, 内存监视。
profiling,交互式Python分析器。
django-debug-toolbar, Django调试工具栏,显示各种调试信息:当前请求/响应。
django-devserver,Django调试工具。
flask-debugtoolbar,flask调试工具。
转自:https://mp.weixin.qq.com/s/c2Xwmydliv9aSRmWFVQ45Q

花了两天,终于把 Python 的 setup.py 给整明白了

来自公众号:Python编程时光

1. 为什么需要对项目分发打包?

平常我们习惯了使用 pip 来安装一些第三方模块,这个安装过程之所以简单,是因为模块开发者为我们默默地为我们做了所有繁杂的工作,而这个过程就是 打包

打包,就是将你的源代码进一步封装,并且将所有的项目部署工作都事先安排好,这样使用者拿到后即装即用,不用再操心如何部署的问题(如果你不想对照着一堆部署文档手工操作的话)。

不管你是在工作中,还是业余准备自己写一个可以上传到 PyPI 的项目,你都要学会如何打包你的项目。

Python 发展了这么些年了,项目打包工具也已经很成熟了。他们都有哪些呢?

你可能听过 disutilsdistutilsdistutils2setuptools等等,好像很熟悉,却又很陌生,他们都是什么关系呢?

2. 包分发的始祖:distutils

distutils 是 Python 的一个标准库,从命名上很容易看出它是一个分发(distribute)工具(utlis),它是 Python 官方开发的一个分发打包工具,所有后续的打包工具,全部都是基于它进行开发的。

distutils 的精髓在于编写 setup.py,它是模块分发与安装的指导文件。

那么如何编写 setup.py 呢?这里面的内容非常多,我会在后面进行详细的解析,请你耐心往下看。

你有可能没写过 setup.py ,但你绝对使用过 setup.py 来做一些事情,比如下面这条命令,我们经常用它来进行模块的安装。

$ python setup.py install

这样的安装方法是通过源码安装,与之对应的是通过二进制软件包的安装,同样我也会在后面进行介绍。

3. 分发工具升级:setuptools

setuptools 是 distutils 增强版,不包括在标准库中。其扩展了很多功能,能够帮助开发者更好的创建和分发 Python 包。大部分 Python 用户都会使用更先进的 setuptools 模块。

distribute,或许你在其他地方也见过它,这里也提一下。

distribute 是 setuptools 有一个分支版本,分支的原因可能是有一部分开发者认为 setuptools 开发太慢了。但现在,distribute 又合并回了 setuptools 中。因此,我们可以认为它们是同一个东西。

还有一个大包分发工具是 distutils2,其试图尝试充分利用distutils,detuptools 和 distribute 并成为 Python 标准库中的标准工具。但该计划并没有达到预期的目的,且已经是一个废弃的项目。

因此,setuptools 是一个优秀的,可靠的 Python 包安装与分发工具。

那么如何在一个干净的环境中安装 setuptools 呢?

主要有两种方法:

  • 源码安装:在 https://pypi.org/project/setuptools/#files 中下载 zip 包 解压执行 python setup.py install 安装

  • 通过引导程序安装:下载引导程序,它可以用来下载或者更新最新版本的 setuptools

$ wget http://peak.telecommunity.com/dist/ez_setup.py

# 安装
$ python ez_setup.py

# 更新,以下两种任选
$ python ez_setup.py –U setuptools
$ pip install -U setuptools

4. easy_install 使用指南

当你安装完 setuptools 后,就拥有了一个叫做 easy_install 的第三方管理工具,这也是它区分于 distutils 的一大改进。

这里简单介绍一下它的用法,虽然它已经用得非常少了。

先是包的安装

# 通过包名,从PyPI寻找最新版本,自动下载、编译、安装
$ easy_install pkg_name

# 通过包名从指定下载页寻找链接来安装或升级包
$ easy_install -f http://pythonpaste.org/package_index.html 

# 指定线上的包地址安装
$ easy_install http://example.com/path/to/MyPackage-1.2.3.tgz

# 从本地的 .egg 文件安装
$ easy_install xxx.egg

# 在安装时你可以添加额外的参数
指定安装目录:--install-dir=DIR, -d DIR
指定用户安装:--user

再者是包的升级

# 从 pypi 中搜索并升级包
$ easy_install --upgrade pkg_name

# 指定版本进行升级
$ easy_install "SomePackage==2.0"

最后是包的删除

$ easy_install -m pkg_name

需要注意的是,这样的删除,仅是在 easy-install.pth 文件中删除,使其不能在 python 中使用 这个模块,但实际的包还在你的电脑中,若要删除彻底,需要你手动删除相关的 .egg 及 其他文件。

默认情况下,easy_install 只会从 pypi 上下载相关软件包,由于这个源在国外,下载包的速度并不理想,使用过pip的朋友自然会想,easy_install 是否能指定源进行安装呢?

答案是,可以的。

编辑配置文件 /root/.pydistutils.cfg

[easy_install]
index-url=http://mirrors.aliyun.com/pypi/simple/
find-links=http://mirrors.aliyun.com/pypi/simple/

以上仅介绍了 easy_install 的一些常用的方法,想要了解更多,你可以点击官方文档:https://setuptools.readthedocs.io/en/latest/easy_install.html

总结一句:setuptools 是官方提供的一个专业用于包分发的工具,若只从安装的角度来看,它的功能确实简单。它更大的意义是对包的分发很有用,定制化程序非常高,我们现在也还在用它进行版本包的发布。

5. 源码包与二进制包什么区别?

Python 包的分发可以分为两种:

  1. 以源码包的方式发布

源码包安装的过程,是先解压,再编译,最后才安装,所以它是跨平台的,由于每次安装都要进行编译,相对二进包安装方式来说安装速度较慢。

源码包的本质是一个压缩包,其常见的格式有:

花了两天,终于把 Python 的 setup.py 给整明白了
  1. 以二进制包形式发布

二进制包的安装过程省去了编译的过程,直接进行解压安装,所以安装速度较源码包来说更快。

由于不同平台的编译出来的包无法通用,所以在发布时,需事先编译好多个平台的包。

二进制包的常见格式有:

花了两天,终于把 Python 的 setup.py 给整明白了

6. eggs 与 wheels 有什么区别?

Egg 格式是由 setuptools 在 2004 年引入,而 Wheel 格式是由 PEP427 在 2012 年定义。Wheel 的出现是为了替代 Egg,它的本质是一个zip包,其现在被认为是 Python 的二进制包的标准格式。

以下是 Wheel 和 Egg 的主要区别:

  • Wheel 有一个官方的 PEP427 来定义,而 Egg 没有 PEP 定义

  • Wheel 是一种分发格式,即打包格式。而 Egg 既是一种分发格式,也是一种运行时安装的格式,并且是可以被直接 import

  • Wheel 文件不会包含 .pyc 文件

  • Wheel 使用和 PEP376 兼容的 .dist-info 目录,而 Egg 使用 .egg-info 目录

  • Wheel 有着更丰富的命名规则。

  • Wheel 是有版本的。每个 Wheel 文件都包含 wheel 规范的版本和打包的实现

  • Wheel 在内部被 sysconfig path type 管理,因此转向其他格式也更容易

wheel 包可以通过 pip 来安装,只不过需要先安装 wheel 模块,然后再使用 pip 的命令。

$ pip install wheel
$ pip wheel --wheel-dir=/local/wheels pkg

7. 超详细讲解 setup.py 的编写?

打包分发最关键的一步是编写 setup.py 文件。

以下是一个 setup.py 简单的使用示例

from setuptools import setup, find_packages

setup(
    name="mytest",
    version="1.0",
    author="wangbm",
    author_email="wongbingming@163.com",
    description="Learn to Pack Python Module  -->公众号:Python编程时光",

    # 项目主页
    url="http://iswbm.com/", 

    # 你要安装的包,通过 setuptools.find_packages 找到当前目录下有哪些包
    packages=find_packages()
)

接下来,我将慢慢扩充这个setup函数,增加更多的参数,以便你能理解setup函数能做哪些事情。

程序分类信息

classifiers 参数说明包的分类信息。所有支持的分类列表见:https://pypi.org/pypi?%3Aaction=list_classifiers

示例:

from setuptools import setup, find_packages

setup(
    classifiers = [
        # 发展时期,常见的如下
        #   3 - Alpha
        #   4 - Beta
        #   5 - Production/Stable
        'Development Status :: 3 - Alpha',

        # 开发的目标用户
        'Intended Audience :: Developers',

        # 属于什么类型
        'Topic :: Software Development :: Build Tools',

        # 许可证信息
        'License :: OSI Approved :: MIT License',

        # 目标 Python 版本
        'Programming Language :: Python :: 2',
        'Programming Language :: Python :: 2.7',
        'Programming Language :: Python :: 3',
        'Programming Language :: Python :: 3.3',
        'Programming Language :: Python :: 3.4',
        'Programming Language :: Python :: 3.5',
    ]
)

关于文件的分发

from setuptools import setup, find_packages


setup(
    name="mytest",
    version="1.0",
    author="wangbm",
    author_email="wongbingming@163.com",
    description="Learn to Pack Python Module",
    url="http://iswbm.com/", 
    packages=find_packages(),

    # 安装过程中,需要安装的静态文件,如配置文件、service文件、图片等
    data_files=[
        ('', ['conf/*.conf']),
        ('/usr/lib/systemd/system/', ['bin/*.service']),
               ],

    # 希望被打包的文件
    package_data={
        '':['*.txt'],
        'bandwidth_reporter':['*.txt']
               },
    # 不打包某些文件
    exclude_package_data={
        'bandwidth_reporter':['*.txt']
               }
)

除了以上的参数配置之外,还可以使用一个叫做 MANIFEST.in 的文件,来控制文件的分发。

如下这是一个 MANIFEST.in 的样例:

include *.txt
recursive-include examples *.txt *.py
prune examples/sample?/build

这些配置,规定了如下几点

  • 所有根目录下的以 txt 为后缀名的文件,都会分发

  • 根目录下的 examples 目录 和 txt、py文件都会分发

  • 路径匹配上 examples/sample?/build 不会分发

MANIFEST.in 需要放在和 setup.py 同级的顶级目录下,setuptools 会自动读取该文件。

关于依赖包下载安装

from setuptools import setup, find_packages


setup(
    ...

    # 表明当前模块依赖哪些包,若环境中没有,则会从pypi中下载安装
    install_requires=['docutils>=0.3'],

    # setup.py 本身要依赖的包,这通常是为一些setuptools的插件准备的配置
    # 这里列出的包,不会自动安装。
    setup_requires=['pbr'],

    # 仅在测试时需要使用的依赖,在正常发布的代码中是没有用的。
    # 在执行python setup.py test时,可以自动安装这三个库,确保测试的正常运行。
    tests_require=[
        'pytest>=3.3.1',
        'pytest-cov>=2.5.1',
    ],

    # 用于安装setup_requires或tests_require里的软件包
    # 这些信息会写入egg的 metadata 信息中
    dependency_links=[
        "http://example2.com/p/foobar-1.0.tar.gz",
    ],

    # install_requires 在安装模块时会自动安装依赖包
    # 而 extras_require 不会,这里仅表示该模块会依赖这些包
    # 但是这些包通常不会使用到,只有当你深度使用模块时,才会用到,这里需要你手动安装
    extras_require={
        'PDF':  ["ReportLab>=1.2""RXP"],
        'reST': ["docutils>=0.3"],
    }
)

关于 install_requires, 有以下五种常用的表示方法:

  1. 'argparse',只包含包名。这种形式只检查包的存在性,不检查版本。方便,但不利于控制风险。

  2. 'setuptools==38.2.4',指定版本。这种形式把风险降到了最低,确保了开发、测试与部署的版本一致,不会出现意外。缺点是不利于更新,每次更新都需要改动代码。

  3. 'docutils >= 0.3',这是比较常用的形式。当对某个库比较信任时,这种形式可以自动保持版本为最新。

  4. 'Django &gt;= 1.11, != 1.11.1, <= 2',这是比较复杂的形式。如这个例子,保证了Django的大版本在1.11和2之间,也即1.11.x;并且,排除了已知有问题的版本1.11.1(仅举例)。对于一些大型、复杂的库,这种形式是最合适的。

  5. 'requests[security, socks] >= 2.18.4',这是包含了额外的可选依赖的形式。正常安装requests会自动安装它的install_requires中指定的依赖,而不会安装securitysocks这两组依赖。这两组依赖是定义在它的extras_require中。这种形式,用在深度使用某些库时。

关于安装环境的限制

有些库并不是在所以的 Python 版本中都适用的,若一个库安装在一个未兼容的 Python 环境中,理论上不应该在使用时才报错,而应该在安装过程就使其失败,提示禁止安装。

这样的功能,可以使用 python_requires 来实现。

setup(
    ...
    python_requires='>=2.7, <=3',
)

生成可执行文件的分发

from setuptools import setup, find_packages


setup(
    name="mytest",
    version="1.0",
    author="wangbm",
    author_email="wongbingming@163.com",
    description="Learn to Pack Python Module",
    url="http://iswbm.com/", 
    packages=find_packages(),

    # 用来支持自动生成脚本,安装后会自动生成 /usr/bin/foo 的可执行文件
    # 该文件入口指向 foo/main.py 的main 函数
    entry_points={
        'console_scripts': [
            'foo = foo.main:main'
        ]
    },

    # 将 bin/foo.sh 和 bar.py 脚本,生成到系统 PATH中
    # 执行 python setup.py install 后
    # 会生成 如 /usr/bin/foo.sh 和 如 /usr/bin/bar.py
    scripts=['bin/foo.sh''bar.py']
)

上面的 scripts 里有的脚本中有 shpy 后缀,那么安装后,setuptools 会原封不动的移动到 /usr/bin 中,并添加可执行权限。

若你想对这些文件再作一些更改,比如去掉多余的后缀,可以这样做

from setuptools.command.install_scripts import install_scripts

class InstallScripts(install_scripts):

    def run(self):
        setuptools.command.install_scripts.install_scripts.run(self)

        # Rename some script files
        for script in self.get_outputs():
            if basename.endswith(".py"or basename.endswith(".sh"):
                dest = script[:-3]
            else:
                continue
            print("moving %s to %s" % (script, dest))
            shutil.move(script, dest)

setup(
    ...
    scripts=['bin/foo.sh''bar.py'],

    cmdclass={
        "install_scripts": InstallScripts
    }
)

ext_modules

ext_modules 参数用于构建 C 和 C++ 扩展扩展包。其是 Extension 实例的列表,每一个 Extension 实例描述了一个独立的扩展模块,扩展模块可以设置扩展包名,头文件、源文件、链接库及其路径、宏定义和编辑参数等。如:

setup(
    # other arguments here...
    ext_modules=[
        Extension('foo',
                  glob(path.join(here, 'src''*.c')),
                  libraries = [ 'rt' ],
                  include_dirs=[numpy.get_include()])
    ]
)

详细了解可参考:https://docs.python.org/3.6/distutils/setupscript.html#preprocessor-options

指定release

setup.py 里只能指定 version,而不能指定 release,如果你需要变更版本号,可以使用 --release 参数进行指定

python setup.py bdist_rpm --release=20200617

setup.py 的参数非常多,能够不借助文档写好一个setup.py好像没那么简单。为了备忘,我整理了 setup 函数常用的一些参数:

花了两天,终于把 Python 的 setup.py 给整明白了

更多参数可见:https://setuptools.readthedocs.io/en/latest/setuptools.html

8. 打包辅助神器PBR 是什么?

pbr 是 setuptools 的辅助工具,最初是为 OpenStack 开发(https://launchpad.net/pbr),基于d2to1

pbr 会读取和过滤setup.cfg中的数据,然后将解析后的数据提供给 setup.py 作为参数。包含如下功能:

  1. 从git中获取Version、AUTHORS and ChangeLog信息

  2. Sphinx Autodoc。pbr 会扫描project,找到所有模块,生成stub files

  3. Requirements。pbr会读取requirements.txt,生成setup函数需要的install_requires/tests_require/dependency_links

这里需要注意,在 requirements.txt 文件的头部可以使用:--index https://pypi.python.org/simple/,这一行把一个抽象的依赖声明如 requests==1.2.0 转变为一个具体的依赖声明 requests 1.2.0 from pypi.python.org/simple/

  1. long_description。从README.rst, README.txt or README file中生成long_description参数

使用pbr很简单:

from setuptools import setup

setup(
    setup_requires=['pbr'],
    pbr=True,
)

使用pbr时,setup.cfg中有一些配置。在[files]中,有三个key:
packages:指定需要包含的包,行为类似于setuptools.find_packages
namespace_packages:指定namespace packages
data_files: 指定目的目录和源文件路径,一个示例:

[files]
data_files =
    etc/pbr = etc/pbr/*
    etc/neutron =
        etc/api-paste.ini
        etc/dhcp-agent.ini
    etc/init.d = neutron.init

[entry_points] 段跟 setuptools 的方式相同。

到此,我讲了三种编写使用 setup.py 的方法

  • 使用命令行参数指定,一个一个将参数传递进去(极不推荐)

  • 在 setup.py 中的setup函数中指定(推荐使用)

  • 使用 pbr ,在 setup.cfg 中指定(易于管理,更推荐)

9. 如何使用 setup.py 构建包

1、构建源码发布包。

用于发布一个 Python 模块或项目,将源码打包成 tar.gz (用于 Linux 环境中)或者 zip 压缩包(用于 Windows 环境中)

$ python setup.py sdist

那这种包如何安装呢?

答案是,使用下一节即将介绍的 setuptools 中提供的 easy_install 工具。

$ easy_install xxx.tar.gz

使用 sdist 将根据当前平台创建默认格式的存档。在类 Unix 平台上,将创建后缀后为 .tar.gz  的 gzip 压缩的tar文件分发包,而在Windows上为 ZIP 文件。

当然,你也可以通过指定你要的发布包格式来打破这个默认行为

$ python setup.py sdist --formats=gztar,zip

你可以指定的格式有哪些呢?

创建一个压缩的tarball和一个zip文件。可用格式为:

花了两天,终于把 Python 的 setup.py 给整明白了

对以上的格式,有几点需要注意一下:

  • 在版本3.5中才添加了对  xztar 格式的支持

  • zip 格式需要你事先已安装相应的模块:zip程序或zipfile模块(已成为Python的标准库)

  • ztar 格式正在弃用,请尽量不要使用

另外,如果您希望归档文件的所有文件归root拥有,可以这样指定

python setup.py sdist --owner=root --group=root

2、构建二进制分发包。

在windows中我们习惯了双击 exe 进行软件的安装,Python 模块的安装也同样支持 打包成 exe 这样的二进制软件包。

$ python setup.py bdist_wininst

而在 Linux 中,大家也习惯了使用 rpm 来安装包,对此你可以使用这条命令实现 rpm 包的构建

$ python setup.py bdist_rpm

若你喜欢使用 easy_install 或者 pip 来安装离线包。你可以将其打包成 egg 包

$ python setup.py bdist_egg

若你的项目,需要安装多个平台下,既有 Windows 也有 Linux,按照上面的方法,多种格式我们要执行多次命令,为了方便,你可以一步到位,执行如下这条命令,即可生成多个格式的进制包

$ python setup.py bdist

10. 如何使用 setup.py 安装包

正常情况下,我们都是通过以上构建的源码包或者二进制包进行模块的安装。

但在编写 setup.py 的过程中,可能不能一步到位,需要多次调试,这时候如何测试自己写的 setup.py 文件是可用的呢?

这时候你可以使用这条命令,它会将你的模块安装至系统全局环境中

$ python setup.py install

如若你的项目还处于开发阶段,频繁的安装模块,也是一个麻烦事。

这时候你可以使用这条命令安装,该方法不会真正的安装包,而是在系统环境中创建一个软链接指向包实际所在目录。这边在修改包之后不用再安装就能生效,便于调试。

$ python setup.py develop

11. 如何发布包到 PyPi?

通过上面的学习,你一定已经学会了如何打包自己的项目,若你觉得自己开发的模块非常不错,想要 share 给其他人使用,你可以将其上传到 PyPi (Python Package Index)上,它是 Python 官方维护的第三方包仓库,用于统一存储和管理开发者发布的 Python 包。

如果要发布自己的包,需要先到 pypi 上注册账号。然后创建 ~/.pypirc 文件,此文件中配置 PyPI 访问地址和账号。如的.pypirc文件内容请根据自己的账号来修改。

典型的 .pypirc 文件

[distutils]
index-servers = pypi

[pypi]
username:xxx
password:xxx

然后使用这条命令进行信息注册,完成后,你可以在 PyPi 上看到项目信息。

$ python setup.py register

注册完了后,你还要上传源码包,别人才使用下载安装

$ python setup.py upload

或者也可以使用 twine 工具注册上传,它是一个专门用于与 pypi 进行交互的工具,详情可以参考官网:https://www.ctolib.com/twine.html,这里不详细讲了。

参考文章

  • http://blog.konghy.cn/2018/04/29/setup-dot-py/

  • https://note.qidong.name/2018/01/python-setup-requires/

– EOF –

开源框架 Zappa:上线 Python 应用仅需一条命令!

作者:HelloGitHub-吱吱

这里是 HelloGitHub 推出的《讲解开源项目》系列,今天要向小伙伴们介绍一个 Python 无服务(Serverless)框架 Zappa。

Zappa 让我们可以轻松部署 Python 应用程序:仅需几条命令、打包代码、上传云服务器、程序上线,bingo 一气呵成!从此减少部署成本,放下运维的重担。仅需你有一点点 Python Web 基础!

它到底有多便捷?一条命令即刻部署!

开源框架 Zappa:上线 Python 应用仅需一条命令!

项目地址:https://github.com/Miserlou/Zappa

下面就让我们动手来试试吧!

一、前言

1.1 介绍 Serverless

刚开篇便提到了一个莫名其妙的名词:无服务(Serverless),一开始我也是问号脸,经过多方搜证,我们可以简单的认为 Serverless 是指不必担心底层基础结构,不需要管理服务器,从而来构建和运行应用程序。具体概念小课堂如下:

1.1.1 什么鬼?

回忆一下,平时上线一个简单的 Python Web 应用的过程。

  • 一个 24 小时不间断运行的服务器:比如云主机,用以搭建代码运行环境和进行系统配置,维持着运行我们的应用;
  • 部署 Web 服务器:我们需要选择合适的 Web 服务器,经过配置和启动,实现反向代理和负载均衡;
  • 域名绑定:最后如果要被广泛用户访问,我们需要注册域名,并且绑定在服务器;
  • 运营维护:配置和启动在应用上线之后,我们还需要管理和维护我们的服务器,预防黑客攻击,应对未来用户访问高峰期。

而对于使用 Serverless 架构的应用,我们只需要关心我们的应用编写和核心业务,无需操心云主机、操作系统、资源分配和 Web 服务器配置等相关问题,无需考虑服务器的规格大小、存储类型、网络带宽、自动扩缩容问题,无需再对服务器进行运维、不断打系统补丁和应用补丁、无需进行数据备份等工作。一切非核心业务都外包给了公共云营运商,让开发人员从复杂的部署和运维环境中脱身出来,专注于业务本身的价值。

用 Zappa 里的一句话说就是 “without any permanent infrastructure”(无需任何永久性基础设施)。

敲黑板,尽管从名字上说是 Serverless,但是仍然需要物理服务器,只是我们开发人员成了甩手掌柜。

1.1.2 好处有?

  • 降低运维需求和维护成本;
  • 完全自动化的弹性扩容和缩容:在业务高峰期时,产品的计算能力和容量自动扩大,承载更多的用户请求;反之,在业务下降时,所使用的资源也会同时收缩,避免资源浪费;
  • 节省开支,全新的计量计费模式:开发者仅需根据使用量来付费。在无业务量的情况下,不会有空闲资源占用,也不会有费用产生。

1.1.3 普遍认为 Serverless = FaaS + BaaS

  • BaaS(Backedn as a Service 后端即服务)
    • 后端,指的就是各种云产品和云服务,例如对象存储 OS ,消息队列 MQ,云数据库 DB,云缓存 Redis以及各种以 API 形式提供的服务。用户直接开通即可使用,无需考虑部署、扩容、备份、安全等各种运维工作。
  • FaaS(Functions as a Service 函数即服务)
    • 是 Serverless 的核心,让用户仅需编写和上传核心业务代码,交由平台完成部署、调度、流量分发和弹性伸缩等能力,它提供了一种新的方式来提供计算资源,进一步降低云计算的使用门槛。

1.1.4 AWS Lambda

在该项目中,伸手白piao AWS 海外区域账户免费 AWS Lambda 套餐。AWS Lambda 作为 Serverless 最早的框架产品由亚马逊在2014年推出,是一种无服务器的计算服务,无需预置或管理服务器即可运行代码。Lambda 几乎可以为任何类型的应用程序或后端服务运行代码,我们只需上传相应的代码,它会处理运行和扩展代码所需的一切工作。

开源框架 Zappa:上线 Python 应用仅需一条命令!

1.2 Python 的 Serverless 框架

本篇文章的主角:Zappa 登场!我们可以通过 Zappa 工具体验一下 Serverless 技术,用它实现我们 Python 应用程序的无服务器部署,初步体验无限伸缩扩展、零宕机、零维护的快捷。有了 Zappa,我们无需:

  • 配置 Web 服务器
  • 付费 24/7 服务器的正常运行时间
  • 担心负载平衡和可扩展性
  • 保持自己的服务器时刻在线状态

二、亲自动手

实战时间:已经实验(踩坑)成功(不断)的我就来分享部署一个简单的 Flask 应用的过程,不要担心跟着做你也可以~

2.1 环境

  1. Python版本要求:3.6/3.7/3.8
  2. 测试系统:Ubuntu 18.04.4 LTS

2.2 准备

  1. 保证自己的项目是运行在虚拟环境下。

    # 需要安装 Python 3.x 版本
    python --version

    # 安装 Pipenv
    pip install --user pipenv

    # 进入自己的项目
    cd demo

    # 实例化 pipfile 和 venv
    pipenv shell
    开源框架 Zappa:上线 Python 应用仅需一条命令!
  2. 安装 Zappa 和 Flask,项目需要其他库的话,可自行添加。

     
    nbsp;pipenv install zappa flask
    开源框架 Zappa:上线 Python 应用仅需一条命令!
  3. 在目录下创建 my_app.py 文件,写入官方样例,可以先 pipenv run python my_app.py看看是否能正常运行

    from flask import Flask
    app = Flask(__name__)

    @app.route('/')
    def hello():
        return "hello, from Zappa!n"

    if __name__ == '__main__':
        app.run()
  4. 注册 AWS 账户,并且正确安装 AWS credentials file

    • 登录 AWS,找到 My Security Credentials 下的 Access keys (access key ID and secret access key) ,如果没有则创建一个,记住 access key IDsecret access key

    • 安装 AWS 的命令行界面,添加 credentials

      # 在虚拟环境下安装
      pipenv install awscli

      # 查看信息
      aws configure list

      # 添加,并且按照提示将 access key ID 和 secret access key 填入
      aws configure

      # 后两个 region name 和 output format 选填
      开源框架 Zappa:上线 Python 应用仅需一条命令!
    • 此时在 ~/.aws 目录下会出现两个文件 config 和 credentials,credentials 中储存了 AWS 的 access key IDsecret access key, config 中储存了 region name 和  output format 信息。

    • 如果是在 Windows 上操作的同学,可以查看官方提供的安装 AWS credentials file 的教程。

2.3 安装与配置

  1. 通过执行下面语句进行初始化,定义部署和配置的设置,自动检测应用类型(Flask 或 Django)

     
    nbsp;zappa init

    在执行过程中,可能需要如下设置,后续也可以在新生成的 zappa_setting.json 的配置文件中修改:

    开源框架 Zappa:上线 Python 应用仅需一条命令!

    完成后,我们的项目目录中将有一个 zappa_settings.json 文件,里面是我们刚刚定义的基本部署设置,后期我们可以按照自己的需求修改此文件。

    {
        "dev": {
            "app_function""my_app.app",
            "profile_name"null,
            "project_name""demo",
            "runtime""python3.6",
            "s3_bucket""zappa-ti0ra29xi"
        }
    }
  2. 注意如果之前已经在 ~/.aws/config 文件中添加 region 信息,则会在 zappa init 的时候自动寻找到这些 region 信息,无需后续修改。

    如果之前没有添加,则修改 zappa_settings.json,添加 region 信息如下:

    # 修改如下
    {
        "dev": {
            "app_function""my_app.app",
            "profile_name": null,
            "project_name""demo",
            "runtime""python3.6",
            "s3_bucket""zappa-ti0ra29xi"
            "aws_region""us-west-2"
        }
    }

    region 的信息可以自行选择。

2.4 部署和使用

配置设置后,可以使用如下命令将应用程序打包并部署:

 
nbsp;zappa deploy dev

当我们调用 deploy 时,Zappa 会自动将我们的应用程序和本地虚拟环境打包到 Lambda 兼容的 archive,用为 Lambda 预先编译的版本替换所有依赖项,设置功能处理程序和必要的 WSGI 中间件,然后上传 archive 到 S3,创建和管理必要的Amazon IAM 策略和角色,将其注册为新的 Lambda function,创建新的 API 网关资源,为其创建 WSGI 兼容的路由,将其链接到新的 Lambda function,最后从 S3 bucket 中删除 archive。

执行成功后,就会出现一个链接,点击链接即可访问我们的简易 Web 应用。看到已上线的应用程序,心内窃喜,直呼快准狠。

开源框架 Zappa:上线 Python 应用仅需一条命令!

三、其他命令

  1. 更新操作:假设应用程序已经部署完毕,并且只需要上传新的 Python 代码,而无需修改基础路由,则可以执行以下操作:

     
    nbsp;zappa update dev

    这将创建一个新的 archive,将其上传到 S3 并更新 Lambda function 以使用新代码。

  2. 查看部署和事件计划的状态,只需使用命令:

     
    nbsp;zappa status production
  3. 查看部署的日志:

     
    nbsp;zappa tail dev

    # 过滤 HTTP 请求
     
    nbsp;zappa tail dev --http

    # 执行相反操作,并且仅显示非 HTTP 事件和日志消息
     
    nbsp;zappa tail dev --non-http

    # 选择时长
     
    nbsp;zappa tail dev --since 4h # 4 hours
  4. 回滚操作:通过提供要返回的修订版本数将部署的代码回滚到以前的版本。

    # 回滚到3年前部署的版本
     
    nbsp;zappa rollback production -n 3
  5. 安排 function 定期执行:修改 zappa_setting.json ,加入如下内容:

    {
        "dev": {
            ...
            "events": [{
                // The function to execute
                "function""your_module.your_function",
                // When to execute it (in cron or rate format)
                "expression""rate(1 minute)" 
            }],
            ...
        }
    }

    然后执行如下操作,我们的 function 就会在每分钟执行一次。

     
    nbsp;zappa schedule dev

    # cancal
     
    nbsp;zappa unschedule dev
  6. 取消部署:如果要删除以前发布的 API Gateway 和 Lambda function,则只需:

     
    nbsp;zappa unschedule dev

四、踩坑建议

在成功运行一次之前,踩坑千千万万遍,都是因为自己手残眼瞎魔改了很多地方,把经历过的报错记录下来,分享给和我一样的小小白。

  1. “Unable to import module ‘handler’: attempted relative import with no known parent package”:原因是我们期望的依赖在虚拟的环境中没有,需要查看自己虚拟环境中的依赖是否完整。

  2. 出现如下报错,可以更换一个 region 信息。

     
    nbsp;zappa deploy dev
    Calling deploy for stage dev..
    Creating demo-dev-ZappaLambdaExecutionRole IAM Role..
    Error: Failed to manage IAM roles!
    You may lack the necessary AWS permissions to automatically manage a Zappa execution role.
    Exception reported by AWS:An error occurred (InvalidClientTokenId) when calling the CreateRole operation: The security token included in the request is invalid.
    To fix this, see here: https://github.com/Miserlou/Zappa#custom-aws-iam-roles-and-policies-for-deployment
  3. 如果我们在 zappa init 的时候,不使用默认分配的 s3_bucket ,则须注意自己的名称是不允许重名的,否则会报错 botocore.errorfactory.BucketAlreadyExists: An error occurred (BucketAlreadyExists) when calling the CreateBucket operation: The requested bucket name is not available. The bucket namespace is shared by all users of the system. Please select a different name and try again.

五、写在最后

是不是当自己成功部署后,突然觉得妙不可言,一身轻松,好像再也没有了之前所说的繁琐的过程,反而几条命令,白piao AWS 的服务,咱的应用程序就轻巧上线了呢,还不赶紧把生成的链接分享给小伙伴们点击一下。

至此,我们已经可以基本实现快速部署一个简单的 Flask 应用了,由于篇幅有限,还有部分 Zappa 的高级功能没有提及,以及如何使用 Zappa 部署 Django 应用或者一个更为庞大的项目(包含数据库等),希望感兴趣的小伙伴们能够多多尝试,我已经开始期待得搓搓手了

转自:https://mp.weixin.qq.com/s/Yfg163FzIY4kZpeTKoU05w

​Python 如何仅用 5000 行代码,实现强大的 logging 模块?

 

者:肖恩

来源:游戏不存在

Python 的 logging 模块实现了灵活的日志系统。整个模块仅仅 3 个类,不到 5000 行代码的样子,学习它可以加深对程序日志的了解,本文分下面几个部分:

  • logging 简介
  • logging API 设计
  • 记录器对象 Logger
  • 日志记录对象 LogRecord
  • 处理器对象 Hander
  • 格式器对象 Formatter
  • 滚动日志文件处理器
  • 小结
  • 小技巧

logging 简介

本次代码使用的是 python 3.8.5 的版本,官方中文文档 3.8.8 。参考链接中官方中文文档非常详细,建议先看一遍了解日志使用。

功能
logging-module logging的API
Logger 日志记录器对象类,可以创建一个对象用来记录日志
LogRecord 日志记录对象,每条日志记录都封装成一个日志记录对象
Hander 处理器对象,负责日志输出到流/文件的控制
Formatter 格式器,负责日志记录的格式化
RotatingFileHandler 按大小滚动的日志文件记录器
TimedRotatingFileHandler 按时间滚动的日志文件处理器

我们主要研究日志如何输出到标准窗口这一主线;日志的配置,日志的线程安全及各种特别的Handler等支线可以先忽略。

logging API 设计

先看看日志使用:

import logging

logging.basicConfig(level=logging.INFO, format='%(levelname)-8s %(name)-10s %(asctime)s %(message)s')
lang = {"name""python""age":20}
logging.info('This is a info message %s', lang)
logging.debug('This is a debug message')
logging.warning('This is a warning message')

logger = logging.getLogger(__name__)
logger.warning('This is a warning')

输出内容如下:

INFO     root       2021-03-04 00:03:53,473 This is a info message {'name''python''age': 20}
WARNING  root       2021-03-04 00:03:53,473 This is a warning message
WARNING  __main__   2021-03-04 00:03:53,473 This is a warning

可以看到 logging 的使用非常方便,模块直接提供了一组API。

root = RootLogger(WARNING)  # 默认提供的logger
Logger.root = root
Logger.manager = Manager(Logger.root)

def debug(msg, *args, **kwargs): # info,warning等api类似
    if len(root.handlers) == 0:
        basicConfig()  # 默认配置
    root.debug(msg, *args, **kwargs)

def getLogger(name=None):
    if name:
        return Logger.manager.getLogger(name)  # 创建特定的logger
    else:
        return root  # 返回默认的logger

这种API的提供方式,我们在requests中也有看到。api中很重要的设置config的方式:

def basicConfig(**kwargs):
    ...
    if handlers is None:
        filename = kwargs.pop("filename", None)
        mode = kwargs.pop("filemode"'a')
        if filename:
            h = FileHandler(filename, mode)
        else:
            stream = kwargs.pop("stream", None)
            h = StreamHandler(stream)  # 默认的handler
        handlers = [h]
    dfs = kwargs.pop("datefmt", None)
    style = kwargs.pop("style"'%')
    fs = kwargs.pop("format", _STYLES[style][1])
    fmt = Formatter(fs, dfs, style)  # 生成formatter
    for h in handlers:
        if h.formatter is None:
            h.setFormatter(fmt)
        root.addHandler(h)  # 设置root的handler
    level = kwargs.pop("level", None)
    if level is not None:
        root.setLevel(level)  # 设置日志级别

可以看到,日志的配置主要包括下面几项:

  • level 日志级别
  • format 信息格式化模版
  • filename 输出到文件
  • datefmt %Y-%m-%d %H:%M:%S,uuu 时间的格式模版
  • style [%,{,$] 格式样板

演示代码输出中,可以看到debug日志没有显示,是因为 debug < info:

CRITICAL = 50
FATAL = CRITICAL
ERROR = 40
WARNING = 30
WARN = WARNING
INFO = 20
DEBUG = 10
NOTSET = 0

记录器对象 Logger

查看Logger之前,先看logger对象的管理类Manager

_loggerClass = Logger

class Manager(object):
    def __init__(self, rootnode):
        self.root = rootnode
        self.disable = 0
        self.loggerDict = {}  # 所有日志记录对象的字典
    ...
    def getLogger(self, name):
        rv = None
        if name in self.loggerDict:
            rv = self.loggerDict[name]  # 获取已经创建过的同名logger
            ...
        else:
            rv = (self.loggerClass or _loggerClass)(name)  # 创建新的logger
            rv.manager = self
            self.loggerDict[name] = rv
            ...
        return rv

日志过滤器

class Filterer(object):

    def __init__(self):
        self.filters = []

    def addFilter(self, filter):
        self.filters.append(filter)

    def removeFilter(self, filter):
        self.filters.remove(filter)

    def filter(self, record):
        rv = True
        for f in self.filters:  # 过滤日志
            if hasattr(f, 'filter'):
                result = f.filter(record)
            else:
                result = f(record) # assume callable - will raise if not
            if not result:
                rv = False
                break
        return r

核心的 Logger 实际上只是一个控制中心:

class Logger(Filterer):  # logger可以过滤日志
    def __init__(self, name, level=NOTSET):
        Filterer.__init__(self)
        self.name = name
        self.level = _checkLevel(level)
        self.parent = None  # 日志可以有层级
        self.propagate = True
        self.handlers = []  # 可以输出到多个handler
        self.disabled = False  # 可以关闭
        self._cache = {}
    
    def debug(self, msg, *args, **kwargs):  # 输出debug日志
        if self.isEnabledFor(DEBUG):
            self._log(DEBUG, msg, args, **kwargs)

logger可以判断日志级别:

def isEnabledFor(self, level):
    if self.disabled:
        return False

    try:
        return self._cache[level]
    except KeyError:
        try:
            if self.manager.disable >= level:
                is_enabled = self._cache[level] = False
            else:
                is_enabled = self._cache[level] = (
                    level >= self.getEffectiveLevel()
                )
        return is_enabled

def getEffectiveLevel(self):
    logger = self
    while logger:
        if logger.level:
            return logger.level
        logger = logger.parent
    return NOTSET

日志输出:

def _log(self, level, msg, args, exc_info=None, extra=None, stack_info=False,
         stacklevel=1):
    ...
    fn, lno, func = "(unknown file)", 0, "(unknown function)"
    ...
    # 生成日志记录
    record = self.makeRecord(self.name, level, fn, lno, msg, args,
                             exc_info, func, extra, sinfo)
    # 使用handler处理日志
    self.handle(record)

日志记录的生产,就是创建一个LogRecord对象:

_logRecordFactory = LogRecord

def makeRecord(self, name, level, fn, lno, msg, args, exc_info,
               func=None, extra=None, sinfo=None):
    ...
    rv = _logRecordFactory(name, level, fn, lno, msg, args, exc_info, func,
                         sinfo)
    ...
    return rv

使用logger对象的所有handler处理日志:

def handle(self, record):
    c = self
    found = 0
    while c:
        for hdlr in c.handlers:  # 使用所有的handler处理日志
            found = found + 1
            if record.levelno >= hdlr.level:
                hdlr.handle(record)

root-logger 的handler是在config中配置的:

def basicConfig(**kwargs):
    ...
    root.addHandler(h)  # 设置root的handler

日志记录对象 LogRecord

日志记录对象非常简单:

class LogRecord(object):
    def __init__(self, name, level, pathname, lineno,
                 msg, args, exc_info, func=None, sinfo=None, **kwargs):
        ct = time.time()
        self.name = name  # logger名称
        self.msg = msg  # 日志标识信息
        ...
        self.args = args  # 变量
        self.levelname = getLevelName(level)
        ...
    
    def getMessage(self):
        msg = str(self.msg)
        if self.args:
            msg = msg % self.args  # 格式化消息
        return msg

处理器对象 Hander

顶级Handler定义了Handler的模版方法

class Handler(Filterer):  # 处理器也可以过滤日志
    def __init__(self, level=NOTSET):
        Filterer.__init__(self)
        self._name = None
        self.level = _checkLevel(level)  # handler也有日志级别
        self.formatter = None
        _addHandlerRef(self)
        self.createLock()
        
    def handle(self, record):  # 处理日志
        rv = self.filter(record)  # 过滤日志
        if rv:
            self.acquire()  # 申请锁
            try:
                self.emit(record)  # 提交记录,由不同子类实现 
            finally:
                self.release()  # 释放锁
        return rv

默认的console流 StreamHandler

class StreamHandler(Handler):

    terminator = 'n'  # 自动换行

    def __init__(self, stream=None):
        Handler.__init__(self)
        if stream is None:
            stream = sys.stderr  # 默认使用stderr输出
        self.stream = stream
    
    def emit(self, record):
        try:
            msg = self.format(record)  # 格式化日志记录
            stream = self.stream
            stream.write(msg + self.terminator)  # 写日志
            self.flush()  # 刷新写缓存
        except Exception:
            ...
    
    def format(self, record):
        if self.formatter:
            fmt = self.formatter
        else:
            fmt = _defaultFormatter
        return fmt.format(record)  # 使用格式化器格式化日志记录

为什么使用stderr,可以看下面的测试中的输出都是到console:

print("haha")
print("fatal error", file=sys.stderr)
sys.stderr.write("fatal errorn")

格式器对象 Formatter

格式化器主要使用Formatter和Style实现

class Formatter(object):
    def __init__(self, fmt=None, datefmt=None, style='%', validate=True):
        self._style = _STYLES[style][0](fmt)
        self._fmt = self._style._fmt
        self.datefmt = datefmt
    
    def format(self, record):
        record.message = record.getMessage()
        s = self.formatMessage(record)
        return s
        
    def formatMessage(self, record):
        return self._style.format(record)  # 格式化

Style类

class PercentStyle(object):

    default_format = '%(message)s'
    asctime_format = '%(asctime)s'
    asctime_search = '%(asctime)'
    validation_pattern = re.compile(r'%(w+)[#0+ -]*(*|d+)?(.(*|d+))?[diouxefgcrsa%]', re.I)

    def __init__(self, fmt):
        self._fmt = fmt or self.default_format

    def usesTime(self):
        return self._fmt.find(self.asctime_search) >= 0

    def validate(self):
        """Validate the input format, ensure it matches the correct style"""
        if not self.validation_pattern.search(self._fmt):
            raise ValueError("Invalid format '%s' for '%s' style" % (self._fmt, self.default_format[0]))

    def _format(self, record):
        return self._fmt % record.__dict__  # 格式化日志记录对象

    def format(self, record):
        try:
            return self._format(record)
        except KeyError as e:
            raise ValueError('Formatting field not found in record: %s' % e)

滚动日志文件处理器

线上的日志持续输出到一个文件的话,会让文件巨大,即有加剧了丢失的风险,也难以处理。通常有按照大小滚动或者按照日期滚动的方法,这个功能非常重要。先看滚动日志处理器模版:

class BaseRotatingHandler(logging.FileHandler):
    def emit(self, record):
        try:
            if self.shouldRollover(record): # 判断是否需要滚动
                self.doRollover()  # 滚动日志
            logging.FileHandler.emit(self, record)  # 输出日志
        except Exception:
            self.handleError(record)
    
    def rotate(self, source, dest):
        if not callable(self.rotator):
            if os.path.exists(source):
                os.rename(source, dest)  # 重命名日志文件
        else:
            self.rotator(source, dest)

按大小滚动 RotatingFileHandler

按照文件大小滚动的处理器:

class RotatingFileHandler(BaseRotatingHandler):

    def __init__(self, filename, mode='a', maxBytes=0, backupCount=0, encoding=None, delay=False):
        if maxBytes > 0:
            mode = 'a'
        BaseRotatingHandler.__init__(self, filename, mode, encoding, delay)
        self.maxBytes = maxBytes  # 单个文件大小上限
        self.backupCount = backupCount  # 日志备份数量
        
    def doRollover(self):  # 执行滚动
        if self.stream:
            self.stream.close()  # 关闭当前的流
            self.stream = None
        if self.backupCount > 0:
            for i in range(self.backupCount - 1, 0, -1):
                sfn = self.rotation_filename("%s.%d" % (self.baseFilename, i))
                dfn = self.rotation_filename("%s.%d" % (self.baseFilename,
                                                        i + 1))
                if os.path.exists(sfn):
                    if os.path.exists(dfn):
                        os.remove(dfn)
                    os.rename(sfn, dfn)
            dfn = self.rotation_filename(self.baseFilename + ".1")
            if os.path.exists(dfn):
                os.remove(dfn)
            self.rotate(self.baseFilename, dfn)  # 重命名文件
        if not self.delay:
            self.stream = self._open()  # 如果shouldRollover延迟,可以打开新的流

    def shouldRollover(self, record):  # 判断是否需要滚动
        if self.stream is None:  # 立即打开流
            self.stream = self._open()
        if self.maxBytes > 0:   
            msg = "%sn" % self.format(record)
            self.stream.seek(0, 2)  #due to non-posix-compliant Windows feature
            if self.stream.tell() + len(msg) >= self.maxBytes:  # 判断大小
                return 1
        return 0

文件大小滚动就是在记录日志时候判断文档是否超过上限,超过则重命名旧日志,生成新日志。

按照日期滚动 TimedRotatingFileHandler

按照日期滚动的处理器:

class TimedRotatingFileHandler(BaseRotatingHandler):
    def __init__(self, filename, when='h', interval=1, backupCount=0, encoding=None, delay=False, utc=False, atTime=None):
        BaseRotatingHandler.__init__(self, filename, 'a', encoding, delay)
        self.when = when.upper()
        self.backupCount = backupCount
        self.utc = utc
        self.atTime = atTime
        # 日期设置,支持多种方式
        if self.when == 'S':
            self.interval = 1 # one second
            self.suffix = "%Y-%m-%d_%H-%M-%S"
            self.extMatch = r"^d{4}-d{2}-d{2}_d{2}-d{2}-d{2}(.w+)?$"
        ...

        self.extMatch = re.compile(self.extMatch, re.ASCII)
        self.interval = self.interval * interval # multiply by units requested
        filename = self.baseFilename
        if os.path.exists(filename):
            t = os.stat(filename)[ST_MTIME]  # 最后修改时间
        else:
            t = int(time.time())
        self.rolloverAt = self.computeRollover(t)  # 提前计算终止时间

    def computeRollover(self, currentTime):
        # 判断的方法还是很长很复杂的,先pass

    def shouldRollover(self, record):
        t = int(time.time())
        if t >= self.rolloverAt:  # 判断是否到期
            return 1
        return 0

    def doRollover(self):
        ...
        dfn = self.rotation_filename(self.baseFilename + "." +
                                     time.strftime(self.suffix, timeTuple))
        #  滚动日志文件
        if os.path.exists(dfn):
            os.remove(dfn)
        self.rotate(self.baseFilename, dfn)
        if self.backupCount > 0:
            for s in self.getFilesToDelete():
                os.remove(s)
        ...
        # 计算下一个时间点
        newRolloverAt = self.computeRollover(currentTime)
        ...
        self.rolloverAt = newRolloverAt

日期滚动就是计算最后时间点,超过时间点则重新生成新的日志文件。

小结

logging的处理逻辑大概是这样的:

  • 创建Logger对象,提供API,用来接收应用程序日志
  • Logger对象包括多个Handler
  • 每个Handler有一个Formatter对象
  • 每条日志都会生成一个LogRecord对象
  • 使用不同的Handler对象将LogRecored对象提交到不同的流
  • 每个日志对象通过Formatter格式化输出
  • 可以使用按日期/文件大小的方式进行日志文件的滚动记录

小技巧

覆盖对象的 __reduce__ 方法,让对象支持reduce函数:

class RootLogger(Logger):
    def __init__(self, level):
        Logger.__init__(self, "root", level)

    def __reduce__(self):
        return getLogger, ()

线程锁的创建和释放:

_lock = threading.RLock()

def _acquireLock():
    if _lock:
        _lock.acquire()

def _releaseLock():
    if _lock:
        _lock.release()

线程锁的使用:

def addHandler(self, hdlr):
    _acquireLock()
    try:
        self.handlers.append(hdlr)
    finally:
        _releaseLock()

def removeHandler(self, hdlr):
    _acquireLock()
    try:
        self.handlers.remove(hdlr)
    finally:
        _releaseLock()

参考链接

  • Logging in Python https://realpython.com/python-logging/
  • 日志操作手册 https://docs.python.org/zh-cn/3.8/howto/logging-cookbook.html#cookbook-rotator-namer
  • Python 的日志记录工具 https://docs.python.org/zh-cn/3.8/library/logging.html

转自:https://mp.weixin.qq.com/s/7wiDBdGRRQymJz5oeyvboQ

15 个顶级 Python 库,你必须要试试!

英文:Erik van Baaren,翻译:Python猫 – 数据黑客

为什么我喜欢Python?对于初学者来说,这是一种简单易学的编程语言,另一个原因:大量开箱即用的第三方库,正是23万个由用户提供的软件包使得Python真正强大和流行。

在本文中,我挑选了15个最有用的软件包,介绍它们的功能和特点。

1. Dash

Dash是比较新的软件包,它是用纯Python构建数据可视化app的理想选择,因此特别适合处理数据的任何人。Dash是Flask,Plotly.js和React.js的混合体。

15 个顶级 Python 库,你必须要试试!

2. Pygame

Pygame是SDL多媒体库的Python装饰器,SDL(Simple DirectMedia Layer)是一个跨平台开发库,旨在提供对以下内容的低级接口:

  • 音频

  • 键盘

  • 鼠标

  • 游戏杆

  • 基于OpenGL和Direct3D的图形硬件

Pygame具有高度的可移植性,几乎可以在所有平台和操作系统上运行。尽管它具有完善的游戏引擎,但您也可以使用此库直接从Python脚本播放MP3文件。

3. Pillow

Pillow专门用于处理图像,您可以使用该库创建缩略图,在文件格式之间转换,旋转,应用滤镜,显示图像等等。如果您需要对许多图像执行批量操作,这是理想的选择。

为了快速了解它,看以下代码示例(加载并渲染图片):

15 个顶级 Python 库,你必须要试试!

4. Colorama

Colorama允许你在终端使用颜色,非常适合Python脚本,文档简短而有趣,可以在Colorama PyPI页面上找到。

15 个顶级 Python 库,你必须要试试!

5. JmesPath

在Python中使用JSON非常容易,因为JSON在Python字典上的映射非常好。此外,Python带有自己出色的json库,用于解析和创建JSON。对我来说,这是它最好的功能之一。如果我需要使用JSON,可以考虑使用Python。

JMESPath使Python处理JSON更加容易,它允许您明确的地指定如何从JSON文档中提取元素。以下是一些基本示例,可让您对它的功能有所了解:

15 个顶级 Python 库,你必须要试试!

6. Requests

Requests建立在世界上下载量最大的Python库urllib3上,它令Web请求变得非常简单,功能强大且用途广泛。

以下代码示例说明requests的使用是多么简单。

15 个顶级 Python 库,你必须要试试!

Requests可以完成您能想到的所有高级工作,例如:

  • 认证

  • 使用cookie

  • 执行POST,PUT,DELETE等

  • 使用自定义证书

  • 使用会话Session

  • 使用代理

7. Simplejson

Python中的本地json模块有什么问题?没有!实际上,Python的json是simplejson。意思是,Python采用了simplejson的一个版本,并将其合并到每个发行版中。但是使用simplejson具有一些优点:

  • 它适用于更多Python版本。

  • 它比Python随附的版本更新频率更高。

  • 它具有用C编写的(可选)部分,因此非常快速。

由于这些事实,您经常会在使用JSON的脚本中看到以下内容:

15 个顶级 Python 库,你必须要试试!

我将只使用默认的json,除非您特别需要:

  • 速度

  • 标准库中没有的东西

Simplejson比json快很多,因为它用C实现一些关键部分。除非您正在处理数百万个JSON文件,否则您不会对这种速度感兴趣。

8. Emoji

Emoji库非常有意思,但并非每个人都喜欢表情包,分析视角媒体数据时,Emoji包非常有用。

15 个顶级 Python 库,你必须要试试!

以下是简单的代码示例:

15 个顶级 Python 库,你必须要试试!

9. Chardet

您可以使用chardet模块来检测文件或数据流的字符集。例如,这在分析大量随机文本时很有用。但是,当您不知道字符集是什么时,也可以在处理远程下载的数据时使用它。

10. Python-dateutil

python-dateutil模块提供了对标准datetime模块的强大扩展。我的经验是,常规的Python日期时间功能在哪里结束,而python-dateutil就出现了。

您可以使用此库做很多很棒的事情。我将这些示例限制为我发现特别有用的示例:模糊分析日志文件中的日期,例如:

15 个顶级 Python 库,你必须要试试!

有关更多功能,请参见完整文档,例如:

  • 计算相对增量(下个月,明年,下周一,该月的最后一周等)和两个给定日期对象之间的相对增量。

  • 使用iCalendar规范的超集,根据重复规则计算日期。

  • tzfile文件(/ etc / localtime,/ usr / share / zoneinfo等)的时区(tzinfo)实现,TZ环境字符串(所有已知格式),iCalendar格式文件,给定范围(在相对增量的帮助下),本地计算机 时区,固定偏移时区,UTC时区和基于Windows注册表的时区。

  • 基于奥尔森数据库的内部最新世界时区信息。

  • 使用Western,Orthodox或Julian算法计算任意一年的复活节周日日期。

11. 进度条:progress和tqdm

这里有点作弊,因为这是两个包,但忽略其中之一是不公平的。

您可以创建自己的进度条,这也许很有趣,但是使用progress或tqdm程序包更快,更不容易出错。

progress

借助这个软件包,您可以轻松创建进度条:

15 个顶级 Python 库,你必须要试试!
img
15 个顶级 Python 库,你必须要试试!

tqdm

tqdm的功能大致相同,但似乎是最新的。首先以gif动画形式进行一些演示:

15 个顶级 Python 库,你必须要试试!

12. IPython

15 个顶级 Python 库,你必须要试试!

我确定您知道Python的交互式外壳,这是运行Python的好方法。但是您也知道IPython shell吗?如果您经常使用交互式外壳程序,但您不了解IPython,则应该检查一下!

增强的IPython shell提供的一些功能包括:

  • 全面的对象自省。

  • 输入历史记录,跨会话持续存在。

  • 在具有自动生成的引用的会话期间缓存输出结果。

  • 制表符补全,默认情况下支持python变量和关键字,文件名和函数关键字的补全。

  • “魔术”命令,用于控制环境并执行许多与IPython或操作系统相关的任务。

  • 会话记录和重新加载。

  • 对pdb调试器和Python分析器的集成访问。

  • IPython的一个鲜为人知的功能:它的体系结构还允许并行和分布式计算。

IPython是Jupyter Notebook的核心,它是一个开放源代码Web应用程序,可让您创建和共享包含实时代码,方程式,可视化效果和叙述文本的文档。

13. Homeassistant

15 个顶级 Python 库,你必须要试试!

我喜欢家庭自动化。这对我来说是一种嗜好,但我至今仍对此深表歉意,因为它现在控制着我们房屋的大部分。我使用Home Assistant将房子中的所有系统捆绑在一起。尽管它确实是一个完整的应用程序,但是您也可以将其安装为Python PyPI软件包。

  • 我们的大多数灯具都是自动化的,百叶窗也是如此。

  • 我监视我们的天然气用量,电力用量和产量(太阳能电池板)。

  • 我可以跟踪大多数电话的位置,并在进入一个区域时开始操作,例如当我回家时打开车库灯。

  • 它还可以控制我们所有的娱乐系统,例如三星电视和Sonos扬声器。

  • 它能够自动发现网络上的大多数设备,因此上手起来非常容易。

我已经每天使用Home Assistant已有3年了,它仍处于测试阶段,但这是我尝试过的所有平台中最好的平台。它能够集成和控制各种设备和协议,并且都是免费和开源的。

如果您有兴趣将房屋自动化,请确保有机会!如果您想了解更多,请访问他们的官方网站。如果可以,请将其安装在Raspberry Pi上。到目前为止,这是最简单,最安全的入门方法。我将其安装在Docker容器内功能更强大的服务器上。

14. Flask

Flask是我的入门库,用于创建快速的Web服务或简单的网站。这是一个微框架,这意味着Flask旨在使核心保持简单但可扩展。有700多个官方和社区扩展。

如果您知道自己将开发一个大型的Web应用程序,则可能需要研究一个更完整的框架。该类别中最受欢迎的是Django。

15. BeautifulSoup

如果您从网站上提取了一些HTML,则需要对其进行解析以获取实际所需的内容。Beautiful Soup是一个Python库,用于从HTML和XML文件中提取数据。它提供了导航,搜索和修改解析树的简单方法。它非常强大,即使损坏了,也能够处理各种HTML。相信我,HTML经常被破坏,所以这是一个非常强大的功能。

它的一些主要功能:

  • Beautiful Soup会自动将传入文档转换为Unicode,将传出文档转换为UTF-8。您无需考虑编码。

  • Beautiful Soup位于流行的Python解析器(如lxml和html5lib)的顶部,使您可以尝试不同的解析策略或提高灵活性。

  • BeautifulSoup会解析您提供的任何内容,并为您做遍历树的工作。您可以将其告诉“查找所有链接”,或“查找带有粗体的表格标题,然后给我该文字。”

 

原文链接:https://medium.com/tech-explained/top-15-python-packages-you-must-try-c6a877ed3cd0

 

– EOF –

转自:https://mp.weixin.qq.com/s/iDW7ycuzoTM72B09wHI-8w