From fc7d402cd9d314c0cc24d676f601af76df5c39aa Mon Sep 17 00:00:00 2001 From: hanxiaomax-mac Date: Wed, 30 May 2018 21:55:05 +0800 Subject: [PATCH] Deployed 66f30bd with MkDocs version: 0.16.3 --- .nojekyll | 0 404.html | 271 ++ assets/images/favicon.ico | Bin 0 -> 1150 bytes assets/images/icons/bitbucket-670608a71a.svg | 1 + assets/images/icons/github-1da075986e.svg | 1 + assets/images/icons/gitlab-5ad3f9f9e5.svg | 1 + assets/javascripts/application-946997f430.js | 1 + assets/javascripts/lunr/lunr.da.js | 1 + assets/javascripts/lunr/lunr.de.js | 1 + assets/javascripts/lunr/lunr.du.js | 1 + assets/javascripts/lunr/lunr.es.js | 1 + assets/javascripts/lunr/lunr.fi.js | 1 + assets/javascripts/lunr/lunr.fr.js | 1 + assets/javascripts/lunr/lunr.hu.js | 1 + assets/javascripts/lunr/lunr.it.js | 1 + assets/javascripts/lunr/lunr.jp.js | 1 + assets/javascripts/lunr/lunr.multi.js | 1 + assets/javascripts/lunr/lunr.no.js | 1 + assets/javascripts/lunr/lunr.pt.js | 1 + assets/javascripts/lunr/lunr.ro.js | 1 + assets/javascripts/lunr/lunr.ru.js | 1 + .../javascripts/lunr/lunr.stemmer.support.js | 1 + assets/javascripts/lunr/lunr.sv.js | 1 + assets/javascripts/lunr/lunr.tr.js | 1 + assets/javascripts/lunr/tinyseg.js | 1 + assets/javascripts/modernizr-e826f8942a.js | 1 + assets/stylesheets/application-04ea671600.css | 1 + .../application-23f75ab9c7.palette.css | 1 + index.html | 2858 +++++++++++++++++ mkdocs/js/lunr.min.js | 7 + mkdocs/js/mustache.min.js | 1 + mkdocs/js/require.js | 36 + mkdocs/js/search-results-template.mustache | 4 + mkdocs/js/search.js | 88 + mkdocs/js/text.js | 390 +++ mkdocs/search_index.json | 474 +++ mkdocs_theme.yml | 19 + sitemap.xml | 12 + 38 files changed, 4185 insertions(+) create mode 100644 .nojekyll create mode 100644 404.html create mode 100644 assets/images/favicon.ico create mode 100644 assets/images/icons/bitbucket-670608a71a.svg create mode 100644 assets/images/icons/github-1da075986e.svg create mode 100644 assets/images/icons/gitlab-5ad3f9f9e5.svg create mode 100644 assets/javascripts/application-946997f430.js create mode 100644 assets/javascripts/lunr/lunr.da.js create mode 100644 assets/javascripts/lunr/lunr.de.js create mode 100644 assets/javascripts/lunr/lunr.du.js create mode 100644 assets/javascripts/lunr/lunr.es.js create mode 100644 assets/javascripts/lunr/lunr.fi.js create mode 100644 assets/javascripts/lunr/lunr.fr.js create mode 100644 assets/javascripts/lunr/lunr.hu.js create mode 100644 assets/javascripts/lunr/lunr.it.js create mode 100644 assets/javascripts/lunr/lunr.jp.js create mode 100644 assets/javascripts/lunr/lunr.multi.js create mode 100644 assets/javascripts/lunr/lunr.no.js create mode 100644 assets/javascripts/lunr/lunr.pt.js create mode 100644 assets/javascripts/lunr/lunr.ro.js create mode 100644 assets/javascripts/lunr/lunr.ru.js create mode 100644 assets/javascripts/lunr/lunr.stemmer.support.js create mode 100644 assets/javascripts/lunr/lunr.sv.js create mode 100644 assets/javascripts/lunr/lunr.tr.js create mode 100644 assets/javascripts/lunr/tinyseg.js create mode 100644 assets/javascripts/modernizr-e826f8942a.js create mode 100644 assets/stylesheets/application-04ea671600.css create mode 100644 assets/stylesheets/application-23f75ab9c7.palette.css create mode 100644 index.html create mode 100644 mkdocs/js/lunr.min.js create mode 100644 mkdocs/js/mustache.min.js create mode 100644 mkdocs/js/require.js create mode 100644 mkdocs/js/search-results-template.mustache create mode 100644 mkdocs/js/search.js create mode 100644 mkdocs/js/text.js create mode 100644 mkdocs/search_index.json create mode 100644 mkdocs_theme.yml create mode 100644 sitemap.xml diff --git a/.nojekyll b/.nojekyll new file mode 100644 index 0000000..e69de29 diff --git a/404.html b/404.html new file mode 100644 index 0000000..0389dfe --- /dev/null +++ b/404.html @@ -0,0 +1,271 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Python 资源大全中文版 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ +
+ + + +
+
+ + +
+
+
+ +
+
+
+ + + +
+
+ +

404 - Not found

+ + + + +
+
+
+
+ + + + +
+ + + + + + + + + + + + \ No newline at end of file diff --git a/assets/images/favicon.ico b/assets/images/favicon.ico new file mode 100644 index 0000000000000000000000000000000000000000..e85006a3ce1c6fd81faa6d5a13095519c4a6fc96 GIT binary patch literal 1150 zcmd6lF-yZh9L1kl>(HSEK`2y^4yB6->f+$wD)=oNY!UheIt03Q=;qj=;8*Bap_4*& za8yAl;wmmx5Yyi^7dXN-WYdJ-{qNqpcez|5t#Fr0qTSYcPTG`I2PBk8r$~4kg^0zN zCJe(rhix3do!L$bZ+IuZ{i08x=JR3=e+M4pv0KsKA??{u_*EFfo|`p&t`Vf=jn{)F z1fKk9hWsmYwqWAP^JO*5u*R;*L&dX3H$%S7oB$f0{ISh{QVXuncnzN67WQH2`lip7 zhX+VI$6x$1+$8gMjh4+1l0N#8_0Fh=N#EwpKk{SeE!)SHFB@xQFX3y+8sF#_@!bDW eIdI-IC`$c%>bk?KbPeN9RHtL<1^)v~#xMt8oB^@` literal 0 HcmV?d00001 diff --git a/assets/images/icons/bitbucket-670608a71a.svg b/assets/images/icons/bitbucket-670608a71a.svg new file mode 100644 index 0000000..7d95cb2 --- /dev/null +++ b/assets/images/icons/bitbucket-670608a71a.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/assets/images/icons/github-1da075986e.svg b/assets/images/icons/github-1da075986e.svg new file mode 100644 index 0000000..3cacb2e --- /dev/null +++ b/assets/images/icons/github-1da075986e.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/assets/images/icons/gitlab-5ad3f9f9e5.svg b/assets/images/icons/gitlab-5ad3f9f9e5.svg new file mode 100644 index 0000000..b036a9b --- /dev/null +++ b/assets/images/icons/gitlab-5ad3f9f9e5.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/assets/javascripts/application-946997f430.js b/assets/javascripts/application-946997f430.js new file mode 100644 index 0000000..6438d93 --- /dev/null +++ b/assets/javascripts/application-946997f430.js @@ -0,0 +1 @@ +window.app=function(e){function t(r){if(n[r])return n[r].exports;var i=n[r]={i:r,l:!1,exports:{}};return e[r].call(i.exports,i,i.exports,t),i.l=!0,i.exports}var n={};return t.m=e,t.c=n,t.d=function(e,n,r){t.o(e,n)||Object.defineProperty(e,n,{configurable:!1,enumerable:!0,get:r})},t.n=function(e){var n=e&&e.__esModule?function(){return e.default}:function(){return e};return t.d(n,"a",n),n},t.o=function(e,t){return Object.prototype.hasOwnProperty.call(e,t)},t.p="",t(t.s=35)}([function(e,t,n){"use strict";var r=n(23)("wks"),i=n(14),o=n(1).Symbol,a="function"==typeof o;(e.exports=function(e){return r[e]||(r[e]=a&&o[e]||(a?o:i)("Symbol."+e))}).store=r},function(e,t,n){"use strict";var r=e.exports="undefined"!=typeof window&&window.Math==Math?window:"undefined"!=typeof self&&self.Math==Math?self:Function("return this")();"number"==typeof __g&&(__g=r)},function(e,t,n){"use strict";var r=n(10),i=n(25);e.exports=n(5)?function(e,t,n){return r.f(e,t,i(1,n))}:function(e,t,n){return e[t]=n,e}},function(e,t,n){"use strict";var r=n(11);e.exports=function(e){if(!r(e))throw TypeError(e+" is not an object!");return e}},function(e,t,n){"use strict";var r=n(1),i=n(2),o=n(6),a=n(14)("src"),s=Function.toString,c=(""+s).split("toString");n(7).inspectSource=function(e){return s.call(e)},(e.exports=function(e,t,n,s){var u="function"==typeof n;u&&(o(n,"name")||i(n,"name",t)),e[t]!==n&&(u&&(o(n,a)||i(n,a,e[t]?""+e[t]:c.join(String(t)))),e===r?e[t]=n:s?e[t]?e[t]=n:i(e,t,n):(delete e[t],i(e,t,n)))})(Function.prototype,"toString",function(){return"function"==typeof this&&this[a]||s.call(this)})},function(e,t,n){"use strict";e.exports=!n(24)(function(){return 7!=Object.defineProperty({},"a",{get:function(){return 7}}).a})},function(e,t,n){"use strict";var r={}.hasOwnProperty;e.exports=function(e,t){return r.call(e,t)}},function(e,t,n){"use strict";var r=e.exports={version:"2.4.0"};"number"==typeof __e&&(__e=r)},function(e,t,n){"use strict";e.exports={}},function(e,t,n){"use strict";var r={}.toString;e.exports=function(e){return r.call(e).slice(8,-1)}},function(e,t,n){"use strict";var r=n(3),i=n(38),o=n(39),a=Object.defineProperty;t.f=n(5)?Object.defineProperty:function(e,t,n){if(r(e),t=o(t,!0),r(n),i)try{return a(e,t,n)}catch(e){}if("get"in n||"set"in n)throw TypeError("Accessors not supported!");return"value"in n&&(e[t]=n.value),e}},function(e,t,n){"use strict";var r="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e};e.exports=function(e){return"object"===(void 0===e?"undefined":r(e))?null!==e:"function"==typeof e}},function(e,t,n){"use strict";var r=n(18);e.exports=function(e,t,n){if(r(e),void 0===t)return e;switch(n){case 1:return function(n){return e.call(t,n)};case 2:return function(n,r){return e.call(t,n,r)};case 3:return function(n,r,i){return e.call(t,n,r,i)}}return function(){return e.apply(t,arguments)}}},function(e,t,n){"use strict";var r=n(9),i=n(0)("toStringTag"),o="Arguments"==r(function(){return arguments}()),a=function(e,t){try{return e[t]}catch(e){}};e.exports=function(e){var t,n,s;return void 0===e?"Undefined":null===e?"Null":"string"==typeof(n=a(t=Object(e),i))?n:o?r(t):"Object"==(s=r(t))&&"function"==typeof t.callee?"Arguments":s}},function(e,t,n){"use strict";var r=0,i=Math.random();e.exports=function(e){return"Symbol(".concat(void 0===e?"":e,")_",(++r+i).toString(36))}},function(e,t,n){"use strict";var r=n(11),i=n(1).document,o=r(i)&&r(i.createElement);e.exports=function(e){return o?i.createElement(e):{}}},function(e,t,n){"use strict";var r=Math.ceil,i=Math.floor;e.exports=function(e){return isNaN(e=+e)?0:(e>0?i:r)(e)}},function(e,t,n){"use strict";e.exports=function(e){if(void 0==e)throw TypeError("Can't call method on "+e);return e}},function(e,t,n){"use strict";e.exports=function(e){if("function"!=typeof e)throw TypeError(e+" is not a function!");return e}},function(e,t,n){"use strict";var r=n(47),i=n(17);e.exports=function(e){return r(i(e))}},function(e,t,n){"use strict";var r=n(23)("keys"),i=n(14);e.exports=function(e){return r[e]||(r[e]=i(e))}},function(e,t,n){"use strict";var r=n(10).f,i=n(6),o=n(0)("toStringTag");e.exports=function(e,t,n){e&&!i(e=n?e:e.prototype,o)&&r(e,o,{configurable:!0,value:t})}},function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.default={createElement:function(e,t){var n=document.createElement(e);t&&Array.prototype.forEach.call(Object.keys(t),function(e){n.setAttribute(e,t[e])});for(var r=arguments.length,i=Array(r>2?r-2:0),o=2;o0?i(r(e),9007199254740991):0}},function(e,t,n){"use strict";e.exports="constructor,hasOwnProperty,isPrototypeOf,propertyIsEnumerable,toLocaleString,toString,valueOf".split(",")},function(e,t,n){"use strict";e.exports=n(1).document&&document.documentElement},function(e,t,n){"use strict";var r,i,o,a=n(12),s=n(63),c=n(31),u=n(15),l=n(1),f=l.process,h=l.setImmediate,d=l.clearImmediate,p=l.MessageChannel,m=0,y={},v=function(){var e=+this;if(y.hasOwnProperty(e)){var t=y[e];delete y[e],t()}},g=function(e){v.call(e.data)};h&&d||(h=function(e){for(var t=[],n=1;arguments.length>n;)t.push(arguments[n++]);return y[++m]=function(){s("function"==typeof e?e:Function(e),t)},r(m),m},d=function(e){delete y[e]},"process"==n(9)(f)?r=function(e){f.nextTick(a(v,e,1))}:p?(i=new p,o=i.port2,i.port1.onmessage=g,r=a(o.postMessage,o,1)):l.addEventListener&&"function"==typeof postMessage&&!l.importScripts?(r=function(e){l.postMessage(e+"","*")},l.addEventListener("message",g,!1)):r="onreadystatechange"in u("script")?function(e){c.appendChild(u("script")).onreadystatechange=function(){c.removeChild(this),v.call(e)}}:function(e){setTimeout(a(v,e,1),0)}),e.exports={set:h,clear:d}},function(e,t){(function(t){e.exports=t}).call(t,{})},function(e,t,n){"use strict";function r(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}var i=function(){function e(e,t){for(var n=0;n=t.length?{value:void 0,done:!0}:(e=r(t,n),this._i+=e.length,{value:e,done:!1})})},function(e,t,n){"use strict";var r=n(16),i=n(17);e.exports=function(e){return function(t,n){var o,a,s=String(i(t)),c=r(n),u=s.length;return c<0||c>=u?e?"":void 0:(o=s.charCodeAt(c),o<55296||o>56319||c+1===u||(a=s.charCodeAt(c+1))<56320||a>57343?e?s.charAt(c):o:e?s.slice(c,c+2):a-56320+(o-55296<<10)+65536)}}},function(e,t,n){"use strict";var r=n(43),i=n(25),o=n(21),a={};n(2)(a,n(0)("iterator"),function(){return this}),e.exports=function(e,t,n){e.prototype=r(a,{next:i(1,n)}),o(e,t+" Iterator")}},function(e,t,n){"use strict";var r=n(3),i=n(44),o=n(30),a=n(20)("IE_PROTO"),s=function(){},c=function(){var e,t=n(15)("iframe"),r=o.length;for(t.style.display="none",n(31).appendChild(t),t.src="javascript:",e=t.contentWindow.document,e.open(),e.write(" + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ +
+ + + +
+
+ + +
+
+
+ +
+
+
+ + +
+
+
+ + +
+
+
+ + +
+
+ + + +

Python 资源大全中文版

+

我想很多程序员应该记得 GitHub 上有一个 Awesome - XXX 系列的资源整理。awesome-python 是 vinta 发起维护的 Python 资源列表,内容包括:Web 框架、网络爬虫、网络内容提取、模板引擎、数据库、数据可视化、图片处理、文本处理、自然语言处理、机器学习、日志、代码分析等。由伯乐在线持续更新。

+

Awesome 系列虽然挺全,但基本只对收录的资源做了极为简要的介绍,如果有更详细的中文介绍,对相应开发者的帮助会更大。这也是我们发起这个开源项目的初衷。

+

我们要做什么?

+ +

如何为列表贡献新资源?

+

欢迎大家为列表贡献高质量的新资源,提交 PR 时请参照以下要求:

+
    +
  • 请确保推荐的资源自己使用过
  • +
  • 提交 PR 时请注明推荐理由
  • +
+

资源列表管理收到 PR 请求后,会定期(每周)在微博转发本周提交的 PR 列表,并在微博上面听取使用过这些资源的意见。确认通过后,会加入资源大全。

+

感谢您的贡献!

+

本项目的参与者

+ +

注:名单不分排名,不定期补充更新

+

环境管理

+

管理 Python 版本和环境的工具

+
    +
  • p:非常简单的交互式 python 版本管理工具。官网
  • +
  • pyenv:简单的 Python 版本管理工具。官网
  • +
  • Vex:可以在虚拟环境中执行命令。官网
  • +
  • virtualenv:创建独立 Python 环境的工具。官网
  • +
  • virtualenvwrapper:virtualenv 的一组扩展。官网
  • +
+

包管理

+

管理包和依赖的工具。

+
    +
  • pip:Python 包和依赖关系管理工具。官网
  • +
  • pip-tools:保证 Python 包依赖关系更新的一组工具。官网
  • +
  • pipenv:Pyhton 官方推荐的新一代包管理工具。官网
  • +
  • conda:跨平台,Python 二进制包管理工具。官网
  • +
  • Curdling:管理 Python 包的命令行工具。官网
  • +
  • wheel:Python 分发的新标准,意在取代 eggs。官网
  • +
+

包仓库

+

本地 PyPI 仓库服务和代理。

+
    +
  • warehouse:下一代 PyPI。官网
  • +
  • bandersnatch:PyPA 提供的 PyPI 镜像工具。官网
  • +
  • devpi:PyPI 服务和打包/测试/分发工具。官网
  • +
  • localshop:本地 PyPI 服务(自定义包并且自动对 PyPI 镜像)。官网
  • +
+

分发

+

打包为可执行文件以便分发。

+
    +
  • PyInstaller:将 Python 程序转换成独立的执行文件(跨平台)。官网
  • +
  • dh-virtualenv:构建并将 virtualenv 虚拟环境作为一个 Debian 包来发布。官网
  • +
  • Nuitka:将脚本、模块、包编译成可执行文件或扩展模块。官网
  • +
  • py2app:将 Python 脚本变为独立软件包(Mac OS X)。官网
  • +
  • py2exe:将 Python 脚本变为独立软件包(Windows)。官网
  • +
  • pynsist:一个用来创建 Windows 安装程序的工具,可以在安装程序中打包 Python 本身。官网
  • +
+

构建工具

+

将源码编译成软件。

+
    +
  • buildout:一个构建系统,从多个组件来创建,组装和部署应用。官网
  • +
  • BitBake:针对嵌入式 Linux 的类似 make 的构建工具。官网
  • +
  • fabricate:对任何语言自动找到依赖关系的构建工具。官网
  • +
  • PlatformIO:多平台命令行构建工具。官网
  • +
  • PyBuilder:纯 Python 实现的持续化构建工具。官网
  • +
  • SCons:软件构建工具。官网
  • +
+

交互式解析器

+

交互式 Python 解析器。

+
    +
  • IPython:功能丰富的工具,非常有效的使用交互式 Python。官网
  • +
  • bpython:界面丰富的 Python 解析器。官网
  • +
  • ptpython:高级交互式 Python 解析器, 构建于 python-prompt-toolkit 之上。官网
  • +
+

文件

+

文件管理和 MIME(多用途的网际邮件扩充协议)类型检测。

+
    +
  • aiofiles:基于 asyncio,提供文件异步操作。官网
  • +
  • imghdr:(Python 标准库)检测图片类型。官网
  • +
  • mimetypes:(Python 标准库)将文件名映射为 MIME 类型。官网
  • +
  • path.py:对 os.path 进行封装的模块。官网
  • +
  • pathlib:(Python3.4+ 标准库)跨平台的、面向对象的路径操作库。官网
  • +
  • python-magic:文件类型检测的第三方库 libmagic 的 Python 接口。官网
  • +
  • Unipath:用面向对象的方式操作文件和目录。官网
  • +
  • watchdog:管理文件系统事件的 API 和 shell 工具。官网
  • +
+

日期和时间

+

操作日期和时间的类库。

+
    +
  • arrow:更好的 Python 日期时间操作类库。官网
  • +
  • Chronyk:Python 3 的类库,用于解析手写格式的时间和日期。官网
  • +
  • dateutil:Python datetime 模块的扩展。官网
  • +
  • delorean:解决 Python 中有关日期处理的棘手问题的库。官网
  • +
  • maya:人性化的时间处理库。官网
  • +
  • moment:一个用来处理时间和日期的 Python 库。灵感来自于 Moment.js。官网
  • +
  • pendulum:一个比 arrow 更具有明确的,可预测的行为的时间操作库。官网
  • +
  • PyTime:一个简单易用的 Python 模块,用于通过字符串来操作日期/时间。官网
  • +
  • pytz:现代以及历史版本的世界时区定义。将时区数据库引入 Python。官网
  • +
  • when.py:提供用户友好的函数来帮助用户进行常用的日期和时间操作。官网
  • +
+

文本处理

+

用于解析和操作文本的库。

+
    +
  • 通用
      +
    • chardet:字符编码检测器,兼容 Python2 和 Python3。官网
    • +
    • difflib:(Python 标准库)帮助我们进行差异化比较。官网
    • +
    • ftfy:让 Unicode 文本更完整更连贯。官网
    • +
    • fuzzywuzzy:模糊字符串匹配。官网
    • +
    • Levenshtein:快速计算编辑距离以及字符串的相似度。官网
    • +
    • pangu.py:在中日韩语字符和数字字母之间添加空格。官网
    • +
    • pypinyin:汉字拼音转换工具 Python 版。官网
    • +
    • shortuuid:一个生成器库,用以生成简洁的,明白的,URL 安全的 UUID。官网
    • +
    • simplejson:Python 的 JSON 编码、解码器。官网
    • +
    • unidecode:Unicode 文本的 ASCII 转换形式 。官网
    • +
    • uniout:打印可读的字符,而不是转义的字符串。官网
    • +
    • xpinyin:一个用于把汉字转换为拼音的库。官网
    • +
    • yfiglet-figlet:pyfiglet -figlet 的 Python 实现。
    • +
    +
  • +
  • Slug 化
      +
    • awesome-slugify:一个 Python slug 化库,可以保持 Unicode。官网
    • +
    • python-slugify:Python slug 化库,可以把 unicode 转化为 ASCII。官网
    • +
    • unicode-slugify:一个 slug 工具,可以生成 unicode slugs ,需要依赖 Django 。官网
    • +
    +
  • +
  • 解析器
      +
    • phonenumbers:解析,格式化,储存,验证电话号码。官网
    • +
    • PLY:lex 和 yacc 解析工具的 Python 实现。官网
    • +
    • Pygments:通用语法高亮工具。官网
    • +
    • pyparsing:生成通用解析器的框架。官网
    • +
    • python-nameparser:把一个人名分解为几个独立的部分。官网
    • +
    • python-user-agents:浏览器 user agent 解析器。官网
    • +
    • sqlparse:一个无验证的 SQL 解析器。官网
    • +
    +
  • +
+

特殊文本格式处理

+

一些用来解析和操作特殊文本格式的库。

+
    +
  • 通用
      +
    • tablib:一个用来处理中表格数据的模块。官网
    • +
    +
  • +
  • Office
      +
    • Marmir:把输入的 Python 数据结构转换为电子表单。官网
    • +
    • openpyxl:一个用来读写 Excel 2010 xlsx/xlsm/xltx/xltm 文件的库。官网
    • +
    • pyexcel:一个提供统一 API,用来读写,操作 Excel 文件的库。官网
    • +
    • python-docx:读取,查询以及修改 Microsoft Word 2007/2008 docx 文件。官网
    • +
    • relatorio:模板化 OpenDocument 文件。官网
    • +
    • unoconv:在 LibreOffice/OpenOffice 支持的任意文件格式之间进行转换。官网
    • +
    • XlsxWriter:一个用于创建 Excel .xlsx 文件的 Python 模块。官网
    • +
    • xlwings:一个使得在 Excel 中方便调用 Python 的库(反之亦然),基于 BSD 协议。官网
    • +
    • xlwt:读写 Excel 文件的数据和格式信息。官网 / xlrd
    • +
    +
  • +
  • PDF
      +
    • PDFMiner:一个用于从 PDF 文档中抽取信息的工具。官网
    • +
    • PyPDF2:一个可以分割,合并和转换 PDF 页面的库。官网
    • +
    • ReportLab:快速创建富文本 PDF 文档。官网
    • +
    +
  • +
  • Markdown
      +
    • Mistune:快速并且功能齐全的纯 Python 实现的 Markdown 解析器。官网
    • +
    • Python-Markdown:John Gruber’s Markdown 的 Python 版实现。官网
    • +
    • Python-Markdown2:纯 Python 实现的 Markdown 解析器,比 Python-Markdown 更快,更准确,可扩展。官网
    • +
    +
  • +
  • YAML
      +
    • PyYAML:Python 版本的 YAML 解析器。官网
    • +
    +
  • +
  • CSV
      +
    • csvkit:用于转换和操作 CSV 的工具。官网
    • +
    +
  • +
  • Archive
      +
    • unp:一个用来方便解包归档文件的命令行工具。官网
    • +
    +
  • +
+

自然语言处理

+

用来处理人类语言的库。

+
    +
  • NLTK:一个先进的平台,用以构建处理人类语言数据的 Python 程序。官网
  • +
  • jieba:中文分词工具。官网
  • +
  • langid.py:独立的语言识别系统。官网
  • +
  • Pattern:Python 网络信息挖掘模块。官网
  • +
  • SnowNLP:一个用来处理中文文本的库。官网
  • +
  • TextBlob:为进行普通自然语言处理任务提供一致的 API。官网
  • +
  • TextGrocery:一简单高效的短文本分类工具,基于 LibLinear 和 Jieba。官网
  • +
  • thulac:清华大学自然语言处理与社会人文计算实验室研制推出的一套中文词法分析工具包官网
  • +
+

文档

+

用以生成项目文档的库。

+
    +
  • Sphinx:Python 文档生成器。官网
  • +
  • awesome-sphinxdoc:官网
  • +
  • MkDocs:对 Markdown 友好的文档生成器。官网
  • +
  • pdoc:一个可以替换 Epydoc 的库,可以自动生成 Python 库的 API 文档。官网
  • +
  • Pycco:文学编程(literate-programming)风格的文档生成器。官网
  • +
  • readthedocs:一个基于 Sphinx/MkDocs 的在线文档托管系统,对开源项目免费开放使用。官网
  • +
+

配置

+

用来保存和解析配置的库。

+
    +
  • config:logging 模块作者写的分级配置模块。官网
  • +
  • ConfigObj:INI 文件解析器,带验证功能。官网
  • +
  • ConfigParser:(Python 标准库) INI 文件解析器。官网
  • +
  • profig:通过多种格式进行配置,具有数值转换功能。官网
  • +
  • python-decouple:将设置和代码完全隔离。官网
  • +
+

命令行工具

+

用于创建命令行程序的库。

+
    +
  • 命令行程序开发
      +
    • asciimatics:跨平台,全屏终端包(即鼠标/键盘输入和彩色,定位文本输出),完整的复杂动画和特殊效果的高级 API。官网
    • +
    • cement:Python 的命令行程序框架。官网
    • +
    • click:一个通过组合的方式来创建精美命令行界面的包。官网
    • +
    • cliff:一个用于创建命令行程序的框架,可以创建具有多层命令的命令行程序。官网
    • +
    • clint:Python 命令行程序工具。官网
    • +
    • colorama:跨平台彩色终端文本。官网
    • +
    • docopt:Python 风格的命令行参数解析器。官网
    • +
    • Gooey:一条命令,将命令行程序变成一个 GUI 程序。官网
    • +
    • python-prompt-toolkit:一个用于构建强大的交互式命令行程序的库。官网
    • +
    • python-fire:Google 出品的一个基于 Python 类的构建命令行界面的库。官网
    • +
    • Pythonpy:在命令行中直接执行任何 Python 指令。官网
    • +
    +
  • +
  • 生产力工具
      +
    • aws-cli:Amazon Web Services 的通用命令行界面。官网
    • +
    • bashplotlib:在终端中进行基本绘图。官网
    • +
    • caniusepython3:判断是哪个项目妨碍你你移植到 Python3。官网
    • +
    • cookiecutter:从 cookiecutters(项目模板)创建项目的一个命令行工具。官网
    • +
    • doitlive:一个用来在终端中进行现场演示的工具。官网
    • +
    • pyftpdlib:一个速度极快和可扩展的 Python FTP 服务库。官网
    • +
    • howdoi:通过命令行获取即时的编程问题解答。官网
    • +
    • httpie:一个命令行 HTTP 客户端,cURL 的替代品,易用性更好。官网
    • +
    • PathPicker:从 bash 输出中选出文件。官网
    • +
    • percol:向 UNIX shell 传统管道概念中加入交互式选择功能。官网
    • +
    • SAWS:一个加强版的 AWS 命令行。官网
    • +
    • thefuck:修正你之前的命令行指令。官网
    • +
    • mycli:一个 MySQL 命令行客户端,具有自动补全和语法高亮功能。官网
    • +
    • pgcli:Postgres 命令行工具,具有自动补全和语法高亮功能。官网
    • +
    • try:一个从来没有更简单的命令行工具,用来试用 python 库。官网
    • +
    +
  • +
+

下载器

+

用来进行下载的库.

+
    +
  • s3cmd:一个用来管理 Amazon S3 和 CloudFront 的命令行工具。官网
  • +
  • s4cmd:超级 S3 命令行工具,性能更加强劲。官网
  • +
  • you-get:一个 YouTube/Youku/Niconico 视频下载器,使用 Python3 编写。官网
  • +
  • youtube-dl:一个小巧的命令行程序,用来下载 YouTube 视频。官网
  • +
+

图像处理

+

用来操作图像的库.

+
    +
  • pillow:Pillow 是一个更加易用版的 PIL官网
  • +
  • hmap:图像直方图映射。官网
  • +
  • imgSeek:一个使用视觉相似性搜索一组图片集合的项目。官网
  • +
  • nude.py:裸体检测。官网
  • +
  • pyBarcode:不借助 PIL 库在 Python 程序中生成条形码。官网
  • +
  • pygram:类似 Instagram 的图像滤镜。官网
  • +
  • python-qrcode:一个纯 Python 实现的二维码生成器。官网
  • +
  • Quads:基于四叉树的计算机艺术。官网
  • +
  • scikit-image:一个用于(科学)图像处理的 Python 库。官网
  • +
  • thumbor:一个小型图像服务,具有剪裁,尺寸重设和翻转功能。官网
  • +
  • wand:MagickWand的 Python 绑定。MagickWand 是 ImageMagick 的 C API 。官网
  • +
  • face_recognition:简单易用的 python 人脸识别库。官网
  • +
+

OCR

+

光学字符识别库。

+ +

音频

+

用来操作音频的库

+
    +
  • audiolazy:Python 的数字信号处理包。官网
  • +
  • audioread:交叉库 (GStreamer + Core Audio + MAD + FFmpeg) 音频解码。官网
  • +
  • beets:一个音乐库管理工具及 MusicBrainz 标签添加工具。官网
  • +
  • dejavu:音频指纹提取和识别。官网
  • +
  • django-elastic-transcoder:Django + Amazon Elastic Transcoder官网
  • +
  • eyeD3:一个用来操作音频文件的工具,具体来讲就是包含 ID3 元信息的 MP3 文件。官网
  • +
  • id3reader:一个用来读取 MP3 元数据的 Python 模块。官网
  • +
  • m3u8:一个用来解析 m3u8 文件的模块。官网
  • +
  • mutagen:一个用来处理音频元数据的 Python 模块。官网
  • +
  • pydub:通过简单、简洁的高层接口来操作音频文件。官网
  • +
  • pyechonest:Echo Nest API 的 Python 客户端。官网
  • +
  • talkbox:一个用来处理演讲/信号的 Python 库。官网
  • +
  • TimeSide:开源 web 音频处理框架。官网
  • +
  • tinytag:一个用来读取 MP3, OGG, FLAC 以及 Wave 文件音乐元数据的库。官网
  • +
  • mingus:一个高级音乐理论和曲谱包,支持 MIDI 文件和回放功能。官网
  • +
+

Video

+

用来操作视频和 GIF 的库。

+
    +
  • moviepy:一个用来进行基于脚本的视频编辑模块,适用于多种格式,包括动图 GIFs。官网
  • +
  • scikit-video:SciPy 视频处理常用程序。官网
  • +
+

地理位置

+

地理编码地址以及用来处理经纬度的库。

+
    +
  • GeoDjango:世界级地理图形 web 框架。官网
  • +
  • GeoIP:MaxMind GeoIP Legacy 数据库的 Python API。官网
  • +
  • geojson:GeoJSON 的 Python 绑定及工具。官网
  • +
  • geopy:Python 地址编码工具箱。官网
  • +
  • pygeoip:纯 Python GeoIP API。官网
  • +
  • django-countries:一个 Django 应用程序,提供用于表格的国家选择功能,国旗图标静态文件以及模型中的国家字段。官网
  • +
+

HTTP

+

使用 HTTP 的库。 + aiohttp:基于 asyncio 的异步 HTTP 网络库。官网 + requests:人性化的 HTTP 请求库。官网 + grequests:requests 库 + gevent ,用于异步 HTTP 请求.官网 + httplib2:全面的 HTTP 客户端库。官网 + treq:类似 requests 的 Python API 构建于 Twisted HTTP 客户端之上。官网 + urllib3:一个具有线程安全连接池,支持文件 post,清晰友好的 HTTP 库。官网

+

数据库

+

Python 实现的数据库。

+
    +
  • pickleDB:一个简单,轻量级键值储存数据库。官网
  • +
  • PipelineDB:流式 SQL 数据库。官网
  • +
  • TinyDB:一个微型的,面向文档型数据库。官网
  • +
  • ZODB:一个 Python 原生对象数据库。一个键值和对象图数据库。官网
  • +
+

数据库驱动

+

用来连接和操作数据库的库。

+
    +
  • MySQL:awesome-mysql 系列
      +
    • aiomysql:基于 asyncio 的异步 MySQL 数据库操作库。官网
    • +
    • mysql-python:Python 的 MySQL 数据库连接器。官网
    • +
    • ysqlclient:mysql-python 分支,支持 Python 3。
    • +
    • oursql:一个更好的 MySQL 连接器,支持原生预编译指令和 BLOBs。官网
    • +
    • PyMySQL:纯 Python MySQL 驱动,兼容 mysql-python。官网
    • +
    +
  • +
  • PostgreSQL
      +
    • psycopg2:Python 中最流行的 PostgreSQL 适配器。官网
    • +
    • queries:psycopg2 库的封装,用来和 PostgreSQL 进行交互。官网
    • +
    • txpostgres:基于 Twisted 的异步 PostgreSQL 驱动。官网
    • +
    +
  • +
  • 其他关系型数据库
      +
    • apsw:另一个 Python SQLite 封装。官网
    • +
    • dataset:在数据库中存储 Python 字典
    • +
    • pymssql:一个简单的 Microsoft SQL Server 数据库接口。官网
    • +
    +
  • +
  • NoSQL 数据库
      +
    • cassandra-python-driver:Cassandra 的 Python 驱动。官网
    • +
    • HappyBase:一个为 Apache HBase 设计的,对开发者友好的库。官网
    • +
    • Plyvel:一个快速且功能丰富的 LevelDB 的 Python 接口。官网
    • +
    • py2neo:Neo4j restful 接口的 Python 封装客户端。官网
    • +
    • pycassa:Cassandra 的 Python Thrift 驱动。官网
    • +
    • PyMongo:MongoDB 的官方 Python 客户端。官网
    • +
    • redis-py:Redis 的 Python 客户端。官网
    • +
    • telephus:基于 Twisted 的 Cassandra 客户端。官网
    • +
    • txRedis:基于 Twisted 的 Redis 客户端。官网
    • +
    +
  • +
+

ORM

+

实现对象关系映射或数据映射技术的库。

+
    +
  • 关系型数据库
      +
    • Django Models:Django 的一部分。官网
    • +
    • SQLAlchemy:Python SQL 工具以及对象关系映射工具。官网 +
    • +
    • Peewee:一个小巧,富有表达力的 ORM。官网
    • +
    • PonyORM:提供面向生成器的 SQL 接口的 ORM。官网
    • +
    • python-sql:编写 Python 风格的 SQL 查询。官网
    • +
    +
  • +
  • NoSQL 数据库
      +
    • django-mongodb-engine:Django MongoDB 后端。官网
    • +
    • PynamoDB:Amazon DynamoDB 的一个 Python 风格接口。官网
    • +
    • flywheel:Amazon DynamoDB 的对象映射工具。官网
    • +
    • MongoEngine:一个 Python 对象文档映射工具,用于 MongoDB。官网
    • +
    • hot-redis:为 Redis 提供 Python 丰富的数据类型。官网
    • +
    • redisco:一个 Python 库,提供可以持续存在在 Redis 中的简单模型和容器。官网
    • +
    +
  • +
  • 其他
      +
    • butterdb:Google Drive 电子表格的 Python ORM。官网
    • +
    +
  • +
+

Web 框架

+

全栈 Web 框架。

+
    +
  • Django:Python 界最流行的 web 框架。官网 +
  • +
  • Flask:一个 Python 微型框架。官网 +
  • +
  • pyramid:一个小巧,快速,接地气的开源 Python web 框架。 +
  • +
  • Bottle:一个快速小巧,轻量级的 WSGI 微型 web 框架。官网
  • +
  • CherryPy:一个极简的 Python web 框架,服从 HTTP/1.1 协议且具有 WSGI 线程池。官网
  • +
  • TurboGears:一个可以扩展为全栈解决方案的微型框架。官网
  • +
  • web.py:一个 Python 的 web 框架,既简单,又强大。官网
  • +
  • web2py:一个全栈 web 框架和平台,专注于简单易用。官网
  • +
  • Tornado:一个 web 框架和异步网络库。官网
  • +
  • sanic:基于 Python3.5+ 的异步网络框架。官网
  • +
+

权限

+

允许或拒绝用户访问数据或功能的库。

+
    +
  • Carteblanche:站在用户和设计者角度开发的一个代码对齐模块,很好地处理了代码导航及权限。官网
  • +
  • django-guardian:Django 1.2+ 实现了单个对象权限。官网
  • +
  • django-rules:一个小巧但是强大的应用,提供对象级别的权限管理,且不需要使用数据库。官网
  • +
+

CMS

+

内容管理系统

+
    +
  • odoo-cms: 一个开源的,企业级 CMS,基于 odoo。官网
  • +
  • django-cms:一个开源的,企业级 CMS,基于 Django。官网
  • +
  • djedi-cms:一个轻量级但却非常强大的 Django CMS ,考虑到了插件,内联编辑以及性能。官网
  • +
  • FeinCMS:基于 Django 构建的最先进的内容管理系统之一。官网
  • +
  • Kotti:一个高级的,Python 范的 web 应用框架,基于 Pyramid 构建。官网
  • +
  • Mezzanine:一个强大的,持续的,灵活的内容管理平台。官网
  • +
  • Opps:一个为杂志,报纸网站以及大流量门户网站设计的 CMS 平台,基于 Django。官网
  • +
  • Plone:一个构建于开源应用服务器 Zope 之上的 CMS。官网
  • +
  • Quokka:灵活,可扩展的小型 CMS,基于 Flask 和 MongoDB。官网
  • +
  • Wagtail:一个 Django 内容管理系统。官网
  • +
  • Widgy:最新的 CMS 框架,基于 Django。官网
  • +
+

电子商务

+

用于电子商务以及支付的框架和库。

+
    +
  • django-oscar:一个用于 Django 的开源的电子商务框架。官网
  • +
  • django-shop:一个基于 Django 的店铺系统。官网
  • +
  • Cartridge:一个基于 Mezzanine 构建的购物车应用。官网
  • +
  • shoop:一个基于 Django 的开源电子商务平台。官网
  • +
  • alipay:非官方的 Python 支付宝 API。官网
  • +
  • merchant:一个可以接收来自多种支付平台支付的 Django 应用。官网
  • +
  • money:一个货币类库。带有可选的 CLDR 后端本地化格式,提供可扩展的货币兑换解决方案。官网
  • +
  • python-currencies:显示货币格式以及它的数值。官网
  • +
+

RESTful API

+

用来开发 RESTful APIs 的库

+
    +
  • Django
      +
    • django-rest-framework:一个强大灵活的工具,用来构建 web API。官网
    • +
    • django-tastypie:为 Django 应用开发 API。官网
    • +
    • django-formapi:为 Django 的表单验证,创建 JSON APIs 。官网
    • +
    +
  • +
  • Flask
      +
    • flask-api:为 flask 开发的,可浏览 Web APIs 。官网
    • +
    • flask-restful:为 flask 快速创建 REST APIs 。官网
    • +
    • flask-restless:为 SQLAlchemy 定义的数据库模型创建 RESTful APIs 。官网
    • +
    • flask-api-utils:为 Flask 处理 API 表示和验证。官网
    • +
    • eve:REST API 框架,由 Flask, MongoDB 等驱动。官网
    • +
    +
  • +
  • Pyramid
      +
    • cornice:一个 Pyramid 的 REST 框架 。官网
    • +
    +
  • +
  • 与框架无关的
      +
    • falcon:一个用来建立云 API 和 web app 后端的高性能框架。官网
    • +
    • sandman:为现存的数据库驱动系统自动创建 REST APIs 。官网
    • +
    • restless:框架无关的 REST 框架 ,基于从 Tastypie 学到的知识。官网
    • +
    • ripozo:快速创建 REST/HATEOAS/Hypermedia APIs。官网
    • +
    +
  • +
+

验证

+

实现验证方案的库。

+
    +
  • OAuth
      +
    • Authomatic:简单但是强大的框架,身份验证/授权客户端。官网
    • +
    • django-allauth:Django 的验证应用。官网
    • +
    • django-oauth-toolkit:为 Django 用户准备的 OAuth2。官网
    • +
    • django-oauth2-provider:为 Django 应用提供 OAuth2 接入。官网
    • +
    • Flask-OAuthlib:OAuth 1.0/a, 2.0 客户端实现,供 Flask 使用。官网
    • +
    • OAuthLib:一个 OAuth 请求-签名逻辑通用、 完整的实现。官网
    • +
    • python-oauth2:一个完全测试的抽象接口。用来创建 OAuth 客户端和服务端。官网
    • +
    • python-social-auth:一个设置简单的社会化验证方式。官网
    • +
    • rauth:OAuth 1.0/a, 2.0, 和 Ofly 的 Python 库。官网
    • +
    • sanction:一个超级简单的 OAuth2 客户端实现。官网
    • +
    +
  • +
  • 其他
      +
    • jose:JavaScript 对象签名和加密草案的实现。官网
    • +
    • PyJWT:JSON Web 令牌草案 01。官网
    • +
    • python-jws:JSON Web 签名草案 02 的实现。官网
    • +
    • python-jwt:一个用来生成和验证 JSON Web 令牌的模块。官网
    • +
    +
  • +
+

模板引擎

+

模板生成和词法解析的库和工具。

+
    +
  • Jinja2:一个现代的,对设计师友好的模板引擎。官网
  • +
  • Chameleon:一个 HTML/XML 模板引擎。 模仿了 ZPT(Zope Page Templates), 进行了速度上的优化。官网
  • +
  • Genshi:Python 模板工具,用以生成 web 感知的结果。官网
  • +
  • Mako:Python 平台的超高速轻量级模板。官网
  • +
+

队列

+

处理事件以及任务队列的库。

+
    +
  • celery:一个异步任务队列/作业队列,基于分布式消息传递。官网
  • +
  • huey:小型多线程任务队列。官网
  • +
  • mrq:Mr. Queue -一个 Python 的分布式 worker 任务队列, 使用 Redis 和 gevent。官网
  • +
  • rq:简单的 Python 作业队列。官网
  • +
  • simpleq:一个简单的,可无限扩张的,基于亚马逊 SQS 的队列。官网
  • +
+

搜索

+

对数据进行索引和执行搜索查询的库和软件。

+
    +
  • django-haystack:Django 模块化搜索。官网
  • +
  • elasticsearch-py:Elasticsearch 的官方底层 Python 客户端。官网
  • +
  • elasticsearch-dsl-py:Elasticsearch 的官方高级 Python 客户端。官网
  • +
  • solrpy:solr 的 Python 客户端。官网
  • +
  • Whoosh:一个快速的纯 Python 搜索引擎库。官网
  • +
+

动态消息

+

用来创建用户活动的库。

+
    +
  • django-activity-stream:从你的站点行为中生成通用活动信息流。官网
  • +
  • Stream-Framework:使用 Cassandra 和 Redis 创建动态消息和通知系统。官网
  • +
+

资源管理

+

管理、压缩、缩小网站资源的工具。

+
    +
  • django-compressor:将链接和内联的 JavaScript 或 CSS 压缩到一个单独的缓存文件中。官网
  • +
  • django-storages:一个针对 Django 的自定义存储后端的工具集合。官网
  • +
  • fanstatic:打包、优化,并且把静态文件依赖作为 Python 的包来提供。官网
  • +
  • File Conveyor:一个后台驻留的程序,用来发现和同步文件到 CDNs, S3 和 FTP。官网
  • +
  • Flask-Assets:帮你将 web 资源整合到你的 Flask app 中。官网
  • +
  • jinja-assets-compressor:一个 Jinja 扩展,用来编译和压缩你的资源。官网
  • +
  • webassets:为你的静态资源打包、优化和管理生成独一无二的缓存 URL。官网
  • +
+

缓存

+

缓存数据的库。

+
    +
  • Beaker:一个缓存和会话库,可以用在 web 应用和独立 Python 脚本和应用上。官网
  • +
  • django-cache-machine:Django 模型的自动缓存和失效。官网
  • +
  • django-cacheops:具有自动颗粒化事件驱动失效功能的 ORM。官网
  • +
  • django-viewlet:渲染模板,同时具有额外的缓存控制功能。官网
  • +
  • dogpile.cache:dogpile.cache 是 Beaker 的下一代替代品,由同一作者开发。官网
  • +
  • HermesCache:Python 缓存库,具有基于标签的失效和 dogpile effect 保护功能。官网
  • +
  • johnny-cache:django 应用缓存框架。官网
  • +
  • pylibmc:libmemcached 接口的 Python 封装。官网
  • +
+

电子邮件

+

用来发送和解析电子邮件的库。

+
    +
  • django-celery-ses:带有 AWS SES 和 Celery 的 Django email 后端。官网
  • +
  • envelopes:供人类使用的电子邮件库。官网
  • +
  • flanker:一个 email 地址和 Mime 解析库。官网
  • +
  • imbox:Python IMAP 库。官网
  • +
  • inbox.py:Python SMTP 服务器。官网
  • +
  • inbox:一个开源电子邮件工具箱。官网
  • +
  • lamson:Python 风格的 SMTP 应用服务器。官网
  • +
  • mailjet:Mailjet API 实现,用来提供批量发送邮件,统计等功能。官网
  • +
  • marrow.mailer:高性能可扩展邮件分发框架。官网
  • +
  • modoboa:一个邮件托管和管理平台,具有现代的、简约的 Web UI。官网
  • +
  • pyzmail:创建,发送和解析电子邮件。官网
  • +
  • Talon:Mailgun 库,用来抽取信息和签名。官网
  • +
+

国际化

+

用来进行国际化的库。

+
    +
  • Babel:一个 Python 的国际化库。官网
  • +
  • Korean:一个韩语词态库。官网
  • +
+

URL 处理

+

解析 URLs 的库

+
    +
  • furl:一个让处理 URL 更简单小型 Python 库。官网
  • +
  • purl:一个简单的,不可变的 URL 类,具有简洁的 API 来进行询问和处理。官网
  • +
  • pyshorteners:一个纯 Python URL 缩短库。官网
  • +
  • shorturl:生成短小 URL 和类似 bit.ly 短链的 Python 实现。官网
  • +
  • webargs:一个解析 HTTP 请求参数的库,内置对流行 web 框架的支持,包括 Flask, Django, Bottle, Tornado 和 Pyramid。官网
  • +
+

HTML 处理

+

处理 HTML 和 XML 的库。

+
    +
  • BeautifulSoup:以 Python 风格的方式来对 HTML 或 XML 进行迭代,搜索和修改。官网
  • +
  • bleach:一个基于白名单的 HTML 清理和文本链接库。官网
  • +
  • cssutils:一个 Python 的 CSS 库。官网
  • +
  • html5lib:一个兼容标准的 HTML 文档和片段解析及序列化库。官网
  • +
  • lxml:一个非常快速,简单易用,功能齐全的库,用来处理 HTML 和 XML。官网
  • +
  • MarkupSafe:为 Python 实现 XML/HTML/XHTML 标记安全字符串。官网
  • +
  • pyquery:一个解析 HTML 的库,类似 jQuery。官网
  • +
  • requests-html:人性化的,Pythonic 的 HTML 解析库。官网
  • +
  • untangle:将 XML 文档转换为 Python 对象,使其可以方便的访问。官网
  • +
  • xhtml2pdf:HTML/CSS 转 PDF 工具。官网
  • +
  • xmltodict:像处理 JSON 一样处理 XML。官网
  • +
+

爬取网络站点的库

+
    +
  • Scrapy:一个快速高级的屏幕爬取及网页采集框架。官网
  • +
  • cola:一个分布式爬虫框架。官网
  • +
  • Demiurge:基于 PyQuery 的爬虫微型框架。官网
  • +
  • feedparser:通用 feed 解析器。官网
  • +
  • Grab:站点爬取框架。官网
  • +
  • MechanicalSoup:用于自动和网络站点交互的 Python 库。官网
  • +
  • portia:Scrapy 可视化爬取。官网
  • +
  • pyspider:一个强大的爬虫系统。官网
  • +
  • RoboBrowser:一个简单的,Python 风格的库,用来浏览网站,而不需要一个独立安装的浏览器。官网
  • +
+

网页内容提取

+

用于进行网页内容提取的库。

+
    +
  • Haul:一个可以扩展的图像爬取工具。官网
  • +
  • html2text:将 HTML 转换为 Markdown 格式文本。官网
  • +
  • lassie:人性化的网页内容检索库。官网
  • +
  • micawber:一个小型网页内容提取库,用来从 URLs 提取富内容。官网
  • +
  • newspaper:使用 Python 进行新闻提取,文章提取以及内容策展。官网
  • +
  • opengraph:一个用来解析开放内容协议(Open Graph Protocol)的 Python 模块。官网
  • +
  • python-goose:HTML 内容/文章提取器。官网
  • +
  • python-readability:arc90 公司 readability 工具的 Python 高速端口。官网
  • +
  • sanitize:为杂乱的数据世界带来调理性。官网
  • +
  • sumy:一个为文本文件和 HTML 页面进行自动摘要的模块。官网
  • +
  • textract:从任何格式的文档中提取文本,Word,PowerPoint,PDFs 等等。官网
  • +
+

表单

+

进行表单操作的库。

+
    +
  • Deform:Python HTML 表单生成库,受到了 formish 表单生成库的启发。官网
  • +
  • django-bootstrap3:集成了 Bootstrap 3 的 Django。官网
  • +
  • django-crispy-forms:一个 Django 应用,他可以让你以一种非常优雅且 DRY(Don't repeat yourself) 的方式来创建美观的表单。官网
  • +
  • django-remote-forms:一个平台独立的 Django 表单序列化工具。官网
  • +
  • WTForms:一个灵活的表单验证和呈现库。官网
  • +
  • WTForms-JSON:一个 WTForms 扩展,用来处理 JSON 数据。官网
  • +
+

数据验证

+

数据验证库。多用于表单验证。

+
    +
  • Cerberus:一个映射验证器(mappings-validator)。支持多种规则,提供归一化功能,可以方便地定制为 Python 风格的 schema 定义。官网
  • +
  • colander:一个用于对从 XML, JSON,HTML 表单获取的数据或其他同样简单的序列化数据进行验证和反序列化的系统。官网
  • +
  • kmatch:一种用于匹配/验证/筛选 Python 字典的语言。官网
  • +
  • schema:一个用于对 Python 数据结构进行验证的库。官网
  • +
  • Schematics:数据结构验证。官网
  • +
  • valideer:轻量级可扩展的数据验证和适配库。官网
  • +
  • voluptuous:一个 Python 数据验证库。主要是为了验证传入 Python 的 JSON,YAML 等数据。官网
  • +
+

反垃圾技术

+

帮助你和电子垃圾进行战斗的库。

+
    +
  • django-simple-captcha:一个简单、高度可定制的 Django 应用,可以为任何 Django 表单添加验证码。官网
  • +
  • django-simple-spam-blocker:一个用于 Django 的简单的电子垃圾屏蔽工具。官网
  • +
+

标记

+

用来进行标记的库。

+
    +
  • django-taggit:简单的 Django 标记工具。官网
  • +
+

管理面板

+

管理界面库。

+
    +
  • Ajenti:一个你的服务器值得拥有的管理面板。官网
  • +
  • django-suit:Django 管理界面的一个替代品 (仅对于非商业用途是免费的)。官网
  • +
  • django-xadmin:Django admin 的一个替代品,具有很多不错的功能。官网
  • +
  • flask-admin:一个用于 Flask 的简单可扩展的管理界面框架。官网
  • +
  • flower:一个对 Celery 集群进行实时监控和提供 web 管理界面的工具。官网
  • +
  • Grappelli:Django 管理界面的一个漂亮的皮肤。官网
  • +
  • Wooey:一个 Django 应用,可以为 Python 脚本创建 web 用户界面。官网
  • +
+

静态站点生成器

+

静态站点生成器是一个软件,它把文本和模板作为输入,然后输出 HTML 文件。

+
    +
  • Pelican:使用 Markdown 或 ReST 来处理内容, Jinja 2 来制作主题。支持 DVCS, Disqus.。AGPL 许可。官网
  • +
  • Cactus:为设计师设计的静态站点生成器。官网
  • +
  • Hyde:基于 Jinja2 的静态站点生成器。官网
  • +
  • Nikola:一个静态网站和博客生成器。官网
  • +
  • Tinkerer:Tinkerer 是一个博客引擎/静态站点生成器,由 Sphinx 驱动。官网
  • +
  • Lektor:一个简单易用的静态 CMS 和博客引擎。官网
  • +
+

进程

+

操作系统进程启动及通信库。

+
    +
  • envoy:比 Python subprocess 模块更人性化。官网
  • +
  • sarge:另一 种 subprocess 模块的封装。官网
  • +
  • sh:一个完备的 subprocess 替代库。官网
  • +
+

并发和并行

+

用以进行并发和并行操作的库。

+
    +
  • multiprocessing:(Python 标准库) 基于进程的“线程”接口。官网
  • +
  • threading:(Python 标准库)更高层的线程接口。官网
  • +
  • eventlet:支持 WSGI 的异步框架。官网
  • +
  • gevent:一个基于协程的 Python 网络库,使用 greenlet官网
  • +
  • Tomorrow:用于产生异步代码的神奇的装饰器语法实现。官网
  • +
  • uvloop:在 libuv 之上超快速实现 asyncio 事件循环。官网
  • +
+

网络

+

用于网络编程的库。

+
    +
  • asyncio:(Python 标准库) 异步 I/O, 事件循环, 协程以及任务。官网
  • +
  • Twisted:一个事件驱动的网络引擎。官网
  • +
  • pulsar:事件驱动的并发框架。官网
  • +
  • diesel:基于 Greenlet 的事件 I/O 框架。官网
  • +
  • pyzmq:一个 ZeroMQ 消息库的 Python 封装。官网
  • +
  • Toapi:一个轻巧,简单,快速的 Flask 库,致力于为所有网站提供 API 服务。官网
  • +
  • txZMQ:基于 Twisted 的 ZeroMQ 消息库的 Python 封装。官网
  • +
+

WebSocket

+

帮助使用 WebSocket 的库。

+
    +
  • AutobahnPython:给 Python 、使用的 WebSocket & WAMP 基于 Twisted 和 asyncio官网
  • +
  • Crossbar:开源统一应用路由(Websocket & WAMP for Python on Autobahn)。官网
  • +
  • django-socketio:给 Django 用的 WebSockets。官网
  • +
  • WebSocket-for-Python:为 Python2/3 以及 PyPy 编写的 WebSocket 客户端和服务器库。官网
  • +
+

WSGI 服务器

+

兼容 WSGI 的 web 服务器

+
    +
  • gunicorn:Pre-forked, 部分是由 C 语言编写的。官网
  • +
  • uwsgi:uwsgi 项目的目的是开发一组全栈工具,用来建立托管服务, 由 C 语言编写。官网
  • +
  • bjoern:异步,非常快速,由 C 语言编写。官网
  • +
  • fapws3:异步 (仅对于网络端),由 C 语言编写。官网
  • +
  • meinheld:异步,部分是由 C 语言编写的。官网
  • +
  • netius:异步,非常快速。官网
  • +
  • paste:多线程,稳定,久经考验。官网
  • +
  • rocket:多线程。官网
  • +
  • waitress:多线程, 是它驱动着 Pyramid 框架。官网
  • +
  • Werkzeug:一个 WSGI 工具库,驱动着 Flask ,而且可以很方便大嵌入到你的项目中去。官网
  • +
+

RPC 服务器

+

兼容 RPC 的服务器。

+
    +
  • SimpleJSONRPCServer:这个库是 JSON-RPC 规范的一个实现。官网
  • +
  • SimpleXMLRPCServer:(Python 标准库) 简单的 XML-RPC 服务器实现,单线程。官网
  • +
  • zeroRPC:zerorpc 是一个灵活的 RPC 实现,基于 ZeroMQ 和 MessagePack。官网
  • +
+

密码学

+
    +
  • cryptography:这个软件包意在提供密码学基本内容和方法提供给 Python 开发者。官网
  • +
  • hashids:在 Python 中实现 hashids官网
  • +
  • Paramiko:SSHv2 协议的 Python (2.6+, 3.3+) ,提供客户端和服务端的功能。官网
  • +
  • Passlib:安全密码存储/哈希库,官网
  • +
  • PyCrypto:Python 密码学工具箱。官网
  • +
  • PyNacl:网络和密码学(NaCl) 库的 Python 绑定。官网
  • +
+

图形用户界面

+

用来创建图形用户界面程序的库。

+
    +
  • curses:内建的 ncurses 封装,用来创建终端图形用户界面。官网
  • +
  • enaml:使用类似 QML 的 Declaratic 语法来创建美观的用户界面。官网
  • +
  • kivy:一个用来创建自然用户交互(NUI)应用程序的库,可以运行在 Windows, Linux, Mac OS X, Android 以及 iOS 平台上。官网
  • +
  • pyglet:一个 Python 的跨平台窗口及多媒体库。官网
  • +
  • PyQt:跨平台用户界面框架 Qt 的 Python 绑定 ,支持 Qt v4 和 Qt v5。官网
  • +
  • PySide:跨平台用户界面框架 Qt 的 Python 绑定 ,支持 Qt v4。官网
  • +
  • Tkinter:Tkinter 是 Python GUI 的一个事实标准库。官网
  • +
  • Toga:一个 Python 原生的, 操作系统原生的 GUI 工具包。官网
  • +
  • urwid:一个用来创建终端 GUI 应用的库,支持组件,事件和丰富的色彩等。官网
  • +
  • wxPython:wxPython 是 wxWidgets C++ 类库和 Python 语言混合的产物。官网
  • +
  • PyGObject:GLib/GObject/GIO/GTK+ (GTK+3) 的 Python 绑定。官网
  • +
  • Flexx:Flexx 是一个纯 Python 语言编写的用来创建 GUI 程序的工具集,它使用 web 技术进行界面的展示。官网
  • +
+

游戏开发

+

超赞的游戏开发库。

+
    +
  • Cocos2d:cocos2d 是一个用来开发 2D 游戏, 示例和其他图形/交互应用的框架。基于 pyglet。官网
  • +
  • Panda3D:由迪士尼开发的 3D 游戏引擎,并由卡内基梅陇娱乐技术中心负责维护。使用 C++ 编写, 针对 Python 进行了完全的封装。官网
  • +
  • Pygame:Pygame 是一组 Python 模块,用来编写游戏。官网
  • +
  • PyOgre:Ogre 3D 渲染引擎的 Python 绑定,可以用来开发游戏和仿真程序等任何 3D 应用。官网
  • +
  • PyOpenGL:OpenGL 的 Python 绑定及其相关 APIs。官网
  • +
  • PySDL2:SDL2 库的封装,基于 ctypes。官网
  • +
  • RenPy:一个视觉小说(visual novel)引擎。官网
  • +
+

日志

+

用来生成和操作日志的库。

+
    +
  • logging:(Python 标准库) 为 Python 提供日志功能。官网
  • +
  • logbook:Logging 库的替代品。官网
  • +
  • Eliot:为复杂的和分布式系统创建日志。官网
  • +
  • Raven:Sentry 的 Python 客户端。官网
  • +
  • Sentry:实时记录和收集日志的服务器。官网
  • +
+

测试

+

进行代码库测试和生成测试数据的库。

+
    +
  • 测试框架
      +
    • unittest:(Python 标准库) 单元测试框架。官网
    • +
    • nose:nose 扩展了 unittest 的功能。官网
    • +
    • contexts:一个 Python 3.3+ 的 BDD 框架。受到 C# – Machine.Specifications 的启发。官网
    • +
    • hypothesis:Hypothesis 是一个基于先进的 Quickcheck 风格特性的测试库。官网
    • +
    • mamba:Python 的终极测试工具, 拥护 BDD。官网
    • +
    • PyAutoGUI:PyAutoGUI 是一个人性化的跨平台 GUI 自动测试模块。官网
    • +
    • pyshould:Should 风格的断言,基于 PyHamcrest官网
    • +
    • pytest:一个成熟的全功能 Python 测试工具。官网
    • +
    • green:干净,多彩的测试工具。官网
    • +
    • pyvows:BDD 风格的测试工具,受 Vows.js 的启发。官网
    • +
    • Robot Framework:一个通用的自动化测试框架。官网
    • +
    +
  • +
  • Web 测试
      +
    • Selenium:Selenium WebDriver 的 Python 绑定。官网
    • +
    • locust:使用 Python 编写的,可扩展的用户加载测试工具。官网
    • +
    • sixpack:一个和语言无关的 A/B 测试框架。官网
    • +
    • splinter:开源的 web 应用测试工具。官网
    • +
    +
  • +
  • Mock 测试
      +
    • mock:(Python 标准库) 一个用于伪造测试的库。官网
    • +
    • doublex:Python 的一个功能强大的 doubles  测试框架。官网
    • +
    • freezegun:通过伪造日期模块来生成不同的时间。官网
    • +
    • httmock:针对 Python 2.6+ 和 3.2+ 生成 伪造请求的库。官网
    • +
    • httpretty:Python 的 HTTP 请求 mock 工具。官网
    • +
    • responses:伪造 Python 中的 requests 库的一个通用库。官网
    • +
    • VCR.py:在你的测试中记录和重放 HTTP 交互。官网
    • +
    +
  • +
  • 对象工厂
      +
    • factoryboy:一个 Python 用的测试固件 (test fixtures) 替代库。官网
    • +
    • mixer:另外一个测试固件 (test fixtures) 替代库,支持 Django, Flask, SQLAlchemy, Peewee 等。官网
    • +
    • modelmommy:为 Django 测试创建随机固件。官网
    • +
    +
  • +
  • 代码覆盖率
      +
    • coverage:代码覆盖率测量。官网
    • +
    • Codecov:一个代码覆盖率测试工具,为开源项目提供免费代码覆盖率测试服务。官网
    • +
    +
  • +
  • 伪数据
      +
    • faker:一个 Python 库,用来生成伪数据。官网
    • +
    • fake2db:伪数据库生成器。官网
    • +
    • radar:生成随机的日期/时间。官网
    • +
    +
  • +
  • 错误处理
      +
    • FuckIt.py:FuckIt.py 使用最先进的技术来保证你的 Python 代码无论对错都能继续运行。官网
    • +
    +
  • +
+

代码分析和 Lint 工具

+

进行代码分析,解析和操作代码库的库和工具。

+
    +
  • 代码分析
      +
    • coala:语言独立和易于扩展的代码分析应用程序。官网
    • +
    • code2flow:把你的 Python 和 JavaScript 代码转换为流程图。官网
    • +
    • pycallgraph:这个库可以把你的 Python 应用的流程(调用图)进行可视化。官网
    • +
    • pysonar2:Python 类型推断和检索工具。官网
    • +
    +
  • +
  • Lint 工具
      +
    • Flake8:模块化源码检查工具: pep8, pyflakes 以及 co。官网
    • +
    • Pylint:一个完全可定制的源码分析器。官网
    • +
    • YAPF: Google 的 Python 代码格式化工具。官网
    • +
    • pylama:Python 和 JavaScript 的代码审查工具。官网
    • +
    +
  • +
  • 代码格式化
      +
    • autopep8:自动格式化 Python 代码,以使其符合 PEP8 规范。官网
    • +
    • black:一个坚定的 Python 代码格式化工具。官网
    • +
    +
  • +
+

调试工具

+

用来进行代码调试的库。

+
    +
  • 调试器
      +
    • ipdb:IPython 启用的 pdb官网
    • +
    • pudb:全屏,基于控制台的 Python 调试器。官网
    • +
    • pyringe:可以在 Python 进程中附加和注入代码的调试器。官网
    • +
    • wdb:一个奇异的 web 调试器,通过 WebSockets 工作。官网
    • +
    • winpdb:一个具有图形用户界面的 Python 调试器,可以进行远程调试,基于 rpdb2。官网
    • +
    • django-debug-toolbar:为 Django 显示各种调试信息。官网
    • +
    • django-devserver:一个 Django 运行服务器的替代品。官网
    • +
    • flask-debugtoolbar:django-debug-toolbar 的 flask 版。官网
    • +
    +
  • +
  • 性能分析器 +
  • +
  • 其他
      +
    • pyelftools:解析和分析 ELF 文件以及 DWARF 调试信息。官网
    • +
    • python-statsd:statsd 服务器的 Python 客户端。官网
    • +
    +
  • +
+

科学计算和数据分析

+

用来进行科学计算和数据分析的库。

+
    +
  • astropy:一个天文学 Python 库。官网
  • +
  • bcbio-nextgen:这个工具箱为全自动高通量测序分析提供符合最佳实践的处理流程。官网
  • +
  • bccb:生物分析相关代码集合。官网
  • +
  • Biopython:Biopython 是一组可以免费使用的用来进行生物计算的工具。官网
  • +
  • blaze:NumPy 和 Pandas 的大数据接口。官网
  • +
  • cclib:一个用来解析和解释计算化学软件包输出结果的库。官网
  • +
  • NetworkX:一个为复杂网络设计的高性能软件。官网
  • +
  • Neupy:执行和测试各种不同的人工神经网络算法。官网
  • +
  • Numba:Python JIT (just in time) 编译器,针对科学用的 Python ,由 Cython 和 NumPy 的开发者开发。官网
  • +
  • NumPy:使用 Python 进行科学计算的基础包。官网
  • +
  • Open Babel:一个化学工具箱,用来描述多种化学数据。官网
  • +
  • Open Mining:使用 Python 挖掘商业情报 (BI) (Pandas web 接口)。官网
  • +
  • orange:通过可视化编程或 Python 脚本进行数据挖掘,数据可视化,分析和机器学习。官网
  • +
  • Pandas:提供高性能,易用的数据结构和数据分析工具。官网
  • +
  • PyDy:PyDy 是 Python Dynamics 的缩写,用来为动力学运动建模工作流程提供帮助, 基于 NumPy, SciPy, IPython 和 matplotlib。官网
  • +
  • PyMC:马尔科夫链蒙特卡洛采样工具。官网
  • +
  • RDKit:化学信息学和机器学习软件。官网
  • +
  • SciPy:由一些基于 Python ,用于数学,科学和工程的开源软件构成的生态系统。官网
  • +
  • statsmodels:统计建模和计量经济学。官网
  • +
  • SymPy:一个用于符号数学的 Python 库。官网
  • +
  • zipline:一个 Python 算法交易库。官网
  • +
  • Bayesian-belief-networks:优雅的贝叶斯信念网络框架。官网
  • +
+

数据可视化

+

进行数据可视化的库。 参见: awesome-javascript

+
    +
  • matplotlib:一个 Python 2D 绘图库。官网
  • +
  • bokeh:用 Python 进行交互式 web 绘图。官网
  • +
  • ggplot:ggplot2 给 R 提供的 API 的 Python 版本。官网
  • +
  • plotly:协同 Python 和 matplotlib 工作的 web 绘图库。官网
  • +
  • pyecharts:基于百度 Echarts 的数据可视化库。官网
  • +
  • pygal:一个 Python SVG 图表创建工具。官网
  • +
  • pygraphviz:Graphviz 的 Python 接口。官网
  • +
  • PyQtGraph:交互式实时 2D/3D/ 图像绘制及科学/工程学组件。官网
  • +
  • SnakeViz:一个基于浏览器的 Python's cProfile 模块输出结果查看工具。官网
  • +
  • vincent:把 Python 转换为 Vega 语法的转换工具。官网
  • +
  • VisPy:基于 OpenGL 的高性能科学可视化工具。官网
  • +
+

计算机视觉

+

计算机视觉库。

+ +

机器学习

+

机器学习库。 参见: awesome-machine-learning.

+
    +
  • Caffe: 一个 Caffe 的 python 接口。官网
  • +
  • Caffe2:一个轻量级的,模块化的,可扩展的深度学习框架。官网
  • +
  • Crab:灵活、快速的推荐引擎。官网
  • +
  • gensim:人性化的话题建模库。官网
  • +
  • hebel:GPU 加速的深度学习库。官网
  • +
  • keras: 以 tensorflow/theano/CNTK 为后端的深度学习封装库,快速上手神经网络。官网
  • +
  • MXNet:一个高效和灵活的深度学习框架。官网
  • +
  • NuPIC:智能计算 Numenta 平台。官网
  • +
  • pattern:Python 网络挖掘模块。官网
  • +
  • PyBrain:另一个 Python 机器学习库。官网
  • +
  • pydeep:Python 深度学习库。官网
  • +
  • Pylearn2:一个基于 Theano 的机器学习库。官网
  • +
  • python-recsys:一个用来实现推荐系统的 Python 库。官网
  • +
  • Pytorch:一个具有张量和动态神经网络,并有强大 GPU 加速能力的深度学习框架。官网
  • +
  • scikit-learn:基于 SciPy 构建的机器学习 Python 模块。官网
  • +
  • skflow:一个 TensorFlow 的简化接口(模仿 scikit-learn)。官网
  • +
  • TensorFlow:谷歌开源的最受欢迎的深度学习框架。官网
  • +
  • Theano:一个快速数值计算库。官网
  • +
  • vowpalporpoise:轻量级 Vowpal Wabbit 的 Python 封装。官网
  • +
+

MapReduce

+

MapReduce 框架和库。

+
    +
  • dpark:Spark 的 Python 克隆版,一个类似 MapReduce 的框架。官网
  • +
  • dumbo:这个 Python 模块可以让人轻松的编写和运行 Hadoop 程序。官网
  • +
  • luigi:这个模块帮你构建批处理作业的复杂流水线。官网
  • +
  • mrjob:在 Hadoop 或 Amazon Web Services 上运行 MapReduce 任务。官网
  • +
  • PySpark:Spark 的 Python API 。官网
  • +
  • streamparse:运行针对事实数据流的 Python 代码。集成了 Apache Storm官网
  • +
+

函数式编程

+

使用 Python 进行函数式编程。

+
    +
  • CyToolz:Toolz 的 Cython 实现 : 高性能函数式工具。官网
  • +
  • fn.py:在 Python 中进行函数式编程 : 实现了一些享受函数式编程缺失的功能。官网
  • +
  • funcy:炫酷又实用的函数式工具。官网
  • +
  • Toolz:一组用于迭代器,函数和字典的函数式编程工具。官网
  • +
+

第三方 API

+

用来访问第三方 API 的库。 参见: List of Python API Wrappers and Libraries

+
    +
  • apache-libcloud:一个为各种云设计的 Python 库。官网
  • +
  • boto:Amazon Web Services 的 Python 接口。官网
  • +
  • django-wordpress:WordPress models and views for Django.官网
  • +
  • facebook-sdk:Facebook 平台的 Python SDK.官网
  • +
  • facepy:Facepy 让和 Facebook's Graph API 的交互变得更容易。官网
  • +
  • gmail:Gmail 的 Python 接口。官网
  • +
  • google-api-python-client:Python 用的 Google APIs 客户端库。官网
  • +
  • gspread:Google 电子表格的 Python API.官网
  • +
  • twython:Twitter API 的封装。官网
  • +
+

DevOps 工具

+

用于 DevOps 的软件和库。

+
    +
  • Ansible:一个非常简单的 IT 自动化平台。官网
  • +
  • SaltStack:基础设施自动化和管理系统。官网
  • +
  • OpenStack:用于构建私有和公有云的开源软件。官网
  • +
  • Docker Compose:快速,分离的开发环境,使用 Docker。官网
  • +
  • Fabric:一个简单的,Python 风格的工具,用来进行远程执行和部署。官网
  • +
  • cuisine:为 Fabric 提供一系列高级函数。官网
  • +
  • Fabtools:一个用来编写超赞的 Fabric 文件的工具。官网
  • +
  • gitapi:Git 的纯 Python API。官网
  • +
  • hgapi:Mercurial 的纯 Python API。官网
  • +
  • honcho:Foreman 的 Python 克隆版,用来管理基于 Procfile 的应用。官网
  • +
  • pexpect:Controlling interactive programs in a pseudo-terminal like 在一个伪终端中控制交互程序,就像 GNU expect 一样。官网
  • +
  • psutil:一个跨平台进程和系统工具模块。官网
  • +
  • supervisor:UNIX 的进程控制系统。官网
  • +
+

任务调度

+

任务调度库。

+
    +
  • APScheduler:轻巧但强大的进程内任务调度,使你可以调度函数。官网
  • +
  • django-schedule:一个 Django 排程应用。官网
  • +
  • doit:一个任务执行和构建工具。官网
  • +
  • gunnery:分布式系统使用的多用途任务执行工具 ,具有 web 交互界面。官网
  • +
  • Joblib:一组为 Python 提供轻量级作业流水线的工具。官网
  • +
  • Plan:如有神助地编写 crontab 文件。官网
  • +
  • schedule:人性化的 Python 任务调度库。官网
  • +
  • Spiff:使用纯 Python 实现的强大的工作流引擎。官网
  • +
  • TaskFlow:一个可以让你方便执行任务的 Python 库,一致并且可靠。官网 +*  AirFlow:Airflow 是Airbnb公司开源的,是一个工作流分配管理系统,通过有向非循环图的方式管理任务流程,设置任务依赖关系和时间调度。官方
  • +
+

外来函数接口

+

使用外来函数接口的库。

+
    +
  • cffi:用来调用 C 代码的外来函数接口。官网
  • +
  • ctypes:(Python 标准库) 用来调用 C 代码的外来函数接口。官网
  • +
  • PyCUDA:Nvidia CUDA API 的封装。官网
  • +
  • SWIG:简化的封装和接口生成器。官网
  • +
+

高性能

+

让 Python 更快的库。

+
    +
  • Cython:优化的 Python 静态编译器。使用类型混合使 Python 编译成 C 或 C++ 模块来获得性能的极大提升。官网
  • +
  • PeachPy:嵌入 Python 的 x86-64 汇编器。可以被用作 Python 内联的汇编器或者是独立的汇编器,用于 Windows, Linux, OS X, Native Client 或者 Go 。官网
  • +
  • PyPy:使用 Python 实现的 Python。解释器使用黑魔法加快 Python 运行速度且不需要加入额外的类型信息。官网
  • +
  • Pyston:使用 LLVM 和现代 JIT 技术构建的 Python 实现,目标是为了获得很好的性能。官网
  • +
  • Stackless Python:一个强化版的 Python。官网
  • +
+

微软的 Windows 平台

+

在 Windows 平台上进行 Python 编程。

+
    +
  • Python(x,y):面向科学应用的 Python 发行版,基于 Qt 和 Spyder。官网
  • +
  • pythonlibs:非官方的 Windows 平台 Python 扩展二进制包。官网
  • +
  • PythonNet:Python 与 .NET 公共语言运行库 (CLR)的集成。官网
  • +
  • PyWin32:针对 Windows 的 Python 扩展。官网
  • +
  • WinPython:Windows 7/8 系统下便携式开发环境。官网
  • +
+

网络可视化和 SDN

+

用来进行网络可视化和 SDN(软件定义网络)的工具和库。

+
    +
  • Mininet:一款流行的网络模拟器以及用 Python 编写的 API。官网
  • +
  • POX:一个针对基于 Python 的软件定义网络应用(例如 OpenFlow SDN 控制器)的开源开发平台。官网
  • +
  • Pyretic:火热的 SDN 编程语言中的一员,为网络交换机和模拟器提供强大的抽象能力。官网
  • +
  • SDX Platform:基于 SDN 的 IXP 实现,影响了 Mininet, POX 和 Pyretic。官网
  • +
  • NRU:一个基于组件的软件定义网络框架。官网
  • +
+

硬件

+

用来对硬件进行编程的库。

+
    +
  • ino:操作 Arduino 的命令行工具。官网
  • +
  • Pyro:Python 机器人编程库。官网
  • +
  • PyUserInput:跨平台的,控制鼠标和键盘的模块。官网
  • +
  • scapy:一个非常棒的操作数据包的库。官网
  • +
  • wifi:一个 Python 库和命令行工具用来在 Linux 平台上操作 WiFi。官网
  • +
  • Pingo:Pingo 为类似 Raspberry Pi,pcDuino, Intel Galileo 等设备提供统一的 API 用以编程。官网
  • +
+

兼容性

+

帮助从 Python 2 向 Python 3 迁移的库。

+
    +
  • Python-Future:这就是 Python 2 和 Python 3 之间丢失的那个兼容性层。官网
  • +
  • Python-Modernize:使 Python 代码更加现代化以便最终迁移到 Python 3。官网
  • +
  • Six:Python 2 和 3 的兼容性工具。官网
  • +
+

杂项

+

不属于上面任何一个类别,但是非常有用的库。

+
    +
  • blinker:一个快速的 Python 进程内信号/事件分发系统。官网
  • +
  • itsdangerous:一系列辅助工具用来将可信的数据传入不可信的环境。官网
  • +
  • pluginbase:一个简单但是非常灵活的 Python 插件系统。官网
  • +
  • Pychievements:一个用来创建和追踪成就的 Python 框架。官网
  • +
  • Tryton:一个通用商务框架。官网
  • +
+

算法和设计模式

+

Python 实现的算法和设计模式。

+
    +
  • algorithms:一个 Python 算法模块。官网
  • +
  • python-patterns:Python 设计模式的集合。官网
  • +
  • sortedcontainers:快速,纯 Python 实现的 SortedList,SortedDict 和 SortedSet 类型。官网
  • +
+

编辑器插件

+

编辑器和 IDE 的插件

+
    +
  • Emacs
      +
    • Elpy:Emacs Python 开发环境。官网
    • +
    +
  • +
  • Sublime Text
      +
    • SublimeJEDI:一个 Sublime Text 插件,用来使用超赞的自动补全库 Jedi。官网
    • +
    • Anaconda:Anaconda 把你的 Sublime Text 3 变成一个功能齐全的 Python IDE。官网
    • +
    +
  • +
  • Vim
      +
    • YouCompleteMe:引入基于 Jedi 的 Python 自动补全引擎。官网
    • +
    • Jedi-vim:绑定 Vim 和 Jedi 自动补全库对 Python 进行自动补全。官网
    • +
    • Python-mode:将 Vim 变成 Python IDE 的一款多合一插件。官网
    • +
    +
  • +
  • Visual Studio
      +
    • PTVS:Visual Studio 的 Python 工具。官网
    • +
    +
  • +
+

集成开发环境

+

流行的 Python 集成开发环境。

+
    +
  • PyCharm:商业化的 Python IDE ,由 JetBrains 开发。也有免费的社区版提供。官网
  • +
  • LiClipse:基于 Eclipse 的免费多语言 IDE 。使用 PyDev 来支持 Python 。官网
  • +
  • Spyder:开源 Python IDE。官网
  • +
+

自动聊天工具

+

用于开发聊天机器人的库

+
    +
  • Errbot:最简单和最流行的聊天机器人用来实现自动聊天工具。官网
  • +
+

服务

+

在线工具和简化开发的 API 。

+

金融数据

+
    +
  • Tushare :一个可以提供免费股票、基金、期货、港股等金融数据的 Python 开源数据。官网
  • +
  • Ta-Lib :金融数据技术分析库,可以依据原始金融数据计算各种技术指标,计算性能比较优异。官网
  • +
+

持续集成

+

参见: awesome-CIandCD.

+
    +
  • Travis CI:一个流行的工具,为你的开源和 私人 项目提供持续集成服务。(仅支持 GitHub)官网
  • +
  • CircleCI:一个持续集成工具,可以非常快速的进行并行测试。 (仅支持 GitHub)官网
  • +
  • Vexor CI:一个为私人 app 提供持续集成的工具,支持按分钟付费。官网
  • +
  • Wercker:基于 Docker 平台,用来构建和部署微服务。官网
  • +
+

代码质量

+
    +
  • Codacy:自动化代码审查,更加快速的发布高质量代码。对于开源项目是免费的。官网
  • +
  • QuantifiedCode:一个数据驱动、自动、持续的代码审查工具。官网
  • +
+

资源

+

在这里可以找到新的 Python 库。

+

网站

+ +

周刊

+ +

Twitter

+ +

学习指南

+ +

知名网站

+ +

值得关注的 Python 技术站点。

+

中文站点

+ +
    +
  • 伯乐在线 Python 频道:分享 Python 开发技术、相关的行业动态。官网
  • +
+

英文站点

+ + +

微博、微信公众号

+ +
    +
  • Python开发者 微博:@Python开发者
  • +
  • Python开发者:人生苦短,我用 Python。Python 越来越受广大程序员的喜爱。「Python开发者」是最受欢迎的、专注分享 Python 技术的微信公众号,主要分享 Python 相关的技术文章、工具资源和资讯等。 +
  • +
+ + + + + + + +
+
+
+
+ + + + +
+ + + + + + + + + + + + \ No newline at end of file diff --git a/mkdocs/js/lunr.min.js b/mkdocs/js/lunr.min.js new file mode 100644 index 0000000..b0198df --- /dev/null +++ b/mkdocs/js/lunr.min.js @@ -0,0 +1,7 @@ +/** + * lunr - http://lunrjs.com - A bit like Solr, but much smaller and not as bright - 0.7.0 + * Copyright (C) 2016 Oliver Nightingale + * MIT Licensed + * @license + */ +!function(){var t=function(e){var n=new t.Index;return n.pipeline.add(t.trimmer,t.stopWordFilter,t.stemmer),e&&e.call(n,n),n};t.version="0.7.0",t.utils={},t.utils.warn=function(t){return function(e){t.console&&console.warn&&console.warn(e)}}(this),t.utils.asString=function(t){return void 0===t||null===t?"":t.toString()},t.EventEmitter=function(){this.events={}},t.EventEmitter.prototype.addListener=function(){var t=Array.prototype.slice.call(arguments),e=t.pop(),n=t;if("function"!=typeof e)throw new TypeError("last argument must be a function");n.forEach(function(t){this.hasHandler(t)||(this.events[t]=[]),this.events[t].push(e)},this)},t.EventEmitter.prototype.removeListener=function(t,e){if(this.hasHandler(t)){var n=this.events[t].indexOf(e);this.events[t].splice(n,1),this.events[t].length||delete this.events[t]}},t.EventEmitter.prototype.emit=function(t){if(this.hasHandler(t)){var e=Array.prototype.slice.call(arguments,1);this.events[t].forEach(function(t){t.apply(void 0,e)})}},t.EventEmitter.prototype.hasHandler=function(t){return t in this.events},t.tokenizer=function(e){return arguments.length&&null!=e&&void 0!=e?Array.isArray(e)?e.map(function(e){return t.utils.asString(e).toLowerCase()}):e.toString().trim().toLowerCase().split(t.tokenizer.seperator):[]},t.tokenizer.seperator=/[\s\-]+/,t.tokenizer.load=function(t){var e=this.registeredFunctions[t];if(!e)throw new Error("Cannot load un-registered function: "+t);return e},t.tokenizer.label="default",t.tokenizer.registeredFunctions={"default":t.tokenizer},t.tokenizer.registerFunction=function(e,n){n in this.registeredFunctions&&t.utils.warn("Overwriting existing tokenizer: "+n),e.label=n,this.registeredFunctions[n]=e},t.Pipeline=function(){this._stack=[]},t.Pipeline.registeredFunctions={},t.Pipeline.registerFunction=function(e,n){n in this.registeredFunctions&&t.utils.warn("Overwriting existing registered function: "+n),e.label=n,t.Pipeline.registeredFunctions[e.label]=e},t.Pipeline.warnIfFunctionNotRegistered=function(e){var n=e.label&&e.label in this.registeredFunctions;n||t.utils.warn("Function is not registered with pipeline. This may cause problems when serialising the index.\n",e)},t.Pipeline.load=function(e){var n=new t.Pipeline;return e.forEach(function(e){var i=t.Pipeline.registeredFunctions[e];if(!i)throw new Error("Cannot load un-registered function: "+e);n.add(i)}),n},t.Pipeline.prototype.add=function(){var e=Array.prototype.slice.call(arguments);e.forEach(function(e){t.Pipeline.warnIfFunctionNotRegistered(e),this._stack.push(e)},this)},t.Pipeline.prototype.after=function(e,n){t.Pipeline.warnIfFunctionNotRegistered(n);var i=this._stack.indexOf(e);if(-1==i)throw new Error("Cannot find existingFn");i+=1,this._stack.splice(i,0,n)},t.Pipeline.prototype.before=function(e,n){t.Pipeline.warnIfFunctionNotRegistered(n);var i=this._stack.indexOf(e);if(-1==i)throw new Error("Cannot find existingFn");this._stack.splice(i,0,n)},t.Pipeline.prototype.remove=function(t){var e=this._stack.indexOf(t);-1!=e&&this._stack.splice(e,1)},t.Pipeline.prototype.run=function(t){for(var e=[],n=t.length,i=this._stack.length,r=0;n>r;r++){for(var o=t[r],s=0;i>s&&(o=this._stack[s](o,r,t),void 0!==o&&""!==o);s++);void 0!==o&&""!==o&&e.push(o)}return e},t.Pipeline.prototype.reset=function(){this._stack=[]},t.Pipeline.prototype.toJSON=function(){return this._stack.map(function(e){return t.Pipeline.warnIfFunctionNotRegistered(e),e.label})},t.Vector=function(){this._magnitude=null,this.list=void 0,this.length=0},t.Vector.Node=function(t,e,n){this.idx=t,this.val=e,this.next=n},t.Vector.prototype.insert=function(e,n){this._magnitude=void 0;var i=this.list;if(!i)return this.list=new t.Vector.Node(e,n,i),this.length++;if(en.idx?n=n.next:(i+=e.val*n.val,e=e.next,n=n.next);return i},t.Vector.prototype.similarity=function(t){return this.dot(t)/(this.magnitude()*t.magnitude())},t.SortedSet=function(){this.length=0,this.elements=[]},t.SortedSet.load=function(t){var e=new this;return e.elements=t,e.length=t.length,e},t.SortedSet.prototype.add=function(){var t,e;for(t=0;t1;){if(o===t)return r;t>o&&(e=r),o>t&&(n=r),i=n-e,r=e+Math.floor(i/2),o=this.elements[r]}return o===t?r:-1},t.SortedSet.prototype.locationFor=function(t){for(var e=0,n=this.elements.length,i=n-e,r=e+Math.floor(i/2),o=this.elements[r];i>1;)t>o&&(e=r),o>t&&(n=r),i=n-e,r=e+Math.floor(i/2),o=this.elements[r];return o>t?r:t>o?r+1:void 0},t.SortedSet.prototype.intersect=function(e){for(var n=new t.SortedSet,i=0,r=0,o=this.length,s=e.length,a=this.elements,h=e.elements;;){if(i>o-1||r>s-1)break;a[i]!==h[r]?a[i]h[r]&&r++:(n.add(a[i]),i++,r++)}return n},t.SortedSet.prototype.clone=function(){var e=new t.SortedSet;return e.elements=this.toArray(),e.length=e.elements.length,e},t.SortedSet.prototype.union=function(t){var e,n,i;this.length>=t.length?(e=this,n=t):(e=t,n=this),i=e.clone();for(var r=0,o=n.toArray();rp;p++)c[p]===a&&d++;h+=d/f*l.boost}}this.tokenStore.add(a,{ref:o,tf:h})}n&&this.eventEmitter.emit("add",e,this)},t.Index.prototype.remove=function(t,e){var n=t[this._ref],e=void 0===e?!0:e;if(this.documentStore.has(n)){var i=this.documentStore.get(n);this.documentStore.remove(n),i.forEach(function(t){this.tokenStore.remove(t,n)},this),e&&this.eventEmitter.emit("remove",t,this)}},t.Index.prototype.update=function(t,e){var e=void 0===e?!0:e;this.remove(t,!1),this.add(t,!1),e&&this.eventEmitter.emit("update",t,this)},t.Index.prototype.idf=function(t){var e="@"+t;if(Object.prototype.hasOwnProperty.call(this._idfCache,e))return this._idfCache[e];var n=this.tokenStore.count(t),i=1;return n>0&&(i=1+Math.log(this.documentStore.length/n)),this._idfCache[e]=i},t.Index.prototype.search=function(e){var n=this.pipeline.run(this.tokenizerFn(e)),i=new t.Vector,r=[],o=this._fields.reduce(function(t,e){return t+e.boost},0),s=n.some(function(t){return this.tokenStore.has(t)},this);if(!s)return[];n.forEach(function(e,n,s){var a=1/s.length*this._fields.length*o,h=this,u=this.tokenStore.expand(e).reduce(function(n,r){var o=h.corpusTokens.indexOf(r),s=h.idf(r),u=1,l=new t.SortedSet;if(r!==e){var c=Math.max(3,r.length-e.length);u=1/Math.log(c)}o>-1&&i.insert(o,a*s*u);for(var f=h.tokenStore.get(r),d=Object.keys(f),p=d.length,v=0;p>v;v++)l.add(f[d[v]].ref);return n.union(l)},new t.SortedSet);r.push(u)},this);var a=r.reduce(function(t,e){return t.intersect(e)});return a.map(function(t){return{ref:t,score:i.similarity(this.documentVector(t))}},this).sort(function(t,e){return e.score-t.score})},t.Index.prototype.documentVector=function(e){for(var n=this.documentStore.get(e),i=n.length,r=new t.Vector,o=0;i>o;o++){var s=n.elements[o],a=this.tokenStore.get(s)[e].tf,h=this.idf(s);r.insert(this.corpusTokens.indexOf(s),a*h)}return r},t.Index.prototype.toJSON=function(){return{version:t.version,fields:this._fields,ref:this._ref,tokenizer:this.tokenizerFn.label,documentStore:this.documentStore.toJSON(),tokenStore:this.tokenStore.toJSON(),corpusTokens:this.corpusTokens.toJSON(),pipeline:this.pipeline.toJSON()}},t.Index.prototype.use=function(t){var e=Array.prototype.slice.call(arguments,1);e.unshift(this),t.apply(this,e)},t.Store=function(){this.store={},this.length=0},t.Store.load=function(e){var n=new this;return n.length=e.length,n.store=Object.keys(e.store).reduce(function(n,i){return n[i]=t.SortedSet.load(e.store[i]),n},{}),n},t.Store.prototype.set=function(t,e){this.has(t)||this.length++,this.store[t]=e},t.Store.prototype.get=function(t){return this.store[t]},t.Store.prototype.has=function(t){return t in this.store},t.Store.prototype.remove=function(t){this.has(t)&&(delete this.store[t],this.length--)},t.Store.prototype.toJSON=function(){return{store:this.store,length:this.length}},t.stemmer=function(){var t={ational:"ate",tional:"tion",enci:"ence",anci:"ance",izer:"ize",bli:"ble",alli:"al",entli:"ent",eli:"e",ousli:"ous",ization:"ize",ation:"ate",ator:"ate",alism:"al",iveness:"ive",fulness:"ful",ousness:"ous",aliti:"al",iviti:"ive",biliti:"ble",logi:"log"},e={icate:"ic",ative:"",alize:"al",iciti:"ic",ical:"ic",ful:"",ness:""},n="[^aeiou]",i="[aeiouy]",r=n+"[^aeiouy]*",o=i+"[aeiou]*",s="^("+r+")?"+o+r,a="^("+r+")?"+o+r+"("+o+")?$",h="^("+r+")?"+o+r+o+r,u="^("+r+")?"+i,l=new RegExp(s),c=new RegExp(h),f=new RegExp(a),d=new RegExp(u),p=/^(.+?)(ss|i)es$/,v=/^(.+?)([^s])s$/,g=/^(.+?)eed$/,m=/^(.+?)(ed|ing)$/,y=/.$/,S=/(at|bl|iz)$/,w=new RegExp("([^aeiouylsz])\\1$"),k=new RegExp("^"+r+i+"[^aeiouwxy]$"),x=/^(.+?[^aeiou])y$/,b=/^(.+?)(ational|tional|enci|anci|izer|bli|alli|entli|eli|ousli|ization|ation|ator|alism|iveness|fulness|ousness|aliti|iviti|biliti|logi)$/,E=/^(.+?)(icate|ative|alize|iciti|ical|ful|ness)$/,F=/^(.+?)(al|ance|ence|er|ic|able|ible|ant|ement|ment|ent|ou|ism|ate|iti|ous|ive|ize)$/,_=/^(.+?)(s|t)(ion)$/,z=/^(.+?)e$/,O=/ll$/,P=new RegExp("^"+r+i+"[^aeiouwxy]$"),T=function(n){var i,r,o,s,a,h,u;if(n.length<3)return n;if(o=n.substr(0,1),"y"==o&&(n=o.toUpperCase()+n.substr(1)),s=p,a=v,s.test(n)?n=n.replace(s,"$1$2"):a.test(n)&&(n=n.replace(a,"$1$2")),s=g,a=m,s.test(n)){var T=s.exec(n);s=l,s.test(T[1])&&(s=y,n=n.replace(s,""))}else if(a.test(n)){var T=a.exec(n);i=T[1],a=d,a.test(i)&&(n=i,a=S,h=w,u=k,a.test(n)?n+="e":h.test(n)?(s=y,n=n.replace(s,"")):u.test(n)&&(n+="e"))}if(s=x,s.test(n)){var T=s.exec(n);i=T[1],n=i+"i"}if(s=b,s.test(n)){var T=s.exec(n);i=T[1],r=T[2],s=l,s.test(i)&&(n=i+t[r])}if(s=E,s.test(n)){var T=s.exec(n);i=T[1],r=T[2],s=l,s.test(i)&&(n=i+e[r])}if(s=F,a=_,s.test(n)){var T=s.exec(n);i=T[1],s=c,s.test(i)&&(n=i)}else if(a.test(n)){var T=a.exec(n);i=T[1]+T[2],a=c,a.test(i)&&(n=i)}if(s=z,s.test(n)){var T=s.exec(n);i=T[1],s=c,a=f,h=P,(s.test(i)||a.test(i)&&!h.test(i))&&(n=i)}return s=O,a=c,s.test(n)&&a.test(n)&&(s=y,n=n.replace(s,"")),"y"==o&&(n=o.toLowerCase()+n.substr(1)),n};return T}(),t.Pipeline.registerFunction(t.stemmer,"stemmer"),t.generateStopWordFilter=function(t){var e=t.reduce(function(t,e){return t[e]=e,t},{});return function(t){return t&&e[t]!==t?t:void 0}},t.stopWordFilter=t.generateStopWordFilter(["a","able","about","across","after","all","almost","also","am","among","an","and","any","are","as","at","be","because","been","but","by","can","cannot","could","dear","did","do","does","either","else","ever","every","for","from","get","got","had","has","have","he","her","hers","him","his","how","however","i","if","in","into","is","it","its","just","least","let","like","likely","may","me","might","most","must","my","neither","no","nor","not","of","off","often","on","only","or","other","our","own","rather","said","say","says","she","should","since","so","some","than","that","the","their","them","then","there","these","they","this","tis","to","too","twas","us","wants","was","we","were","what","when","where","which","while","who","whom","why","will","with","would","yet","you","your"]),t.Pipeline.registerFunction(t.stopWordFilter,"stopWordFilter"),t.trimmer=function(t){return t.replace(/^\W+/,"").replace(/\W+$/,"")},t.Pipeline.registerFunction(t.trimmer,"trimmer"),t.TokenStore=function(){this.root={docs:{}},this.length=0},t.TokenStore.load=function(t){var e=new this;return e.root=t.root,e.length=t.length,e},t.TokenStore.prototype.add=function(t,e,n){var n=n||this.root,i=t.charAt(0),r=t.slice(1);return i in n||(n[i]={docs:{}}),0===r.length?(n[i].docs[e.ref]=e,void(this.length+=1)):this.add(r,e,n[i])},t.TokenStore.prototype.has=function(t){if(!t)return!1;for(var e=this.root,n=0;n":">",'"':""","'":"'","/":"/"};function escapeHtml(string){return String(string).replace(/[&<>"'\/]/g,function(s){return entityMap[s]})}var whiteRe=/\s*/;var spaceRe=/\s+/;var equalsRe=/\s*=/;var curlyRe=/\s*\}/;var tagRe=/#|\^|\/|>|\{|&|=|!/;function parseTemplate(template,tags){if(!template)return[];var sections=[];var tokens=[];var spaces=[];var hasTag=false;var nonSpace=false;function stripSpace(){if(hasTag&&!nonSpace){while(spaces.length)delete tokens[spaces.pop()]}else{spaces=[]}hasTag=false;nonSpace=false}var openingTagRe,closingTagRe,closingCurlyRe;function compileTags(tags){if(typeof tags==="string")tags=tags.split(spaceRe,2);if(!isArray(tags)||tags.length!==2)throw new Error("Invalid tags: "+tags);openingTagRe=new RegExp(escapeRegExp(tags[0])+"\\s*");closingTagRe=new RegExp("\\s*"+escapeRegExp(tags[1]));closingCurlyRe=new RegExp("\\s*"+escapeRegExp("}"+tags[1]))}compileTags(tags||mustache.tags);var scanner=new Scanner(template);var start,type,value,chr,token,openSection;while(!scanner.eos()){start=scanner.pos;value=scanner.scanUntil(openingTagRe);if(value){for(var i=0,valueLength=value.length;i0?sections[sections.length-1][4]:nestedTokens;break;default:collector.push(token)}}return nestedTokens}function Scanner(string){this.string=string;this.tail=string;this.pos=0}Scanner.prototype.eos=function(){return this.tail===""};Scanner.prototype.scan=function(re){var match=this.tail.match(re);if(!match||match.index!==0)return"";var string=match[0];this.tail=this.tail.substring(string.length);this.pos+=string.length;return string};Scanner.prototype.scanUntil=function(re){var index=this.tail.search(re),match;switch(index){case-1:match=this.tail;this.tail="";break;case 0:match="";break;default:match=this.tail.substring(0,index);this.tail=this.tail.substring(index)}this.pos+=match.length;return match};function Context(view,parentContext){this.view=view;this.cache={".":this.view};this.parent=parentContext}Context.prototype.push=function(view){return new Context(view,this)};Context.prototype.lookup=function(name){var cache=this.cache;var value;if(name in cache){value=cache[name]}else{var context=this,names,index,lookupHit=false;while(context){if(name.indexOf(".")>0){value=context.view;names=name.split(".");index=0;while(value!=null&&index")value=this._renderPartial(token,context,partials,originalTemplate);else if(symbol==="&")value=this._unescapedValue(token,context);else if(symbol==="name")value=this._escapedValue(token,context);else if(symbol==="text")value=this._rawValue(token);if(value!==undefined)buffer+=value}return buffer};Writer.prototype._renderSection=function(token,context,partials,originalTemplate){var self=this;var buffer="";var value=context.lookup(token[1]);function subRender(template){return self.render(template,context,partials)}if(!value)return;if(isArray(value)){for(var j=0,valueLength=value.length;jthis.depCount&&!this.defined){if(G(l)){if(this.events.error&&this.map.isDefine||g.onError!==ca)try{f=i.execCb(c,l,b,f)}catch(d){a=d}else f=i.execCb(c,l,b,f);this.map.isDefine&&void 0===f&&((b=this.module)?f=b.exports:this.usingExports&& +(f=this.exports));if(a)return a.requireMap=this.map,a.requireModules=this.map.isDefine?[this.map.id]:null,a.requireType=this.map.isDefine?"define":"require",w(this.error=a)}else f=l;this.exports=f;if(this.map.isDefine&&!this.ignore&&(r[c]=f,g.onResourceLoad))g.onResourceLoad(i,this.map,this.depMaps);y(c);this.defined=!0}this.defining=!1;this.defined&&!this.defineEmitted&&(this.defineEmitted=!0,this.emit("defined",this.exports),this.defineEmitComplete=!0)}}else this.fetch()}},callPlugin:function(){var a= +this.map,b=a.id,d=p(a.prefix);this.depMaps.push(d);q(d,"defined",u(this,function(f){var l,d;d=m(aa,this.map.id);var e=this.map.name,P=this.map.parentMap?this.map.parentMap.name:null,n=i.makeRequire(a.parentMap,{enableBuildCallback:!0});if(this.map.unnormalized){if(f.normalize&&(e=f.normalize(e,function(a){return c(a,P,!0)})||""),f=p(a.prefix+"!"+e,this.map.parentMap),q(f,"defined",u(this,function(a){this.init([],function(){return a},null,{enabled:!0,ignore:!0})})),d=m(h,f.id)){this.depMaps.push(f); +if(this.events.error)d.on("error",u(this,function(a){this.emit("error",a)}));d.enable()}}else d?(this.map.url=i.nameToUrl(d),this.load()):(l=u(this,function(a){this.init([],function(){return a},null,{enabled:!0})}),l.error=u(this,function(a){this.inited=!0;this.error=a;a.requireModules=[b];B(h,function(a){0===a.map.id.indexOf(b+"_unnormalized")&&y(a.map.id)});w(a)}),l.fromText=u(this,function(f,c){var d=a.name,e=p(d),P=M;c&&(f=c);P&&(M=!1);s(e);t(j.config,b)&&(j.config[d]=j.config[b]);try{g.exec(f)}catch(h){return w(C("fromtexteval", +"fromText eval for "+b+" failed: "+h,h,[b]))}P&&(M=!0);this.depMaps.push(e);i.completeLoad(d);n([d],l)}),f.load(a.name,n,l,j))}));i.enable(d,this);this.pluginMaps[d.id]=d},enable:function(){V[this.map.id]=this;this.enabling=this.enabled=!0;v(this.depMaps,u(this,function(a,b){var c,f;if("string"===typeof a){a=p(a,this.map.isDefine?this.map:this.map.parentMap,!1,!this.skipMap);this.depMaps[b]=a;if(c=m(L,a.id)){this.depExports[b]=c(this);return}this.depCount+=1;q(a,"defined",u(this,function(a){this.defineDep(b, +a);this.check()}));this.errback?q(a,"error",u(this,this.errback)):this.events.error&&q(a,"error",u(this,function(a){this.emit("error",a)}))}c=a.id;f=h[c];!t(L,c)&&(f&&!f.enabled)&&i.enable(a,this)}));B(this.pluginMaps,u(this,function(a){var b=m(h,a.id);b&&!b.enabled&&i.enable(a,this)}));this.enabling=!1;this.check()},on:function(a,b){var c=this.events[a];c||(c=this.events[a]=[]);c.push(b)},emit:function(a,b){v(this.events[a],function(a){a(b)});"error"===a&&delete this.events[a]}};i={config:j,contextName:b, +registry:h,defined:r,urlFetched:S,defQueue:A,Module:Z,makeModuleMap:p,nextTick:g.nextTick,onError:w,configure:function(a){a.baseUrl&&"/"!==a.baseUrl.charAt(a.baseUrl.length-1)&&(a.baseUrl+="/");var b=j.shim,c={paths:!0,bundles:!0,config:!0,map:!0};B(a,function(a,b){c[b]?(j[b]||(j[b]={}),U(j[b],a,!0,!0)):j[b]=a});a.bundles&&B(a.bundles,function(a,b){v(a,function(a){a!==b&&(aa[a]=b)})});a.shim&&(B(a.shim,function(a,c){H(a)&&(a={deps:a});if((a.exports||a.init)&&!a.exportsFn)a.exportsFn=i.makeShimExports(a); +b[c]=a}),j.shim=b);a.packages&&v(a.packages,function(a){var b,a="string"===typeof a?{name:a}:a;b=a.name;a.location&&(j.paths[b]=a.location);j.pkgs[b]=a.name+"/"+(a.main||"main").replace(ia,"").replace(Q,"")});B(h,function(a,b){!a.inited&&!a.map.unnormalized&&(a.map=p(b))});if(a.deps||a.callback)i.require(a.deps||[],a.callback)},makeShimExports:function(a){return function(){var b;a.init&&(b=a.init.apply(ba,arguments));return b||a.exports&&da(a.exports)}},makeRequire:function(a,e){function j(c,d,m){var n, +q;e.enableBuildCallback&&(d&&G(d))&&(d.__requireJsBuild=!0);if("string"===typeof c){if(G(d))return w(C("requireargs","Invalid require call"),m);if(a&&t(L,c))return L[c](h[a.id]);if(g.get)return g.get(i,c,a,j);n=p(c,a,!1,!0);n=n.id;return!t(r,n)?w(C("notloaded",'Module name "'+n+'" has not been loaded yet for context: '+b+(a?"":". Use require([])"))):r[n]}J();i.nextTick(function(){J();q=s(p(null,a));q.skipMap=e.skipMap;q.init(c,d,m,{enabled:!0});D()});return j}e=e||{};U(j,{isBrowser:z,toUrl:function(b){var d, +e=b.lastIndexOf("."),k=b.split("/")[0];if(-1!==e&&(!("."===k||".."===k)||1e.attachEvent.toString().indexOf("[native code"))&& +!Y?(M=!0,e.attachEvent("onreadystatechange",b.onScriptLoad)):(e.addEventListener("load",b.onScriptLoad,!1),e.addEventListener("error",b.onScriptError,!1)),e.src=d,J=e,D?y.insertBefore(e,D):y.appendChild(e),J=null,e;if(ea)try{importScripts(d),b.completeLoad(c)}catch(m){b.onError(C("importscripts","importScripts failed for "+c+" at "+d,m,[c]))}};z&&!q.skipDataMain&&T(document.getElementsByTagName("script"),function(b){y||(y=b.parentNode);if(I=b.getAttribute("data-main"))return s=I,q.baseUrl||(E=s.split("/"), +s=E.pop(),O=E.length?E.join("/")+"/":"./",q.baseUrl=O),s=s.replace(Q,""),g.jsExtRegExp.test(s)&&(s=I),q.deps=q.deps?q.deps.concat(s):[s],!0});define=function(b,c,d){var e,g;"string"!==typeof b&&(d=c,c=b,b=null);H(c)||(d=c,c=null);!c&&G(d)&&(c=[],d.length&&(d.toString().replace(ka,"").replace(la,function(b,d){c.push(d)}),c=(1===d.length?["require"]:["require","exports","module"]).concat(c)));if(M){if(!(e=J))N&&"interactive"===N.readyState||T(document.getElementsByTagName("script"),function(b){if("interactive"=== +b.readyState)return N=b}),e=N;e&&(b||(b=e.getAttribute("data-requiremodule")),g=F[e.getAttribute("data-requirecontext")])}(g?g.defQueue:R).push([b,c,d])};define.amd={jQuery:!0};g.exec=function(b){return eval(b)};g(q)}})(this); diff --git a/mkdocs/js/search-results-template.mustache b/mkdocs/js/search-results-template.mustache new file mode 100644 index 0000000..a8b3862 --- /dev/null +++ b/mkdocs/js/search-results-template.mustache @@ -0,0 +1,4 @@ + diff --git a/mkdocs/js/search.js b/mkdocs/js/search.js new file mode 100644 index 0000000..d5c8661 --- /dev/null +++ b/mkdocs/js/search.js @@ -0,0 +1,88 @@ +require([ + base_url + '/mkdocs/js/mustache.min.js', + base_url + '/mkdocs/js/lunr.min.js', + 'text!search-results-template.mustache', + 'text!../search_index.json', +], function (Mustache, lunr, results_template, data) { + "use strict"; + + function getSearchTerm() + { + var sPageURL = window.location.search.substring(1); + var sURLVariables = sPageURL.split('&'); + for (var i = 0; i < sURLVariables.length; i++) + { + var sParameterName = sURLVariables[i].split('='); + if (sParameterName[0] == 'q') + { + return decodeURIComponent(sParameterName[1].replace(/\+/g, '%20')); + } + } + } + + var index = lunr(function () { + this.field('title', {boost: 10}); + this.field('text'); + this.ref('location'); + }); + + data = JSON.parse(data); + var documents = {}; + + for (var i=0; i < data.docs.length; i++){ + var doc = data.docs[i]; + doc.location = base_url + doc.location; + index.add(doc); + documents[doc.location] = doc; + } + + var search = function(){ + + var query = document.getElementById('mkdocs-search-query').value; + var search_results = document.getElementById("mkdocs-search-results"); + while (search_results.firstChild) { + search_results.removeChild(search_results.firstChild); + } + + if(query === ''){ + return; + } + + var results = index.search(query); + + if (results.length > 0){ + for (var i=0; i < results.length; i++){ + var result = results[i]; + doc = documents[result.ref]; + doc.base_url = base_url; + doc.summary = doc.text.substring(0, 200); + var html = Mustache.to_html(results_template, doc); + search_results.insertAdjacentHTML('beforeend', html); + } + } else { + search_results.insertAdjacentHTML('beforeend', "

No results found

"); + } + + if(jQuery){ + /* + * We currently only automatically hide bootstrap models. This + * requires jQuery to work. + */ + jQuery('#mkdocs_search_modal a').click(function(){ + jQuery('#mkdocs_search_modal').modal('hide'); + }); + } + + }; + + var search_input = document.getElementById('mkdocs-search-query'); + + var term = getSearchTerm(); + if (term){ + search_input.value = term; + search(); + } + + search_input.addEventListener("keyup", search); + +}); diff --git a/mkdocs/js/text.js b/mkdocs/js/text.js new file mode 100644 index 0000000..17921b6 --- /dev/null +++ b/mkdocs/js/text.js @@ -0,0 +1,390 @@ +/** + * @license RequireJS text 2.0.12 Copyright (c) 2010-2014, The Dojo Foundation All Rights Reserved. + * Available via the MIT or new BSD license. + * see: http://github.com/requirejs/text for details + */ +/*jslint regexp: true */ +/*global require, XMLHttpRequest, ActiveXObject, + define, window, process, Packages, + java, location, Components, FileUtils */ + +define(['module'], function (module) { + 'use strict'; + + var text, fs, Cc, Ci, xpcIsWindows, + progIds = ['Msxml2.XMLHTTP', 'Microsoft.XMLHTTP', 'Msxml2.XMLHTTP.4.0'], + xmlRegExp = /^\s*<\?xml(\s)+version=[\'\"](\d)*.(\d)*[\'\"](\s)*\?>/im, + bodyRegExp = /]*>\s*([\s\S]+)\s*<\/body>/im, + hasLocation = typeof location !== 'undefined' && location.href, + defaultProtocol = hasLocation && location.protocol && location.protocol.replace(/\:/, ''), + defaultHostName = hasLocation && location.hostname, + defaultPort = hasLocation && (location.port || undefined), + buildMap = {}, + masterConfig = (module.config && module.config()) || {}; + + text = { + version: '2.0.12', + + strip: function (content) { + //Strips declarations so that external SVG and XML + //documents can be added to a document without worry. Also, if the string + //is an HTML document, only the part inside the body tag is returned. + if (content) { + content = content.replace(xmlRegExp, ""); + var matches = content.match(bodyRegExp); + if (matches) { + content = matches[1]; + } + } else { + content = ""; + } + return content; + }, + + jsEscape: function (content) { + return content.replace(/(['\\])/g, '\\$1') + .replace(/[\f]/g, "\\f") + .replace(/[\b]/g, "\\b") + .replace(/[\n]/g, "\\n") + .replace(/[\t]/g, "\\t") + .replace(/[\r]/g, "\\r") + .replace(/[\u2028]/g, "\\u2028") + .replace(/[\u2029]/g, "\\u2029"); + }, + + createXhr: masterConfig.createXhr || function () { + //Would love to dump the ActiveX crap in here. Need IE 6 to die first. + var xhr, i, progId; + if (typeof XMLHttpRequest !== "undefined") { + return new XMLHttpRequest(); + } else if (typeof ActiveXObject !== "undefined") { + for (i = 0; i < 3; i += 1) { + progId = progIds[i]; + try { + xhr = new ActiveXObject(progId); + } catch (e) {} + + if (xhr) { + progIds = [progId]; // so faster next time + break; + } + } + } + + return xhr; + }, + + /** + * Parses a resource name into its component parts. Resource names + * look like: module/name.ext!strip, where the !strip part is + * optional. + * @param {String} name the resource name + * @returns {Object} with properties "moduleName", "ext" and "strip" + * where strip is a boolean. + */ + parseName: function (name) { + var modName, ext, temp, + strip = false, + index = name.indexOf("."), + isRelative = name.indexOf('./') === 0 || + name.indexOf('../') === 0; + + if (index !== -1 && (!isRelative || index > 1)) { + modName = name.substring(0, index); + ext = name.substring(index + 1, name.length); + } else { + modName = name; + } + + temp = ext || modName; + index = temp.indexOf("!"); + if (index !== -1) { + //Pull off the strip arg. + strip = temp.substring(index + 1) === "strip"; + temp = temp.substring(0, index); + if (ext) { + ext = temp; + } else { + modName = temp; + } + } + + return { + moduleName: modName, + ext: ext, + strip: strip + }; + }, + + xdRegExp: /^((\w+)\:)?\/\/([^\/\\]+)/, + + /** + * Is an URL on another domain. Only works for browser use, returns + * false in non-browser environments. Only used to know if an + * optimized .js version of a text resource should be loaded + * instead. + * @param {String} url + * @returns Boolean + */ + useXhr: function (url, protocol, hostname, port) { + var uProtocol, uHostName, uPort, + match = text.xdRegExp.exec(url); + if (!match) { + return true; + } + uProtocol = match[2]; + uHostName = match[3]; + + uHostName = uHostName.split(':'); + uPort = uHostName[1]; + uHostName = uHostName[0]; + + return (!uProtocol || uProtocol === protocol) && + (!uHostName || uHostName.toLowerCase() === hostname.toLowerCase()) && + ((!uPort && !uHostName) || uPort === port); + }, + + finishLoad: function (name, strip, content, onLoad) { + content = strip ? text.strip(content) : content; + if (masterConfig.isBuild) { + buildMap[name] = content; + } + onLoad(content); + }, + + load: function (name, req, onLoad, config) { + //Name has format: some.module.filext!strip + //The strip part is optional. + //if strip is present, then that means only get the string contents + //inside a body tag in an HTML string. For XML/SVG content it means + //removing the declarations so the content can be inserted + //into the current doc without problems. + + // Do not bother with the work if a build and text will + // not be inlined. + if (config && config.isBuild && !config.inlineText) { + onLoad(); + return; + } + + masterConfig.isBuild = config && config.isBuild; + + var parsed = text.parseName(name), + nonStripName = parsed.moduleName + + (parsed.ext ? '.' + parsed.ext : ''), + url = req.toUrl(nonStripName), + useXhr = (masterConfig.useXhr) || + text.useXhr; + + // Do not load if it is an empty: url + if (url.indexOf('empty:') === 0) { + onLoad(); + return; + } + + //Load the text. Use XHR if possible and in a browser. + if (!hasLocation || useXhr(url, defaultProtocol, defaultHostName, defaultPort)) { + text.get(url, function (content) { + text.finishLoad(name, parsed.strip, content, onLoad); + }, function (err) { + if (onLoad.error) { + onLoad.error(err); + } + }); + } else { + //Need to fetch the resource across domains. Assume + //the resource has been optimized into a JS module. Fetch + //by the module name + extension, but do not include the + //!strip part to avoid file system issues. + req([nonStripName], function (content) { + text.finishLoad(parsed.moduleName + '.' + parsed.ext, + parsed.strip, content, onLoad); + }); + } + }, + + write: function (pluginName, moduleName, write, config) { + if (buildMap.hasOwnProperty(moduleName)) { + var content = text.jsEscape(buildMap[moduleName]); + write.asModule(pluginName + "!" + moduleName, + "define(function () { return '" + + content + + "';});\n"); + } + }, + + writeFile: function (pluginName, moduleName, req, write, config) { + var parsed = text.parseName(moduleName), + extPart = parsed.ext ? '.' + parsed.ext : '', + nonStripName = parsed.moduleName + extPart, + //Use a '.js' file name so that it indicates it is a + //script that can be loaded across domains. + fileName = req.toUrl(parsed.moduleName + extPart) + '.js'; + + //Leverage own load() method to load plugin value, but only + //write out values that do not have the strip argument, + //to avoid any potential issues with ! in file names. + text.load(nonStripName, req, function (value) { + //Use own write() method to construct full module value. + //But need to create shell that translates writeFile's + //write() to the right interface. + var textWrite = function (contents) { + return write(fileName, contents); + }; + textWrite.asModule = function (moduleName, contents) { + return write.asModule(moduleName, fileName, contents); + }; + + text.write(pluginName, nonStripName, textWrite, config); + }, config); + } + }; + + if (masterConfig.env === 'node' || (!masterConfig.env && + typeof process !== "undefined" && + process.versions && + !!process.versions.node && + !process.versions['node-webkit'])) { + //Using special require.nodeRequire, something added by r.js. + fs = require.nodeRequire('fs'); + + text.get = function (url, callback, errback) { + try { + var file = fs.readFileSync(url, 'utf8'); + //Remove BOM (Byte Mark Order) from utf8 files if it is there. + if (file.indexOf('\uFEFF') === 0) { + file = file.substring(1); + } + callback(file); + } catch (e) { + if (errback) { + errback(e); + } + } + }; + } else if (masterConfig.env === 'xhr' || (!masterConfig.env && + text.createXhr())) { + text.get = function (url, callback, errback, headers) { + var xhr = text.createXhr(), header; + xhr.open('GET', url, true); + + //Allow plugins direct access to xhr headers + if (headers) { + for (header in headers) { + if (headers.hasOwnProperty(header)) { + xhr.setRequestHeader(header.toLowerCase(), headers[header]); + } + } + } + + //Allow overrides specified in config + if (masterConfig.onXhr) { + masterConfig.onXhr(xhr, url); + } + + xhr.onreadystatechange = function (evt) { + var status, err; + //Do not explicitly handle errors, those should be + //visible via console output in the browser. + if (xhr.readyState === 4) { + status = xhr.status || 0; + if (status > 399 && status < 600) { + //An http 4xx or 5xx error. Signal an error. + err = new Error(url + ' HTTP status: ' + status); + err.xhr = xhr; + if (errback) { + errback(err); + } + } else { + callback(xhr.responseText); + } + + if (masterConfig.onXhrComplete) { + masterConfig.onXhrComplete(xhr, url); + } + } + }; + xhr.send(null); + }; + } else if (masterConfig.env === 'rhino' || (!masterConfig.env && + typeof Packages !== 'undefined' && typeof java !== 'undefined')) { + //Why Java, why is this so awkward? + text.get = function (url, callback) { + var stringBuffer, line, + encoding = "utf-8", + file = new java.io.File(url), + lineSeparator = java.lang.System.getProperty("line.separator"), + input = new java.io.BufferedReader(new java.io.InputStreamReader(new java.io.FileInputStream(file), encoding)), + content = ''; + try { + stringBuffer = new java.lang.StringBuffer(); + line = input.readLine(); + + // Byte Order Mark (BOM) - The Unicode Standard, version 3.0, page 324 + // http://www.unicode.org/faq/utf_bom.html + + // Note that when we use utf-8, the BOM should appear as "EF BB BF", but it doesn't due to this bug in the JDK: + // http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=4508058 + if (line && line.length() && line.charAt(0) === 0xfeff) { + // Eat the BOM, since we've already found the encoding on this file, + // and we plan to concatenating this buffer with others; the BOM should + // only appear at the top of a file. + line = line.substring(1); + } + + if (line !== null) { + stringBuffer.append(line); + } + + while ((line = input.readLine()) !== null) { + stringBuffer.append(lineSeparator); + stringBuffer.append(line); + } + //Make sure we return a JavaScript string and not a Java string. + content = String(stringBuffer.toString()); //String + } finally { + input.close(); + } + callback(content); + }; + } else if (masterConfig.env === 'xpconnect' || (!masterConfig.env && + typeof Components !== 'undefined' && Components.classes && + Components.interfaces)) { + //Avert your gaze! + Cc = Components.classes; + Ci = Components.interfaces; + Components.utils['import']('resource://gre/modules/FileUtils.jsm'); + xpcIsWindows = ('@mozilla.org/windows-registry-key;1' in Cc); + + text.get = function (url, callback) { + var inStream, convertStream, fileObj, + readData = {}; + + if (xpcIsWindows) { + url = url.replace(/\//g, '\\'); + } + + fileObj = new FileUtils.File(url); + + //XPCOM, you so crazy + try { + inStream = Cc['@mozilla.org/network/file-input-stream;1'] + .createInstance(Ci.nsIFileInputStream); + inStream.init(fileObj, 1, 0, false); + + convertStream = Cc['@mozilla.org/intl/converter-input-stream;1'] + .createInstance(Ci.nsIConverterInputStream); + convertStream.init(inStream, "utf-8", inStream.available(), + Ci.nsIConverterInputStream.DEFAULT_REPLACEMENT_CHARACTER); + + convertStream.readString(inStream.available(), readData); + convertStream.close(); + inStream.close(); + callback(readData.value); + } catch (e) { + throw new Error((fileObj && fileObj.path || '') + ': ' + e); + } + }; + } + return text; +}); diff --git a/mkdocs/search_index.json b/mkdocs/search_index.json new file mode 100644 index 0000000..2ac1840 --- /dev/null +++ b/mkdocs/search_index.json @@ -0,0 +1,474 @@ +{ + "docs": [ + { + "location": "/", + "text": "Python \u8d44\u6e90\u5927\u5168\u4e2d\u6587\u7248\n\n\n\u6211\u60f3\u5f88\u591a\u7a0b\u5e8f\u5458\u5e94\u8be5\u8bb0\u5f97 GitHub \u4e0a\u6709\u4e00\u4e2a Awesome - XXX \u7cfb\u5217\u7684\u8d44\u6e90\u6574\u7406\u3002\nawesome-python\n \u662f vinta \u53d1\u8d77\u7ef4\u62a4\u7684 Python \u8d44\u6e90\u5217\u8868\uff0c\u5185\u5bb9\u5305\u62ec\uff1aWeb \u6846\u67b6\u3001\u7f51\u7edc\u722c\u866b\u3001\u7f51\u7edc\u5185\u5bb9\u63d0\u53d6\u3001\u6a21\u677f\u5f15\u64ce\u3001\u6570\u636e\u5e93\u3001\u6570\u636e\u53ef\u89c6\u5316\u3001\u56fe\u7247\u5904\u7406\u3001\u6587\u672c\u5904\u7406\u3001\u81ea\u7136\u8bed\u8a00\u5904\u7406\u3001\u673a\u5668\u5b66\u4e60\u3001\u65e5\u5fd7\u3001\u4ee3\u7801\u5206\u6790\u7b49\u3002\u7531\u4f2f\u4e50\u5728\u7ebf\u6301\u7eed\u66f4\u65b0\u3002\n\n\nAwesome \u7cfb\u5217\u867d\u7136\u633a\u5168\uff0c\u4f46\u57fa\u672c\u53ea\u5bf9\u6536\u5f55\u7684\u8d44\u6e90\u505a\u4e86\u6781\u4e3a\u7b80\u8981\u7684\u4ecb\u7ecd\uff0c\u5982\u679c\u6709\u66f4\u8be6\u7ec6\u7684\u4e2d\u6587\u4ecb\u7ecd\uff0c\u5bf9\u76f8\u5e94\u5f00\u53d1\u8005\u7684\u5e2e\u52a9\u4f1a\u66f4\u5927\u3002\u8fd9\u4e5f\u662f\u6211\u4eec\u53d1\u8d77\u8fd9\u4e2a\u5f00\u6e90\u9879\u76ee\u7684\u521d\u8877\u3002\n\n\n\u6211\u4eec\u8981\u505a\u4ec0\u4e48\uff1f\n\n\n\n\n\u57fa\u4e8e awesome-python \u5217\u8868\uff0c\u6211\u4eec\u5c06\u5bf9\u5176\u4e2d\u7684\u5404\u4e2a\u8d44\u6e90\u9879\u8fdb\u884c\u7f16\u8bd1\u6574\u7406\u3002\u6b64\u5916\u8fd8\u5c06\u4ece\u5176\u4ed6\u6765\u6e90\u8865\u5145\u597d\u8d44\u6e90\u3002\n\n\n\u6574\u7406\u540e\u7684\u5185\u5bb9\uff0c\u5c06\u6536\u5f55\u5728\n\u4f2f\u4e50\u5728\u7ebf\u8d44\u6e90\u9891\u9053\n\u3002\u53ef\u53c2\u8003\u5df2\u6574\u7406\u7684\u5185\u5bb9\uff1a\n\n\n\u300a\nScrapy\uff1aPython \u7684\u722c\u866b\u6846\u67b6\n\u300b\n\n\n\u300a\nFlask\uff1a\u4e00\u4e2a\u4f7f\u7528 Python \u7f16\u5199\u7684\u8f7b\u91cf\u7ea7 Web \u5e94\u7528\u6846\u67b6\n\u300b\n\n\n\n\n\u5982\u4f55\u4e3a\u5217\u8868\u8d21\u732e\u65b0\u8d44\u6e90\uff1f\n\n\n\u6b22\u8fce\u5927\u5bb6\u4e3a\u5217\u8868\u8d21\u732e\u9ad8\u8d28\u91cf\u7684\u65b0\u8d44\u6e90\uff0c\u63d0\u4ea4 PR \u65f6\u8bf7\u53c2\u7167\u4ee5\u4e0b\u8981\u6c42\uff1a\n\n\n\n\n\u8bf7\u786e\u4fdd\u63a8\u8350\u7684\u8d44\u6e90\u81ea\u5df1\u4f7f\u7528\u8fc7\n\n\n\u63d0\u4ea4 PR \u65f6\u8bf7\u6ce8\u660e\u63a8\u8350\u7406\u7531\n\n\n\n\n\u8d44\u6e90\u5217\u8868\u7ba1\u7406\u6536\u5230 PR \u8bf7\u6c42\u540e\uff0c\u4f1a\u5b9a\u671f\uff08\u6bcf\u5468\uff09\u5728\u5fae\u535a\u8f6c\u53d1\u672c\u5468\u63d0\u4ea4\u7684 PR \u5217\u8868\uff0c\u5e76\u5728\u5fae\u535a\u4e0a\u9762\u542c\u53d6\u4f7f\u7528\u8fc7\u8fd9\u4e9b\u8d44\u6e90\u7684\u610f\u89c1\u3002\u786e\u8ba4\u901a\u8fc7\u540e\uff0c\u4f1a\u52a0\u5165\u8d44\u6e90\u5927\u5168\u3002\n\n\n\u611f\u8c22\u60a8\u7684\u8d21\u732e\uff01\n\n\n\u672c\u9879\u76ee\u7684\u53c2\u4e0e\u8005\n\n\n\n\n\u7ef4\u62a4\u8005\uff1a\n\n\n\u8d21\u732e\u8005\uff1a\n\u827e\u51cc\u98ce\n\u3001Namco\u3001\nDaetalus\n\u3001\n\u9ec4\u5229\u6c11\n\u3001\natupal\n\u3001\nrainbow\n\u3001\n\u6728\u5934lbj\n\u3001\nbeyondwu\n\u3001\ncissoid\n\u3001\n\u674e\u5e7f\u80dc\n\u3001\npolyval\n\u3001\n\u51b0\u658c\n\u3001\n\u8d75\u53f6\u5b87\n\u3001\n\u043b stalgic\n\u3001\n\u7855\u6069\n\u3001\nstrongit\n\u3001\nyuukilp\n\u3001\nchenjiandongx\n\u3001\nautopenguin\n\u3001\nvisonforcoding\n\u3001\nSuper\u8d5b\u4e9a\u4eba\n\n\n\n\n\u6ce8\uff1a\u540d\u5355\u4e0d\u5206\u6392\u540d\uff0c\u4e0d\u5b9a\u671f\u8865\u5145\u66f4\u65b0\n\n\n\u73af\u5883\u7ba1\u7406\n\n\n\u7ba1\u7406 Python \u7248\u672c\u548c\u73af\u5883\u7684\u5de5\u5177\n\n\n\n\np\uff1a\u975e\u5e38\u7b80\u5355\u7684\u4ea4\u4e92\u5f0f python \u7248\u672c\u7ba1\u7406\u5de5\u5177\u3002\n\u5b98\u7f51\n\n\npyenv\uff1a\u7b80\u5355\u7684 Python \u7248\u672c\u7ba1\u7406\u5de5\u5177\u3002\n\u5b98\u7f51\n\n\nVex\uff1a\u53ef\u4ee5\u5728\u865a\u62df\u73af\u5883\u4e2d\u6267\u884c\u547d\u4ee4\u3002\n\u5b98\u7f51\n\n\nvirtualenv\uff1a\u521b\u5efa\u72ec\u7acb Python \u73af\u5883\u7684\u5de5\u5177\u3002\n\u5b98\u7f51\n\n\nvirtualenvwrapper\uff1avirtualenv \u7684\u4e00\u7ec4\u6269\u5c55\u3002\n\u5b98\u7f51\n\n\n\n\n\u5305\u7ba1\u7406\n\n\n\u7ba1\u7406\u5305\u548c\u4f9d\u8d56\u7684\u5de5\u5177\u3002\n\n\n\n\npip\uff1aPython \u5305\u548c\u4f9d\u8d56\u5173\u7cfb\u7ba1\u7406\u5de5\u5177\u3002\n\u5b98\u7f51\n\n\npip-tools\uff1a\u4fdd\u8bc1 Python \u5305\u4f9d\u8d56\u5173\u7cfb\u66f4\u65b0\u7684\u4e00\u7ec4\u5de5\u5177\u3002\n\u5b98\u7f51\n\n\npipenv\uff1aPyhton \u5b98\u65b9\u63a8\u8350\u7684\u65b0\u4e00\u4ee3\u5305\u7ba1\u7406\u5de5\u5177\u3002\n\u5b98\u7f51\n\n\nconda\uff1a\u8de8\u5e73\u53f0\uff0cPython \u4e8c\u8fdb\u5236\u5305\u7ba1\u7406\u5de5\u5177\u3002\n\u5b98\u7f51\n\n\nCurdling\uff1a\u7ba1\u7406 Python \u5305\u7684\u547d\u4ee4\u884c\u5de5\u5177\u3002\n\u5b98\u7f51\n\n\nwheel\uff1aPython \u5206\u53d1\u7684\u65b0\u6807\u51c6\uff0c\u610f\u5728\u53d6\u4ee3 eggs\u3002\n\u5b98\u7f51\n\n\n\n\n\u5305\u4ed3\u5e93\n\n\n\u672c\u5730 PyPI \u4ed3\u5e93\u670d\u52a1\u548c\u4ee3\u7406\u3002\n\n\n\n\nwarehouse\n\uff1a\u4e0b\u4e00\u4ee3 PyPI\u3002\n\u5b98\u7f51\n\n\nbandersnatch\uff1aPyPA \u63d0\u4f9b\u7684 PyPI \u955c\u50cf\u5de5\u5177\u3002\n\u5b98\u7f51\n\n\ndevpi\uff1aPyPI \u670d\u52a1\u548c\u6253\u5305/\u6d4b\u8bd5/\u5206\u53d1\u5de5\u5177\u3002\n\u5b98\u7f51\n\n\nlocalshop\uff1a\u672c\u5730 PyPI \u670d\u52a1\uff08\u81ea\u5b9a\u4e49\u5305\u5e76\u4e14\u81ea\u52a8\u5bf9 PyPI \u955c\u50cf\uff09\u3002\n\u5b98\u7f51\n\n\n\n\n\u5206\u53d1\n\n\n\u6253\u5305\u4e3a\u53ef\u6267\u884c\u6587\u4ef6\u4ee5\u4fbf\u5206\u53d1\u3002\n\n\n\n\nPyInstaller\uff1a\u5c06 Python \u7a0b\u5e8f\u8f6c\u6362\u6210\u72ec\u7acb\u7684\u6267\u884c\u6587\u4ef6\uff08\u8de8\u5e73\u53f0\uff09\u3002\n\u5b98\u7f51\n\n\ndh-virtualenv\uff1a\u6784\u5efa\u5e76\u5c06 virtualenv \u865a\u62df\u73af\u5883\u4f5c\u4e3a\u4e00\u4e2a Debian \u5305\u6765\u53d1\u5e03\u3002\n\u5b98\u7f51\n\n\nNuitka\uff1a\u5c06\u811a\u672c\u3001\u6a21\u5757\u3001\u5305\u7f16\u8bd1\u6210\u53ef\u6267\u884c\u6587\u4ef6\u6216\u6269\u5c55\u6a21\u5757\u3002\n\u5b98\u7f51\n\n\npy2app\uff1a\u5c06 Python \u811a\u672c\u53d8\u4e3a\u72ec\u7acb\u8f6f\u4ef6\u5305\uff08Mac OS X\uff09\u3002\n\u5b98\u7f51\n\n\npy2exe\uff1a\u5c06 Python \u811a\u672c\u53d8\u4e3a\u72ec\u7acb\u8f6f\u4ef6\u5305\uff08Windows\uff09\u3002\n\u5b98\u7f51\n\n\npynsist\uff1a\u4e00\u4e2a\u7528\u6765\u521b\u5efa Windows \u5b89\u88c5\u7a0b\u5e8f\u7684\u5de5\u5177\uff0c\u53ef\u4ee5\u5728\u5b89\u88c5\u7a0b\u5e8f\u4e2d\u6253\u5305 Python \u672c\u8eab\u3002\n\u5b98\u7f51\n\n\n\n\n\u6784\u5efa\u5de5\u5177\n\n\n\u5c06\u6e90\u7801\u7f16\u8bd1\u6210\u8f6f\u4ef6\u3002\n\n\n\n\nbuildout\uff1a\u4e00\u4e2a\u6784\u5efa\u7cfb\u7edf\uff0c\u4ece\u591a\u4e2a\u7ec4\u4ef6\u6765\u521b\u5efa\uff0c\u7ec4\u88c5\u548c\u90e8\u7f72\u5e94\u7528\u3002\n\u5b98\u7f51\n\n\nBitBake\uff1a\u9488\u5bf9\u5d4c\u5165\u5f0f Linux \u7684\u7c7b\u4f3c make \u7684\u6784\u5efa\u5de5\u5177\u3002\n\u5b98\u7f51\n\n\nfabricate\uff1a\u5bf9\u4efb\u4f55\u8bed\u8a00\u81ea\u52a8\u627e\u5230\u4f9d\u8d56\u5173\u7cfb\u7684\u6784\u5efa\u5de5\u5177\u3002\n\u5b98\u7f51\n\n\nPlatformIO\uff1a\u591a\u5e73\u53f0\u547d\u4ee4\u884c\u6784\u5efa\u5de5\u5177\u3002\n\u5b98\u7f51\n\n\nPyBuilder\uff1a\u7eaf Python \u5b9e\u73b0\u7684\u6301\u7eed\u5316\u6784\u5efa\u5de5\u5177\u3002\n\u5b98\u7f51\n\n\nSCons\uff1a\u8f6f\u4ef6\u6784\u5efa\u5de5\u5177\u3002\n\u5b98\u7f51\n\n\n\n\n\u4ea4\u4e92\u5f0f\u89e3\u6790\u5668\n\n\n\u4ea4\u4e92\u5f0f Python \u89e3\u6790\u5668\u3002\n\n\n\n\nIPython\uff1a\u529f\u80fd\u4e30\u5bcc\u7684\u5de5\u5177\uff0c\u975e\u5e38\u6709\u6548\u7684\u4f7f\u7528\u4ea4\u4e92\u5f0f Python\u3002\n\u5b98\u7f51\n\n\nbpython\n\uff1a\u754c\u9762\u4e30\u5bcc\u7684 Python \u89e3\u6790\u5668\u3002\n\u5b98\u7f51\n\n\nptpython\uff1a\u9ad8\u7ea7\u4ea4\u4e92\u5f0f Python \u89e3\u6790\u5668\uff0c \u6784\u5efa\u4e8e \npython-prompt-toolkit\n \u4e4b\u4e0a\u3002\n\u5b98\u7f51\n\n\n\n\n\u6587\u4ef6\n\n\n\u6587\u4ef6\u7ba1\u7406\u548c MIME\uff08\u591a\u7528\u9014\u7684\u7f51\u9645\u90ae\u4ef6\u6269\u5145\u534f\u8bae\uff09\u7c7b\u578b\u68c0\u6d4b\u3002\n\n\n\n\naiofiles\uff1a\u57fa\u4e8e asyncio\uff0c\u63d0\u4f9b\u6587\u4ef6\u5f02\u6b65\u64cd\u4f5c\u3002\n\u5b98\u7f51\n\n\nimghdr\uff1a\uff08Python \u6807\u51c6\u5e93\uff09\u68c0\u6d4b\u56fe\u7247\u7c7b\u578b\u3002\n\u5b98\u7f51\n\n\nmimetypes\uff1a\uff08Python \u6807\u51c6\u5e93\uff09\u5c06\u6587\u4ef6\u540d\u6620\u5c04\u4e3a MIME \u7c7b\u578b\u3002\n\u5b98\u7f51\n\n\npath.py\uff1a\u5bf9 os.path \u8fdb\u884c\u5c01\u88c5\u7684\u6a21\u5757\u3002\n\u5b98\u7f51\n\n\npathlib\uff1a\uff08Python3.4+ \u6807\u51c6\u5e93\uff09\u8de8\u5e73\u53f0\u7684\u3001\u9762\u5411\u5bf9\u8c61\u7684\u8def\u5f84\u64cd\u4f5c\u5e93\u3002\n\u5b98\u7f51\n\n\npython-magic\uff1a\u6587\u4ef6\u7c7b\u578b\u68c0\u6d4b\u7684\u7b2c\u4e09\u65b9\u5e93 libmagic \u7684 Python \u63a5\u53e3\u3002\n\u5b98\u7f51\n\n\nUnipath\uff1a\u7528\u9762\u5411\u5bf9\u8c61\u7684\u65b9\u5f0f\u64cd\u4f5c\u6587\u4ef6\u548c\u76ee\u5f55\u3002\n\u5b98\u7f51\n\n\nwatchdog\uff1a\u7ba1\u7406\u6587\u4ef6\u7cfb\u7edf\u4e8b\u4ef6\u7684 API \u548c shell \u5de5\u5177\u3002\n\u5b98\u7f51\n\n\n\n\n\u65e5\u671f\u548c\u65f6\u95f4\n\n\n\u64cd\u4f5c\u65e5\u671f\u548c\u65f6\u95f4\u7684\u7c7b\u5e93\u3002\n\n\n\n\narrow\uff1a\u66f4\u597d\u7684 Python \u65e5\u671f\u65f6\u95f4\u64cd\u4f5c\u7c7b\u5e93\u3002\n\u5b98\u7f51\n\n\nChronyk\uff1aPython 3 \u7684\u7c7b\u5e93\uff0c\u7528\u4e8e\u89e3\u6790\u624b\u5199\u683c\u5f0f\u7684\u65f6\u95f4\u548c\u65e5\u671f\u3002\n\u5b98\u7f51\n\n\ndateutil\uff1aPython datetime \u6a21\u5757\u7684\u6269\u5c55\u3002\n\u5b98\u7f51\n\n\ndelorean\uff1a\u89e3\u51b3 Python \u4e2d\u6709\u5173\u65e5\u671f\u5904\u7406\u7684\u68d8\u624b\u95ee\u9898\u7684\u5e93\u3002\n\u5b98\u7f51\n\n\nmaya\uff1a\u4eba\u6027\u5316\u7684\u65f6\u95f4\u5904\u7406\u5e93\u3002\n\u5b98\u7f51\n\n\nmoment\uff1a\u4e00\u4e2a\u7528\u6765\u5904\u7406\u65f6\u95f4\u548c\u65e5\u671f\u7684 Python \u5e93\u3002\u7075\u611f\u6765\u81ea\u4e8e Moment.js\u3002\n\u5b98\u7f51\n\n\npendulum\uff1a\u4e00\u4e2a\u6bd4 arrow \u66f4\u5177\u6709\u660e\u786e\u7684\uff0c\u53ef\u9884\u6d4b\u7684\u884c\u4e3a\u7684\u65f6\u95f4\u64cd\u4f5c\u5e93\u3002\n\u5b98\u7f51\n\n\nPyTime\uff1a\u4e00\u4e2a\u7b80\u5355\u6613\u7528\u7684 Python \u6a21\u5757\uff0c\u7528\u4e8e\u901a\u8fc7\u5b57\u7b26\u4e32\u6765\u64cd\u4f5c\u65e5\u671f/\u65f6\u95f4\u3002\n\u5b98\u7f51\n\n\npytz\uff1a\u73b0\u4ee3\u4ee5\u53ca\u5386\u53f2\u7248\u672c\u7684\u4e16\u754c\u65f6\u533a\u5b9a\u4e49\u3002\u5c06\u65f6\u533a\u6570\u636e\u5e93\u5f15\u5165 Python\u3002\n\u5b98\u7f51\n\n\nwhen.py\uff1a\u63d0\u4f9b\u7528\u6237\u53cb\u597d\u7684\u51fd\u6570\u6765\u5e2e\u52a9\u7528\u6237\u8fdb\u884c\u5e38\u7528\u7684\u65e5\u671f\u548c\u65f6\u95f4\u64cd\u4f5c\u3002\n\u5b98\u7f51\n\n\n\n\n\u6587\u672c\u5904\u7406\n\n\n\u7528\u4e8e\u89e3\u6790\u548c\u64cd\u4f5c\u6587\u672c\u7684\u5e93\u3002\n\n\n\n\n\u901a\u7528\n\n\nchardet\n\uff1a\u5b57\u7b26\u7f16\u7801\u68c0\u6d4b\u5668\uff0c\u517c\u5bb9 Python2 \u548c Python3\u3002\n\u5b98\u7f51\n\n\ndifflib\uff1a(Python \u6807\u51c6\u5e93)\u5e2e\u52a9\u6211\u4eec\u8fdb\u884c\u5dee\u5f02\u5316\u6bd4\u8f83\u3002\n\u5b98\u7f51\n\n\nftfy\uff1a\u8ba9 Unicode \u6587\u672c\u66f4\u5b8c\u6574\u66f4\u8fde\u8d2f\u3002\n\u5b98\u7f51\n\n\nfuzzywuzzy\uff1a\u6a21\u7cca\u5b57\u7b26\u4e32\u5339\u914d\u3002\n\u5b98\u7f51\n\n\nLevenshtein\uff1a\u5feb\u901f\u8ba1\u7b97\u7f16\u8f91\u8ddd\u79bb\u4ee5\u53ca\u5b57\u7b26\u4e32\u7684\u76f8\u4f3c\u5ea6\u3002\n\u5b98\u7f51\n\n\npangu.py\uff1a\u5728\u4e2d\u65e5\u97e9\u8bed\u5b57\u7b26\u548c\u6570\u5b57\u5b57\u6bcd\u4e4b\u95f4\u6dfb\u52a0\u7a7a\u683c\u3002\n\u5b98\u7f51\n\n\npypinyin\uff1a\u6c49\u5b57\u62fc\u97f3\u8f6c\u6362\u5de5\u5177 Python \u7248\u3002\n\u5b98\u7f51\n\n\nshortuuid\uff1a\u4e00\u4e2a\u751f\u6210\u5668\u5e93\uff0c\u7528\u4ee5\u751f\u6210\u7b80\u6d01\u7684\uff0c\u660e\u767d\u7684\uff0cURL \u5b89\u5168\u7684 UUID\u3002\n\u5b98\u7f51\n\n\nsimplejson\n\uff1aPython \u7684 JSON \u7f16\u7801\u3001\u89e3\u7801\u5668\u3002\n\u5b98\u7f51\n\n\nunidecode\uff1aUnicode \u6587\u672c\u7684 ASCII \u8f6c\u6362\u5f62\u5f0f \u3002\n\u5b98\u7f51\n\n\nuniout\uff1a\u6253\u5370\u53ef\u8bfb\u7684\u5b57\u7b26\uff0c\u800c\u4e0d\u662f\u8f6c\u4e49\u7684\u5b57\u7b26\u4e32\u3002\n\u5b98\u7f51\n\n\nxpinyin\uff1a\u4e00\u4e2a\u7528\u4e8e\u628a\u6c49\u5b57\u8f6c\u6362\u4e3a\u62fc\u97f3\u7684\u5e93\u3002\n\u5b98\u7f51\n\n\nyfiglet-figlet\uff1a\npyfiglet -figlet\n \u7684 Python \u5b9e\u73b0\u3002\n\n\n\n\n\n\nSlug \u5316\n\n\nawesome-slugify\uff1a\u4e00\u4e2a Python slug \u5316\u5e93\uff0c\u53ef\u4ee5\u4fdd\u6301 Unicode\u3002\n\u5b98\u7f51\n\n\npython-slugify\uff1aPython slug \u5316\u5e93\uff0c\u53ef\u4ee5\u628a unicode \u8f6c\u5316\u4e3a ASCII\u3002\n\u5b98\u7f51\n\n\nunicode-slugify\uff1a\u4e00\u4e2a slug \u5de5\u5177\uff0c\u53ef\u4ee5\u751f\u6210 unicode slugs ,\u9700\u8981\u4f9d\u8d56 Django \u3002\n\u5b98\u7f51\n\n\n\n\n\n\n\u89e3\u6790\u5668\n\n\nphonenumbers\uff1a\u89e3\u6790\uff0c\u683c\u5f0f\u5316\uff0c\u50a8\u5b58\uff0c\u9a8c\u8bc1\u7535\u8bdd\u53f7\u7801\u3002\n\u5b98\u7f51\n\n\nPLY\uff1alex \u548c yacc \u89e3\u6790\u5de5\u5177\u7684 Python \u5b9e\u73b0\u3002\n\u5b98\u7f51\n\n\nPygments\uff1a\u901a\u7528\u8bed\u6cd5\u9ad8\u4eae\u5de5\u5177\u3002\n\u5b98\u7f51\n\n\npyparsing\uff1a\u751f\u6210\u901a\u7528\u89e3\u6790\u5668\u7684\u6846\u67b6\u3002\n\u5b98\u7f51\n\n\npython-nameparser\uff1a\u628a\u4e00\u4e2a\u4eba\u540d\u5206\u89e3\u4e3a\u51e0\u4e2a\u72ec\u7acb\u7684\u90e8\u5206\u3002\n\u5b98\u7f51\n\n\npython-user-agents\uff1a\u6d4f\u89c8\u5668 user agent \u89e3\u6790\u5668\u3002\n\u5b98\u7f51\n\n\nsqlparse\uff1a\u4e00\u4e2a\u65e0\u9a8c\u8bc1\u7684 SQL \u89e3\u6790\u5668\u3002\n\u5b98\u7f51\n\n\n\n\n\n\n\n\n\u7279\u6b8a\u6587\u672c\u683c\u5f0f\u5904\u7406\n\n\n\u4e00\u4e9b\u7528\u6765\u89e3\u6790\u548c\u64cd\u4f5c\u7279\u6b8a\u6587\u672c\u683c\u5f0f\u7684\u5e93\u3002\n\n\n\n\n\u901a\u7528\n\n\ntablib\uff1a\u4e00\u4e2a\u7528\u6765\u5904\u7406\u4e2d\u8868\u683c\u6570\u636e\u7684\u6a21\u5757\u3002\n\u5b98\u7f51\n\n\n\n\n\n\nOffice\n\n\nMarmir\uff1a\u628a\u8f93\u5165\u7684 Python \u6570\u636e\u7ed3\u6784\u8f6c\u6362\u4e3a\u7535\u5b50\u8868\u5355\u3002\n\u5b98\u7f51\n\n\nopenpyxl\uff1a\u4e00\u4e2a\u7528\u6765\u8bfb\u5199 Excel 2010 xlsx/xlsm/xltx/xltm \u6587\u4ef6\u7684\u5e93\u3002\n\u5b98\u7f51\n\n\npyexcel\uff1a\u4e00\u4e2a\u63d0\u4f9b\u7edf\u4e00 API\uff0c\u7528\u6765\u8bfb\u5199\uff0c\u64cd\u4f5c Excel \u6587\u4ef6\u7684\u5e93\u3002\n\u5b98\u7f51\n\n\npython-docx\uff1a\u8bfb\u53d6\uff0c\u67e5\u8be2\u4ee5\u53ca\u4fee\u6539 Microsoft Word 2007/2008 docx \u6587\u4ef6\u3002\n\u5b98\u7f51\n\n\nrelatorio\uff1a\u6a21\u677f\u5316 OpenDocument \u6587\u4ef6\u3002\n\u5b98\u7f51\n\n\nunoconv\uff1a\u5728 LibreOffice/OpenOffice \u652f\u6301\u7684\u4efb\u610f\u6587\u4ef6\u683c\u5f0f\u4e4b\u95f4\u8fdb\u884c\u8f6c\u6362\u3002\n\u5b98\u7f51\n\n\nXlsxWriter\uff1a\u4e00\u4e2a\u7528\u4e8e\u521b\u5efa Excel .xlsx \u6587\u4ef6\u7684 Python \u6a21\u5757\u3002\n\u5b98\u7f51\n\n\nxlwings\uff1a\u4e00\u4e2a\u4f7f\u5f97\u5728 Excel \u4e2d\u65b9\u4fbf\u8c03\u7528 Python \u7684\u5e93\uff08\u53cd\u4e4b\u4ea6\u7136\uff09\uff0c\u57fa\u4e8e BSD \u534f\u8bae\u3002\n\u5b98\u7f51\n\n\nxlwt\n\uff1a\u8bfb\u5199 Excel \u6587\u4ef6\u7684\u6570\u636e\u548c\u683c\u5f0f\u4fe1\u606f\u3002\n\u5b98\u7f51\n / \nxlrd\n\n\n\n\n\n\nPDF\n\n\nPDFMiner\uff1a\u4e00\u4e2a\u7528\u4e8e\u4ece PDF \u6587\u6863\u4e2d\u62bd\u53d6\u4fe1\u606f\u7684\u5de5\u5177\u3002\n\u5b98\u7f51\n\n\nPyPDF2\uff1a\u4e00\u4e2a\u53ef\u4ee5\u5206\u5272\uff0c\u5408\u5e76\u548c\u8f6c\u6362 PDF \u9875\u9762\u7684\u5e93\u3002\n\u5b98\u7f51\n\n\nReportLab\uff1a\u5feb\u901f\u521b\u5efa\u5bcc\u6587\u672c PDF \u6587\u6863\u3002\n\u5b98\u7f51\n\n\n\n\n\n\nMarkdown\n\n\nMistune\uff1a\u5feb\u901f\u5e76\u4e14\u529f\u80fd\u9f50\u5168\u7684\u7eaf Python \u5b9e\u73b0\u7684 Markdown \u89e3\u6790\u5668\u3002\n\u5b98\u7f51\n\n\nPython-Markdown\uff1aJohn Gruber\u2019s Markdown \u7684 Python \u7248\u5b9e\u73b0\u3002\n\u5b98\u7f51\n\n\nPython-Markdown2\uff1a\u7eaf Python \u5b9e\u73b0\u7684 Markdown \u89e3\u6790\u5668\uff0c\u6bd4 Python-Markdown \u66f4\u5feb\uff0c\u66f4\u51c6\u786e\uff0c\u53ef\u6269\u5c55\u3002\n\u5b98\u7f51\n\n\n\n\n\n\nYAML\n\n\nPyYAML\uff1aPython \u7248\u672c\u7684 YAML \u89e3\u6790\u5668\u3002\n\u5b98\u7f51\n\n\n\n\n\n\nCSV\n\n\ncsvkit\uff1a\u7528\u4e8e\u8f6c\u6362\u548c\u64cd\u4f5c CSV \u7684\u5de5\u5177\u3002\n\u5b98\u7f51\n\n\n\n\n\n\nArchive\n\n\nunp\uff1a\u4e00\u4e2a\u7528\u6765\u65b9\u4fbf\u89e3\u5305\u5f52\u6863\u6587\u4ef6\u7684\u547d\u4ee4\u884c\u5de5\u5177\u3002\n\u5b98\u7f51\n\n\n\n\n\n\n\n\n\u81ea\u7136\u8bed\u8a00\u5904\u7406\n\n\n\u7528\u6765\u5904\u7406\u4eba\u7c7b\u8bed\u8a00\u7684\u5e93\u3002\n\n\n\n\nNLTK\n\uff1a\u4e00\u4e2a\u5148\u8fdb\u7684\u5e73\u53f0\uff0c\u7528\u4ee5\u6784\u5efa\u5904\u7406\u4eba\u7c7b\u8bed\u8a00\u6570\u636e\u7684 Python \u7a0b\u5e8f\u3002\n\u5b98\u7f51\n\n\njieba\uff1a\u4e2d\u6587\u5206\u8bcd\u5de5\u5177\u3002\n\u5b98\u7f51\n\n\nlangid.py\uff1a\u72ec\u7acb\u7684\u8bed\u8a00\u8bc6\u522b\u7cfb\u7edf\u3002\n\u5b98\u7f51\n\n\nPattern\uff1aPython \u7f51\u7edc\u4fe1\u606f\u6316\u6398\u6a21\u5757\u3002\n\u5b98\u7f51\n\n\nSnowNLP\uff1a\u4e00\u4e2a\u7528\u6765\u5904\u7406\u4e2d\u6587\u6587\u672c\u7684\u5e93\u3002\n\u5b98\u7f51\n\n\nTextBlob\uff1a\u4e3a\u8fdb\u884c\u666e\u901a\u81ea\u7136\u8bed\u8a00\u5904\u7406\u4efb\u52a1\u63d0\u4f9b\u4e00\u81f4\u7684 API\u3002\n\u5b98\u7f51\n\n\nTextGrocery\uff1a\u4e00\u7b80\u5355\u9ad8\u6548\u7684\u77ed\u6587\u672c\u5206\u7c7b\u5de5\u5177\uff0c\u57fa\u4e8e LibLinear \u548c Jieba\u3002\n\u5b98\u7f51\n\n\nthulac:\u6e05\u534e\u5927\u5b66\u81ea\u7136\u8bed\u8a00\u5904\u7406\u4e0e\u793e\u4f1a\u4eba\u6587\u8ba1\u7b97\u5b9e\u9a8c\u5ba4\u7814\u5236\u63a8\u51fa\u7684\u4e00\u5957\u4e2d\u6587\u8bcd\u6cd5\u5206\u6790\u5de5\u5177\u5305\n\u5b98\u7f51\n\n\n\n\n\u6587\u6863\n\n\n\u7528\u4ee5\u751f\u6210\u9879\u76ee\u6587\u6863\u7684\u5e93\u3002\n\n\n\n\nSphinx\n\uff1aPython \u6587\u6863\u751f\u6210\u5668\u3002\n\u5b98\u7f51\n\n\nawesome-sphinxdoc\uff1a\n\u5b98\u7f51\n\n\nMkDocs\uff1a\u5bf9 Markdown \u53cb\u597d\u7684\u6587\u6863\u751f\u6210\u5668\u3002\n\u5b98\u7f51\n\n\npdoc\uff1a\u4e00\u4e2a\u53ef\u4ee5\u66ff\u6362 Epydoc \u7684\u5e93\uff0c\u53ef\u4ee5\u81ea\u52a8\u751f\u6210 Python \u5e93\u7684 API \u6587\u6863\u3002\n\u5b98\u7f51\n\n\nPycco\uff1a\u6587\u5b66\u7f16\u7a0b\uff08literate-programming\uff09\u98ce\u683c\u7684\u6587\u6863\u751f\u6210\u5668\u3002\n\u5b98\u7f51\n\n\nreadthedocs\uff1a\u4e00\u4e2a\u57fa\u4e8e Sphinx/MkDocs \u7684\u5728\u7ebf\u6587\u6863\u6258\u7ba1\u7cfb\u7edf\uff0c\u5bf9\u5f00\u6e90\u9879\u76ee\u514d\u8d39\u5f00\u653e\u4f7f\u7528\u3002\n\u5b98\u7f51\n\n\n\n\n\u914d\u7f6e\n\n\n\u7528\u6765\u4fdd\u5b58\u548c\u89e3\u6790\u914d\u7f6e\u7684\u5e93\u3002\n\n\n\n\nconfig\uff1a\nlogging\n \u6a21\u5757\u4f5c\u8005\u5199\u7684\u5206\u7ea7\u914d\u7f6e\u6a21\u5757\u3002\n\u5b98\u7f51\n\n\nConfigObj\uff1aINI \u6587\u4ef6\u89e3\u6790\u5668\uff0c\u5e26\u9a8c\u8bc1\u529f\u80fd\u3002\n\u5b98\u7f51\n\n\nConfigParser\uff1a(Python \u6807\u51c6\u5e93) INI \u6587\u4ef6\u89e3\u6790\u5668\u3002\n\u5b98\u7f51\n\n\nprofig\uff1a\u901a\u8fc7\u591a\u79cd\u683c\u5f0f\u8fdb\u884c\u914d\u7f6e\uff0c\u5177\u6709\u6570\u503c\u8f6c\u6362\u529f\u80fd\u3002\n\u5b98\u7f51\n\n\npython-decouple\uff1a\u5c06\u8bbe\u7f6e\u548c\u4ee3\u7801\u5b8c\u5168\u9694\u79bb\u3002\n\u5b98\u7f51\n\n\n\n\n\u547d\u4ee4\u884c\u5de5\u5177\n\n\n\u7528\u4e8e\u521b\u5efa\u547d\u4ee4\u884c\u7a0b\u5e8f\u7684\u5e93\u3002\n\n\n\n\n\u547d\u4ee4\u884c\u7a0b\u5e8f\u5f00\u53d1\n\n\nasciimatics\uff1a\u8de8\u5e73\u53f0\uff0c\u5168\u5c4f\u7ec8\u7aef\u5305\uff08\u5373\u9f20\u6807/\u952e\u76d8\u8f93\u5165\u548c\u5f69\u8272\uff0c\u5b9a\u4f4d\u6587\u672c\u8f93\u51fa\uff09\uff0c\u5b8c\u6574\u7684\u590d\u6742\u52a8\u753b\u548c\u7279\u6b8a\u6548\u679c\u7684\u9ad8\u7ea7 API\u3002\n\u5b98\u7f51\n\n\ncement\uff1aPython \u7684\u547d\u4ee4\u884c\u7a0b\u5e8f\u6846\u67b6\u3002\n\u5b98\u7f51\n\n\nclick\uff1a\u4e00\u4e2a\u901a\u8fc7\u7ec4\u5408\u7684\u65b9\u5f0f\u6765\u521b\u5efa\u7cbe\u7f8e\u547d\u4ee4\u884c\u754c\u9762\u7684\u5305\u3002\n\u5b98\u7f51\n\n\ncliff\uff1a\u4e00\u4e2a\u7528\u4e8e\u521b\u5efa\u547d\u4ee4\u884c\u7a0b\u5e8f\u7684\u6846\u67b6\uff0c\u53ef\u4ee5\u521b\u5efa\u5177\u6709\u591a\u5c42\u547d\u4ee4\u7684\u547d\u4ee4\u884c\u7a0b\u5e8f\u3002\n\u5b98\u7f51\n\n\nclint\uff1aPython \u547d\u4ee4\u884c\u7a0b\u5e8f\u5de5\u5177\u3002\n\u5b98\u7f51\n\n\ncolorama\uff1a\u8de8\u5e73\u53f0\u5f69\u8272\u7ec8\u7aef\u6587\u672c\u3002\n\u5b98\u7f51\n\n\ndocopt\uff1aPython \u98ce\u683c\u7684\u547d\u4ee4\u884c\u53c2\u6570\u89e3\u6790\u5668\u3002\n\u5b98\u7f51\n\n\nGooey\uff1a\u4e00\u6761\u547d\u4ee4\uff0c\u5c06\u547d\u4ee4\u884c\u7a0b\u5e8f\u53d8\u6210\u4e00\u4e2a GUI \u7a0b\u5e8f\u3002\n\u5b98\u7f51\n\n\npython-prompt-toolkit\uff1a\u4e00\u4e2a\u7528\u4e8e\u6784\u5efa\u5f3a\u5927\u7684\u4ea4\u4e92\u5f0f\u547d\u4ee4\u884c\u7a0b\u5e8f\u7684\u5e93\u3002\n\u5b98\u7f51\n\n\npython-fire\uff1aGoogle \u51fa\u54c1\u7684\u4e00\u4e2a\u57fa\u4e8e Python \u7c7b\u7684\u6784\u5efa\u547d\u4ee4\u884c\u754c\u9762\u7684\u5e93\u3002\n\u5b98\u7f51\n\n\nPythonpy\n\uff1a\u5728\u547d\u4ee4\u884c\u4e2d\u76f4\u63a5\u6267\u884c\u4efb\u4f55 Python \u6307\u4ee4\u3002\n\u5b98\u7f51\n\n\n\n\n\n\n\u751f\u4ea7\u529b\u5de5\u5177\n\n\naws-cli\uff1aAmazon Web Services \u7684\u901a\u7528\u547d\u4ee4\u884c\u754c\u9762\u3002\n\u5b98\u7f51\n\n\nbashplotlib\uff1a\u5728\u7ec8\u7aef\u4e2d\u8fdb\u884c\u57fa\u672c\u7ed8\u56fe\u3002\n\u5b98\u7f51\n\n\ncaniusepython3\uff1a\u5224\u65ad\u662f\u54ea\u4e2a\u9879\u76ee\u59a8\u788d\u4f60\u4f60\u79fb\u690d\u5230 Python3\u3002\n\u5b98\u7f51\n\n\ncookiecutter\uff1a\u4ece cookiecutters\uff08\u9879\u76ee\u6a21\u677f\uff09\u521b\u5efa\u9879\u76ee\u7684\u4e00\u4e2a\u547d\u4ee4\u884c\u5de5\u5177\u3002\n\u5b98\u7f51\n\n\ndoitlive\uff1a\u4e00\u4e2a\u7528\u6765\u5728\u7ec8\u7aef\u4e2d\u8fdb\u884c\u73b0\u573a\u6f14\u793a\u7684\u5de5\u5177\u3002\n\u5b98\u7f51\n\n\npyftpdlib\uff1a\u4e00\u4e2a\u901f\u5ea6\u6781\u5feb\u548c\u53ef\u6269\u5c55\u7684 Python FTP \u670d\u52a1\u5e93\u3002\n\u5b98\u7f51\n\n\nhowdoi\uff1a\u901a\u8fc7\u547d\u4ee4\u884c\u83b7\u53d6\u5373\u65f6\u7684\u7f16\u7a0b\u95ee\u9898\u89e3\u7b54\u3002\n\u5b98\u7f51\n\n\nhttpie\uff1a\u4e00\u4e2a\u547d\u4ee4\u884c HTTP \u5ba2\u6237\u7aef\uff0ccURL \u7684\u66ff\u4ee3\u54c1\uff0c\u6613\u7528\u6027\u66f4\u597d\u3002\n\u5b98\u7f51\n\n\nPathPicker\uff1a\u4ece bash \u8f93\u51fa\u4e2d\u9009\u51fa\u6587\u4ef6\u3002\n\u5b98\u7f51\n\n\npercol\uff1a\u5411 UNIX shell \u4f20\u7edf\u7ba1\u9053\u6982\u5ff5\u4e2d\u52a0\u5165\u4ea4\u4e92\u5f0f\u9009\u62e9\u529f\u80fd\u3002\n\u5b98\u7f51\n\n\nSAWS\uff1a\u4e00\u4e2a\u52a0\u5f3a\u7248\u7684 AWS \u547d\u4ee4\u884c\u3002\n\u5b98\u7f51\n\n\nthefuck\uff1a\u4fee\u6b63\u4f60\u4e4b\u524d\u7684\u547d\u4ee4\u884c\u6307\u4ee4\u3002\n\u5b98\u7f51\n\n\nmycli\uff1a\u4e00\u4e2a MySQL \u547d\u4ee4\u884c\u5ba2\u6237\u7aef\uff0c\u5177\u6709\u81ea\u52a8\u8865\u5168\u548c\u8bed\u6cd5\u9ad8\u4eae\u529f\u80fd\u3002\n\u5b98\u7f51\n\n\npgcli\uff1aPostgres \u547d\u4ee4\u884c\u5de5\u5177\uff0c\u5177\u6709\u81ea\u52a8\u8865\u5168\u548c\u8bed\u6cd5\u9ad8\u4eae\u529f\u80fd\u3002\n\u5b98\u7f51\n\n\ntry\uff1a\u4e00\u4e2a\u4ece\u6765\u6ca1\u6709\u66f4\u7b80\u5355\u7684\u547d\u4ee4\u884c\u5de5\u5177\uff0c\u7528\u6765\u8bd5\u7528 python \u5e93\u3002\n\u5b98\u7f51\n\n\n\n\n\n\n\n\n\u4e0b\u8f7d\u5668\n\n\n\u7528\u6765\u8fdb\u884c\u4e0b\u8f7d\u7684\u5e93.\n\n\n\n\ns3cmd\uff1a\u4e00\u4e2a\u7528\u6765\u7ba1\u7406 Amazon S3 \u548c CloudFront \u7684\u547d\u4ee4\u884c\u5de5\u5177\u3002\n\u5b98\u7f51\n\n\ns4cmd\uff1a\u8d85\u7ea7 S3 \u547d\u4ee4\u884c\u5de5\u5177\uff0c\u6027\u80fd\u66f4\u52a0\u5f3a\u52b2\u3002\n\u5b98\u7f51\n\n\nyou-get\uff1a\u4e00\u4e2a YouTube/Youku/Niconico \u89c6\u9891\u4e0b\u8f7d\u5668\uff0c\u4f7f\u7528 Python3 \u7f16\u5199\u3002\n\u5b98\u7f51\n\n\nyoutube-dl\uff1a\u4e00\u4e2a\u5c0f\u5de7\u7684\u547d\u4ee4\u884c\u7a0b\u5e8f\uff0c\u7528\u6765\u4e0b\u8f7d YouTube \u89c6\u9891\u3002\n\u5b98\u7f51\n\n\n\n\n\u56fe\u50cf\u5904\u7406\n\n\n\u7528\u6765\u64cd\u4f5c\u56fe\u50cf\u7684\u5e93.\n\n\n\n\npillow\n\uff1aPillow \u662f\u4e00\u4e2a\u66f4\u52a0\u6613\u7528\u7248\u7684 \nPIL\n\u3002\n\u5b98\u7f51\n\n\nhmap\uff1a\u56fe\u50cf\u76f4\u65b9\u56fe\u6620\u5c04\u3002\n\u5b98\u7f51\n\n\nimgSeek\uff1a\u4e00\u4e2a\u4f7f\u7528\u89c6\u89c9\u76f8\u4f3c\u6027\u641c\u7d22\u4e00\u7ec4\u56fe\u7247\u96c6\u5408\u7684\u9879\u76ee\u3002\n\u5b98\u7f51\n\n\nnude.py\uff1a\u88f8\u4f53\u68c0\u6d4b\u3002\n\u5b98\u7f51\n\n\npyBarcode\uff1a\u4e0d\u501f\u52a9 PIL \u5e93\u5728 Python \u7a0b\u5e8f\u4e2d\u751f\u6210\u6761\u5f62\u7801\u3002\n\u5b98\u7f51\n\n\npygram\uff1a\u7c7b\u4f3c Instagram \u7684\u56fe\u50cf\u6ee4\u955c\u3002\n\u5b98\u7f51\n\n\npython-qrcode\uff1a\u4e00\u4e2a\u7eaf Python \u5b9e\u73b0\u7684\u4e8c\u7ef4\u7801\u751f\u6210\u5668\u3002\n\u5b98\u7f51\n\n\nQuads\uff1a\u57fa\u4e8e\u56db\u53c9\u6811\u7684\u8ba1\u7b97\u673a\u827a\u672f\u3002\n\u5b98\u7f51\n\n\nscikit-image\uff1a\u4e00\u4e2a\u7528\u4e8e\uff08\u79d1\u5b66\uff09\u56fe\u50cf\u5904\u7406\u7684 Python \u5e93\u3002\n\u5b98\u7f51\n\n\nthumbor\uff1a\u4e00\u4e2a\u5c0f\u578b\u56fe\u50cf\u670d\u52a1\uff0c\u5177\u6709\u526a\u88c1\uff0c\u5c3a\u5bf8\u91cd\u8bbe\u548c\u7ffb\u8f6c\u529f\u80fd\u3002\n\u5b98\u7f51\n\n\nwand\uff1a\nMagickWand\n\u7684 Python \u7ed1\u5b9a\u3002MagickWand \u662f ImageMagick \u7684 C API \u3002\n\u5b98\u7f51\n\n\nface_recognition\uff1a\u7b80\u5355\u6613\u7528\u7684 python \u4eba\u8138\u8bc6\u522b\u5e93\u3002\n\u5b98\u7f51\n\n\n\n\nOCR\n\n\n\u5149\u5b66\u5b57\u7b26\u8bc6\u522b\u5e93\u3002\n\n\n\n\npyocr\uff1aTesseract \u548c Cuneiform \u7684\u4e00\u4e2a\u5c01\u88c5(wrapper)\u3002\n\u5b98\u7f51\n\n\npytesseract\n\uff1a\nGoogle Tesseract OCR\n \u7684\u53e6\u4e00\u4e2a\u5c01\u88c5(wrapper)\u3002\n\u5b98\u7f51\n\n\npython-tesseract\uff1a\nGoogle Tesseract OCR\n\u00a0\u7684\u4e00\u4e2a\u5305\u88c5\u7c7b\u3002\n\n\n\n\n\u97f3\u9891\n\n\n\u7528\u6765\u64cd\u4f5c\u97f3\u9891\u7684\u5e93\n\n\n\n\naudiolazy\uff1aPython \u7684\u6570\u5b57\u4fe1\u53f7\u5904\u7406\u5305\u3002\n\u5b98\u7f51\n \n\n\naudioread\uff1a\u4ea4\u53c9\u5e93 (GStreamer + Core Audio + MAD + FFmpeg) \u97f3\u9891\u89e3\u7801\u3002\n\u5b98\u7f51\n\n\nbeets\uff1a\u4e00\u4e2a\u97f3\u4e50\u5e93\u7ba1\u7406\u5de5\u5177\u53ca \nMusicBrainz\n \u6807\u7b7e\u6dfb\u52a0\u5de5\u5177\u3002\n\u5b98\u7f51\n\n\ndejavu\uff1a\u97f3\u9891\u6307\u7eb9\u63d0\u53d6\u548c\u8bc6\u522b\u3002\n\u5b98\u7f51\n\n\ndjango-elastic-transcoder\n\uff1aDjango + \nAmazon Elastic Transcoder\n\u3002\n\u5b98\u7f51\n\n\neyeD3\uff1a\u4e00\u4e2a\u7528\u6765\u64cd\u4f5c\u97f3\u9891\u6587\u4ef6\u7684\u5de5\u5177\uff0c\u5177\u4f53\u6765\u8bb2\u5c31\u662f\u5305\u542b ID3 \u5143\u4fe1\u606f\u7684 MP3 \u6587\u4ef6\u3002\n\u5b98\u7f51\n\n\nid3reader\uff1a\u4e00\u4e2a\u7528\u6765\u8bfb\u53d6 MP3 \u5143\u6570\u636e\u7684 Python \u6a21\u5757\u3002\n\u5b98\u7f51\n\n\nm3u8\uff1a\u4e00\u4e2a\u7528\u6765\u89e3\u6790 m3u8 \u6587\u4ef6\u7684\u6a21\u5757\u3002\n\u5b98\u7f51\n\n\nmutagen\uff1a\u4e00\u4e2a\u7528\u6765\u5904\u7406\u97f3\u9891\u5143\u6570\u636e\u7684 Python \u6a21\u5757\u3002\n\u5b98\u7f51\n\n\npydub\uff1a\u901a\u8fc7\u7b80\u5355\u3001\u7b80\u6d01\u7684\u9ad8\u5c42\u63a5\u53e3\u6765\u64cd\u4f5c\u97f3\u9891\u6587\u4ef6\u3002\n\u5b98\u7f51\n\n\npyechonest\uff1a\nEcho Nest\n API \u7684 Python \u5ba2\u6237\u7aef\u3002\n\u5b98\u7f51\n\n\ntalkbox\uff1a\u4e00\u4e2a\u7528\u6765\u5904\u7406\u6f14\u8bb2/\u4fe1\u53f7\u7684 Python \u5e93\u3002\n\u5b98\u7f51\n\n\nTimeSide\uff1a\u5f00\u6e90 web \u97f3\u9891\u5904\u7406\u6846\u67b6\u3002\n\u5b98\u7f51\n\n\ntinytag\uff1a\u4e00\u4e2a\u7528\u6765\u8bfb\u53d6 MP3, OGG, FLAC \u4ee5\u53ca Wave \u6587\u4ef6\u97f3\u4e50\u5143\u6570\u636e\u7684\u5e93\u3002\n\u5b98\u7f51\n\n\nmingus\uff1a\u4e00\u4e2a\u9ad8\u7ea7\u97f3\u4e50\u7406\u8bba\u548c\u66f2\u8c31\u5305\uff0c\u652f\u6301 MIDI \u6587\u4ef6\u548c\u56de\u653e\u529f\u80fd\u3002\n\u5b98\u7f51\n\n\n\n\nVideo\n\n\n\u7528\u6765\u64cd\u4f5c\u89c6\u9891\u548c GIF \u7684\u5e93\u3002\n\n\n\n\nmoviepy\uff1a\u4e00\u4e2a\u7528\u6765\u8fdb\u884c\u57fa\u4e8e\u811a\u672c\u7684\u89c6\u9891\u7f16\u8f91\u6a21\u5757\uff0c\u9002\u7528\u4e8e\u591a\u79cd\u683c\u5f0f\uff0c\u5305\u62ec\u52a8\u56fe GIFs\u3002\n\u5b98\u7f51\n\n\nscikit-video\uff1aSciPy \u89c6\u9891\u5904\u7406\u5e38\u7528\u7a0b\u5e8f\u3002\n\u5b98\u7f51\n\n\n\n\n\u5730\u7406\u4f4d\u7f6e\n\n\n\u5730\u7406\u7f16\u7801\u5730\u5740\u4ee5\u53ca\u7528\u6765\u5904\u7406\u7ecf\u7eac\u5ea6\u7684\u5e93\u3002\n\n\n\n\nGeoDjango\uff1a\u4e16\u754c\u7ea7\u5730\u7406\u56fe\u5f62 web \u6846\u67b6\u3002\n\u5b98\u7f51\n\n\nGeoIP\uff1aMaxMind GeoIP Legacy \u6570\u636e\u5e93\u7684 Python API\u3002\n\u5b98\u7f51\n\n\ngeojson\uff1aGeoJSON \u7684 Python \u7ed1\u5b9a\u53ca\u5de5\u5177\u3002\n\u5b98\u7f51\n\n\ngeopy\uff1aPython \u5730\u5740\u7f16\u7801\u5de5\u5177\u7bb1\u3002\n\u5b98\u7f51\n\n\npygeoip\uff1a\u7eaf Python GeoIP API\u3002\n\u5b98\u7f51\n\n\ndjango-countries\uff1a\u4e00\u4e2a Django \u5e94\u7528\u7a0b\u5e8f\uff0c\u63d0\u4f9b\u7528\u4e8e\u8868\u683c\u7684\u56fd\u5bb6\u9009\u62e9\u529f\u80fd\uff0c\u56fd\u65d7\u56fe\u6807\u9759\u6001\u6587\u4ef6\u4ee5\u53ca\u6a21\u578b\u4e2d\u7684\u56fd\u5bb6\u5b57\u6bb5\u3002\n\u5b98\u7f51\n\n\n\n\nHTTP\n\n\n\u4f7f\u7528 HTTP \u7684\u5e93\u3002\n\n aiohttp\uff1a\u57fa\u4e8e asyncio \u7684\u5f02\u6b65 HTTP \u7f51\u7edc\u5e93\u3002\n\u5b98\u7f51\n\n\n requests\uff1a\u4eba\u6027\u5316\u7684 HTTP \u8bf7\u6c42\u5e93\u3002\n\u5b98\u7f51\n\n\n grequests\uff1arequests \u5e93 + gevent \uff0c\u7528\u4e8e\u5f02\u6b65 HTTP \u8bf7\u6c42.\n\u5b98\u7f51\n\n\n httplib2\uff1a\u5168\u9762\u7684 HTTP \u5ba2\u6237\u7aef\u5e93\u3002\n\u5b98\u7f51\n\n\n treq\uff1a\u7c7b\u4f3c requests \u7684 Python API \u6784\u5efa\u4e8e Twisted HTTP \u5ba2\u6237\u7aef\u4e4b\u4e0a\u3002\n\u5b98\u7f51\n\n\n urllib3\uff1a\u4e00\u4e2a\u5177\u6709\u7ebf\u7a0b\u5b89\u5168\u8fde\u63a5\u6c60\uff0c\u652f\u6301\u6587\u4ef6 post\uff0c\u6e05\u6670\u53cb\u597d\u7684 HTTP \u5e93\u3002\n\u5b98\u7f51\n\n\n\u6570\u636e\u5e93\n\n\nPython \u5b9e\u73b0\u7684\u6570\u636e\u5e93\u3002\n\n\n\n\npickleDB\uff1a\u4e00\u4e2a\u7b80\u5355\uff0c\u8f7b\u91cf\u7ea7\u952e\u503c\u50a8\u5b58\u6570\u636e\u5e93\u3002\n\u5b98\u7f51\n\n\nPipelineDB\uff1a\u6d41\u5f0f SQL \u6570\u636e\u5e93\u3002\n\u5b98\u7f51\n\n\nTinyDB\uff1a\u4e00\u4e2a\u5fae\u578b\u7684\uff0c\u9762\u5411\u6587\u6863\u578b\u6570\u636e\u5e93\u3002\n\u5b98\u7f51\n\n\nZODB\uff1a\u4e00\u4e2a Python \u539f\u751f\u5bf9\u8c61\u6570\u636e\u5e93\u3002\u4e00\u4e2a\u952e\u503c\u548c\u5bf9\u8c61\u56fe\u6570\u636e\u5e93\u3002\n\u5b98\u7f51\n\n\n\n\n\u6570\u636e\u5e93\u9a71\u52a8\n\n\n\u7528\u6765\u8fde\u63a5\u548c\u64cd\u4f5c\u6570\u636e\u5e93\u7684\u5e93\u3002\n\n\n\n\nMySQL\uff1a\nawesome-mysql\n \u7cfb\u5217\n\n\naiomysql\uff1a\u57fa\u4e8e asyncio \u7684\u5f02\u6b65 MySQL \u6570\u636e\u5e93\u64cd\u4f5c\u5e93\u3002\n\u5b98\u7f51\n\n\nmysql-python\uff1aPython \u7684 MySQL \u6570\u636e\u5e93\u8fde\u63a5\u5668\u3002\n\u5b98\u7f51\n\n\nysqlclient\uff1a\nmysql-python\n \u5206\u652f\uff0c\u652f\u6301 Python 3\u3002\n\n\noursql\uff1a\u4e00\u4e2a\u66f4\u597d\u7684 MySQL \u8fde\u63a5\u5668\uff0c\u652f\u6301\u539f\u751f\u9884\u7f16\u8bd1\u6307\u4ee4\u548c BLOBs\u3002\n\u5b98\u7f51\n\n\nPyMySQL\uff1a\u7eaf Python MySQL \u9a71\u52a8\uff0c\u517c\u5bb9 mysql-python\u3002\n\u5b98\u7f51\n\n\n\n\n\n\nPostgreSQL\n\n\npsycopg2\uff1aPython \u4e2d\u6700\u6d41\u884c\u7684 PostgreSQL \u9002\u914d\u5668\u3002\n\u5b98\u7f51\n\n\nqueries\uff1apsycopg2 \u5e93\u7684\u5c01\u88c5\uff0c\u7528\u6765\u548c PostgreSQL \u8fdb\u884c\u4ea4\u4e92\u3002\n\u5b98\u7f51\n\n\ntxpostgres\uff1a\u57fa\u4e8e Twisted \u7684\u5f02\u6b65 PostgreSQL \u9a71\u52a8\u3002\n\u5b98\u7f51\n\n\n\n\n\n\n\u5176\u4ed6\u5173\u7cfb\u578b\u6570\u636e\u5e93\n\n\napsw\uff1a\u53e6\u4e00\u4e2a Python SQLite \u5c01\u88c5\u3002\n\u5b98\u7f51\n\n\ndataset\uff1a\u5728\u6570\u636e\u5e93\u4e2d\u5b58\u50a8 Python \u5b57\u5178\n\n\npymssql\uff1a\u4e00\u4e2a\u7b80\u5355\u7684 Microsoft SQL Server \u6570\u636e\u5e93\u63a5\u53e3\u3002\n\u5b98\u7f51\n\n\n\n\n\n\nNoSQL \u6570\u636e\u5e93\n\n\ncassandra-python-driver\uff1aCassandra \u7684 Python \u9a71\u52a8\u3002\n\u5b98\u7f51\n\n\nHappyBase\uff1a\u4e00\u4e2a\u4e3a Apache HBase \u8bbe\u8ba1\u7684\uff0c\u5bf9\u5f00\u53d1\u8005\u53cb\u597d\u7684\u5e93\u3002\n\u5b98\u7f51\n\n\nPlyvel\uff1a\u4e00\u4e2a\u5feb\u901f\u4e14\u529f\u80fd\u4e30\u5bcc\u7684 LevelDB \u7684 Python \u63a5\u53e3\u3002\n\u5b98\u7f51\n\n\npy2neo\uff1aNeo4j restful \u63a5\u53e3\u7684 Python \u5c01\u88c5\u5ba2\u6237\u7aef\u3002\n\u5b98\u7f51\n\n\npycassa\uff1aCassandra \u7684 Python Thrift \u9a71\u52a8\u3002\n\u5b98\u7f51\n\n\nPyMongo\uff1aMongoDB \u7684\u5b98\u65b9 Python \u5ba2\u6237\u7aef\u3002\n\u5b98\u7f51\n\n\nredis-py\uff1aRedis \u7684 Python \u5ba2\u6237\u7aef\u3002\n\u5b98\u7f51\n\n\ntelephus\uff1a\u57fa\u4e8e Twisted \u7684 Cassandra \u5ba2\u6237\u7aef\u3002\n\u5b98\u7f51\n\n\ntxRedis\uff1a\u57fa\u4e8e Twisted \u7684 Redis \u5ba2\u6237\u7aef\u3002\n\u5b98\u7f51\n\n\n\n\n\n\n\n\nORM\n\n\n\u5b9e\u73b0\u5bf9\u8c61\u5173\u7cfb\u6620\u5c04\u6216\u6570\u636e\u6620\u5c04\u6280\u672f\u7684\u5e93\u3002\n\n\n\n\n\u5173\u7cfb\u578b\u6570\u636e\u5e93\n\n\nDjango Models\uff1aDjango \u7684\u4e00\u90e8\u5206\u3002\n\u5b98\u7f51\n\n\nSQLAlchemy\uff1aPython SQL \u5de5\u5177\u4ee5\u53ca\u5bf9\u8c61\u5173\u7cfb\u6620\u5c04\u5de5\u5177\u3002\n\u5b98\u7f51\n\n\nawesome-sqlalchemy\n \u7cfb\u5217\n\n\n\n\n\n\nPeewee\n\uff1a\u4e00\u4e2a\u5c0f\u5de7\uff0c\u5bcc\u6709\u8868\u8fbe\u529b\u7684 ORM\u3002\n\u5b98\u7f51\n\n\nPonyORM\uff1a\u63d0\u4f9b\u9762\u5411\u751f\u6210\u5668\u7684 SQL \u63a5\u53e3\u7684 ORM\u3002\n\u5b98\u7f51\n\n\npython-sql\uff1a\u7f16\u5199 Python \u98ce\u683c\u7684 SQL \u67e5\u8be2\u3002\n\u5b98\u7f51\n\n\n\n\n\n\nNoSQL \u6570\u636e\u5e93\n\n\ndjango-mongodb-engine\uff1aDjango MongoDB \u540e\u7aef\u3002\n\u5b98\u7f51\n\n\nPynamoDB\uff1a\nAmazon DynamoDB\n \u7684\u4e00\u4e2a Python \u98ce\u683c\u63a5\u53e3\u3002\n\u5b98\u7f51\n\n\nflywheel\uff1aAmazon DynamoDB \u7684\u5bf9\u8c61\u6620\u5c04\u5de5\u5177\u3002\n\u5b98\u7f51\n\n\nMongoEngine\uff1a\u4e00\u4e2a Python \u5bf9\u8c61\u6587\u6863\u6620\u5c04\u5de5\u5177\uff0c\u7528\u4e8e MongoDB\u3002\n\u5b98\u7f51\n\n\nhot-redis\uff1a\u4e3a Redis \u63d0\u4f9b Python \u4e30\u5bcc\u7684\u6570\u636e\u7c7b\u578b\u3002\n\u5b98\u7f51\n\n\nredisco\uff1a\u4e00\u4e2a Python \u5e93\uff0c\u63d0\u4f9b\u53ef\u4ee5\u6301\u7eed\u5b58\u5728\u5728 Redis \u4e2d\u7684\u7b80\u5355\u6a21\u578b\u548c\u5bb9\u5668\u3002\n\u5b98\u7f51\n\n\n\n\n\n\n\u5176\u4ed6\n\n\nbutterdb\uff1aGoogle Drive \u7535\u5b50\u8868\u683c\u7684 Python ORM\u3002\n\u5b98\u7f51\n\n\n\n\n\n\n\n\nWeb \u6846\u67b6\n\n\n\u5168\u6808 Web \u6846\u67b6\u3002\n\n\n\n\nDjango\n\uff1aPython \u754c\u6700\u6d41\u884c\u7684 web \u6846\u67b6\u3002\n\u5b98\u7f51\n\n\nawesome-django\n \u7cfb\u5217\n\n\n\n\n\n\nFlask\n\uff1a\u4e00\u4e2a Python \u5fae\u578b\u6846\u67b6\u3002\n\u5b98\u7f51\n\n\nawesome-flask\n \u7cfb\u5217\n\n\n\n\n\n\npyramid\uff1a\u4e00\u4e2a\u5c0f\u5de7\uff0c\u5feb\u901f\uff0c\u63a5\u5730\u6c14\u7684\u5f00\u6e90 Python web \u6846\u67b6\u3002\n\n\nawesome-pyramid\n \u7cfb\u5217\n\n\n\n\n\n\nBottle\n\uff1a\u4e00\u4e2a\u5feb\u901f\u5c0f\u5de7\uff0c\u8f7b\u91cf\u7ea7\u7684 WSGI \u5fae\u578b web \u6846\u67b6\u3002\n\u5b98\u7f51\n\n\nCherryPy\uff1a\u4e00\u4e2a\u6781\u7b80\u7684 Python web \u6846\u67b6\uff0c\u670d\u4ece HTTP/1.1 \u534f\u8bae\u4e14\u5177\u6709 WSGI \u7ebf\u7a0b\u6c60\u3002\n\u5b98\u7f51\n\n\nTurboGears\uff1a\u4e00\u4e2a\u53ef\u4ee5\u6269\u5c55\u4e3a\u5168\u6808\u89e3\u51b3\u65b9\u6848\u7684\u5fae\u578b\u6846\u67b6\u3002\n\u5b98\u7f51\n\n\nweb.py\n\uff1a\u4e00\u4e2a Python \u7684 web \u6846\u67b6\uff0c\u65e2\u7b80\u5355\uff0c\u53c8\u5f3a\u5927\u3002\n\u5b98\u7f51\n\n\nweb2py\uff1a\u4e00\u4e2a\u5168\u6808 web \u6846\u67b6\u548c\u5e73\u53f0\uff0c\u4e13\u6ce8\u4e8e\u7b80\u5355\u6613\u7528\u3002\n\u5b98\u7f51\n\n\nTornado\n\uff1a\u4e00\u4e2a web \u6846\u67b6\u548c\u5f02\u6b65\u7f51\u7edc\u5e93\u3002\n\u5b98\u7f51\n\n\nsanic\uff1a\u57fa\u4e8e Python3.5+ \u7684\u5f02\u6b65\u7f51\u7edc\u6846\u67b6\u3002\n\u5b98\u7f51\n\n\n\n\n\u6743\u9650\n\n\n\u5141\u8bb8\u6216\u62d2\u7edd\u7528\u6237\u8bbf\u95ee\u6570\u636e\u6216\u529f\u80fd\u7684\u5e93\u3002\n\n\n\n\nCarteblanche\uff1a\u7ad9\u5728\u7528\u6237\u548c\u8bbe\u8ba1\u8005\u89d2\u5ea6\u5f00\u53d1\u7684\u4e00\u4e2a\u4ee3\u7801\u5bf9\u9f50\u6a21\u5757\uff0c\u5f88\u597d\u5730\u5904\u7406\u4e86\u4ee3\u7801\u5bfc\u822a\u53ca\u6743\u9650\u3002\n\u5b98\u7f51\n\n\ndjango-guardian\uff1aDjango 1.2+ \u5b9e\u73b0\u4e86\u5355\u4e2a\u5bf9\u8c61\u6743\u9650\u3002\n\u5b98\u7f51\n\n\ndjango-rules\uff1a\u4e00\u4e2a\u5c0f\u5de7\u4f46\u662f\u5f3a\u5927\u7684\u5e94\u7528\uff0c\u63d0\u4f9b\u5bf9\u8c61\u7ea7\u522b\u7684\u6743\u9650\u7ba1\u7406\uff0c\u4e14\u4e0d\u9700\u8981\u4f7f\u7528\u6570\u636e\u5e93\u3002\n\u5b98\u7f51\n\n\n\n\nCMS\n\n\n\u5185\u5bb9\u7ba1\u7406\u7cfb\u7edf\n\n\n\n\nodoo-cms: \u4e00\u4e2a\u5f00\u6e90\u7684\uff0c\u4f01\u4e1a\u7ea7 CMS\uff0c\u57fa\u4e8e odoo\u3002\n\u5b98\u7f51\n\n\ndjango-cms\uff1a\u4e00\u4e2a\u5f00\u6e90\u7684\uff0c\u4f01\u4e1a\u7ea7 CMS\uff0c\u57fa\u4e8e Django\u3002\n\u5b98\u7f51\n\n\ndjedi-cms\uff1a\u4e00\u4e2a\u8f7b\u91cf\u7ea7\u4f46\u5374\u975e\u5e38\u5f3a\u5927\u7684 Django CMS \uff0c\u8003\u8651\u5230\u4e86\u63d2\u4ef6\uff0c\u5185\u8054\u7f16\u8f91\u4ee5\u53ca\u6027\u80fd\u3002\n\u5b98\u7f51\n\n\nFeinCMS\uff1a\u57fa\u4e8e Django \u6784\u5efa\u7684\u6700\u5148\u8fdb\u7684\u5185\u5bb9\u7ba1\u7406\u7cfb\u7edf\u4e4b\u4e00\u3002\n\u5b98\u7f51\n\n\nKotti\uff1a\u4e00\u4e2a\u9ad8\u7ea7\u7684\uff0cPython \u8303\u7684 web \u5e94\u7528\u6846\u67b6\uff0c\u57fa\u4e8e Pyramid \u6784\u5efa\u3002\n\u5b98\u7f51\n\n\nMezzanine\uff1a\u4e00\u4e2a\u5f3a\u5927\u7684\uff0c\u6301\u7eed\u7684\uff0c\u7075\u6d3b\u7684\u5185\u5bb9\u7ba1\u7406\u5e73\u53f0\u3002\n\u5b98\u7f51\n\n\nOpps\uff1a\u4e00\u4e2a\u4e3a\u6742\u5fd7\uff0c\u62a5\u7eb8\u7f51\u7ad9\u4ee5\u53ca\u5927\u6d41\u91cf\u95e8\u6237\u7f51\u7ad9\u8bbe\u8ba1\u7684 CMS \u5e73\u53f0\uff0c\u57fa\u4e8e Django\u3002\n\u5b98\u7f51\n\n\nPlone\uff1a\u4e00\u4e2a\u6784\u5efa\u4e8e\u5f00\u6e90\u5e94\u7528\u670d\u52a1\u5668 Zope \u4e4b\u4e0a\u7684 CMS\u3002\n\u5b98\u7f51\n\n\nQuokka\uff1a\u7075\u6d3b\uff0c\u53ef\u6269\u5c55\u7684\u5c0f\u578b CMS\uff0c\u57fa\u4e8e Flask \u548c MongoDB\u3002\n\u5b98\u7f51\n\n\nWagtail\n\uff1a\u4e00\u4e2a Django \u5185\u5bb9\u7ba1\u7406\u7cfb\u7edf\u3002\n\u5b98\u7f51\n\n\nWidgy\uff1a\u6700\u65b0\u7684 CMS \u6846\u67b6\uff0c\u57fa\u4e8e Django\u3002\n\u5b98\u7f51\n\n\n\n\n\u7535\u5b50\u5546\u52a1\n\n\n\u7528\u4e8e\u7535\u5b50\u5546\u52a1\u4ee5\u53ca\u652f\u4ed8\u7684\u6846\u67b6\u548c\u5e93\u3002\n\n\n\n\ndjango-oscar\uff1a\u4e00\u4e2a\u7528\u4e8e Django \u7684\u5f00\u6e90\u7684\u7535\u5b50\u5546\u52a1\u6846\u67b6\u3002\n\u5b98\u7f51\n\n\ndjango-shop\uff1a\u4e00\u4e2a\u57fa\u4e8e Django \u7684\u5e97\u94fa\u7cfb\u7edf\u3002\n\u5b98\u7f51\n\n\nCartridge\uff1a\u4e00\u4e2a\u57fa\u4e8e Mezzanine \u6784\u5efa\u7684\u8d2d\u7269\u8f66\u5e94\u7528\u3002\n\u5b98\u7f51\n\n\nshoop\uff1a\u4e00\u4e2a\u57fa\u4e8e Django \u7684\u5f00\u6e90\u7535\u5b50\u5546\u52a1\u5e73\u53f0\u3002\n\u5b98\u7f51\n\n\nalipay\uff1a\u975e\u5b98\u65b9\u7684 Python \u652f\u4ed8\u5b9d API\u3002\n\u5b98\u7f51\n\n\nmerchant\uff1a\u4e00\u4e2a\u53ef\u4ee5\u63a5\u6536\u6765\u81ea\u591a\u79cd\u652f\u4ed8\u5e73\u53f0\u652f\u4ed8\u7684 Django \u5e94\u7528\u3002\n\u5b98\u7f51\n\n\nmoney\uff1a\u4e00\u4e2a\u8d27\u5e01\u7c7b\u5e93\u3002\u5e26\u6709\u53ef\u9009\u7684 CLDR \u540e\u7aef\u672c\u5730\u5316\u683c\u5f0f\uff0c\u63d0\u4f9b\u53ef\u6269\u5c55\u7684\u8d27\u5e01\u5151\u6362\u89e3\u51b3\u65b9\u6848\u3002\n\u5b98\u7f51\n\n\npython-currencies\uff1a\u663e\u793a\u8d27\u5e01\u683c\u5f0f\u4ee5\u53ca\u5b83\u7684\u6570\u503c\u3002\n\u5b98\u7f51\n\n\n\n\nRESTful API\n\n\n\u7528\u6765\u5f00\u53d1 RESTful APIs \u7684\u5e93\n\n\n\n\nDjango\n\n\ndjango-rest-framework\n\uff1a\u4e00\u4e2a\u5f3a\u5927\u7075\u6d3b\u7684\u5de5\u5177\uff0c\u7528\u6765\u6784\u5efa web API\u3002\n\u5b98\u7f51\n\n\ndjango-tastypie\uff1a\u4e3a Django \u5e94\u7528\u5f00\u53d1 API\u3002\n\u5b98\u7f51\n\n\ndjango-formapi\uff1a\u4e3a Django \u7684\u8868\u5355\u9a8c\u8bc1\uff0c\u521b\u5efa JSON APIs \u3002\n\u5b98\u7f51\n\n\n\n\n\n\nFlask\n\n\nflask-api\uff1a\u4e3a flask \u5f00\u53d1\u7684\uff0c\u53ef\u6d4f\u89c8 Web APIs \u3002\n\u5b98\u7f51\n\n\nflask-restful\uff1a\u4e3a flask \u5feb\u901f\u521b\u5efa REST APIs \u3002\n\u5b98\u7f51\n\n\nflask-restless\uff1a\u4e3a SQLAlchemy \u5b9a\u4e49\u7684\u6570\u636e\u5e93\u6a21\u578b\u521b\u5efa RESTful APIs \u3002\n\u5b98\u7f51\n\n\nflask-api-utils\uff1a\u4e3a Flask \u5904\u7406 API \u8868\u793a\u548c\u9a8c\u8bc1\u3002\n\u5b98\u7f51\n\n\neve\uff1aREST API \u6846\u67b6\uff0c\u7531 Flask, MongoDB \u7b49\u9a71\u52a8\u3002\n\u5b98\u7f51\n\n\n\n\n\n\nPyramid\n\n\ncornice\uff1a\u4e00\u4e2a Pyramid \u7684 REST \u6846\u67b6 \u3002\n\u5b98\u7f51\n\n\n\n\n\n\n\u4e0e\u6846\u67b6\u65e0\u5173\u7684\n\n\nfalcon\uff1a\u4e00\u4e2a\u7528\u6765\u5efa\u7acb\u4e91 API \u548c web app \u540e\u7aef\u7684\u9ad8\u6027\u80fd\u6846\u67b6\u3002\n\u5b98\u7f51\n\n\nsandman\uff1a\u4e3a\u73b0\u5b58\u7684\u6570\u636e\u5e93\u9a71\u52a8\u7cfb\u7edf\u81ea\u52a8\u521b\u5efa REST APIs \u3002\n\u5b98\u7f51\n\n\nrestless\uff1a\u6846\u67b6\u65e0\u5173\u7684 REST \u6846\u67b6 \uff0c\u57fa\u4e8e\u4ece Tastypie \u5b66\u5230\u7684\u77e5\u8bc6\u3002\n\u5b98\u7f51\n\n\nripozo\uff1a\u5feb\u901f\u521b\u5efa REST/HATEOAS/Hypermedia APIs\u3002\n\u5b98\u7f51\n\n\n\n\n\n\n\n\n\u9a8c\u8bc1\n\n\n\u5b9e\u73b0\u9a8c\u8bc1\u65b9\u6848\u7684\u5e93\u3002\n\n\n\n\nOAuth\n\n\nAuthomatic\uff1a\u7b80\u5355\u4f46\u662f\u5f3a\u5927\u7684\u6846\u67b6\uff0c\u8eab\u4efd\u9a8c\u8bc1/\u6388\u6743\u5ba2\u6237\u7aef\u3002\n\u5b98\u7f51\n\n\ndjango-allauth\uff1aDjango \u7684\u9a8c\u8bc1\u5e94\u7528\u3002\n\u5b98\u7f51\n\n\ndjango-oauth-toolkit\uff1a\u4e3a Django \u7528\u6237\u51c6\u5907\u7684 OAuth2\u3002\n\u5b98\u7f51\n\n\ndjango-oauth2-provider\uff1a\u4e3a Django \u5e94\u7528\u63d0\u4f9b OAuth2 \u63a5\u5165\u3002\n\u5b98\u7f51\n\n\nFlask-OAuthlib\uff1aOAuth 1.0/a, 2.0 \u5ba2\u6237\u7aef\u5b9e\u73b0\uff0c\u4f9b Flask \u4f7f\u7528\u3002\n\u5b98\u7f51\n\n\nOAuthLib\uff1a\u4e00\u4e2a OAuth \u8bf7\u6c42-\u7b7e\u540d\u903b\u8f91\u901a\u7528\u3001 \u5b8c\u6574\u7684\u5b9e\u73b0\u3002\n\u5b98\u7f51\n\n\npython-oauth2\uff1a\u4e00\u4e2a\u5b8c\u5168\u6d4b\u8bd5\u7684\u62bd\u8c61\u63a5\u53e3\u3002\u7528\u6765\u521b\u5efa OAuth \u5ba2\u6237\u7aef\u548c\u670d\u52a1\u7aef\u3002\n\u5b98\u7f51\n\n\npython-social-auth\uff1a\u4e00\u4e2a\u8bbe\u7f6e\u7b80\u5355\u7684\u793e\u4f1a\u5316\u9a8c\u8bc1\u65b9\u5f0f\u3002\n\u5b98\u7f51\n\n\nrauth\uff1aOAuth 1.0/a, 2.0, \u548c Ofly \u7684 Python \u5e93\u3002\n\u5b98\u7f51\n\n\nsanction\uff1a\u4e00\u4e2a\u8d85\u7ea7\u7b80\u5355\u7684 OAuth2 \u5ba2\u6237\u7aef\u5b9e\u73b0\u3002\n\u5b98\u7f51\n\n\n\n\n\n\n\u5176\u4ed6\n\n\njose\uff1aJavaScript \u5bf9\u8c61\u7b7e\u540d\u548c\u52a0\u5bc6\u8349\u6848\u7684\u5b9e\u73b0\u3002\n\u5b98\u7f51\n\n\nPyJWT\uff1aJSON Web \u4ee4\u724c\u8349\u6848 01\u3002\n\u5b98\u7f51\n\n\npython-jws\uff1aJSON Web \u7b7e\u540d\u8349\u6848 02 \u7684\u5b9e\u73b0\u3002\n\u5b98\u7f51\n\n\npython-jwt\uff1a\u4e00\u4e2a\u7528\u6765\u751f\u6210\u548c\u9a8c\u8bc1 JSON Web \u4ee4\u724c\u7684\u6a21\u5757\u3002\n\u5b98\u7f51\n\n\n\n\n\n\n\n\n\u6a21\u677f\u5f15\u64ce\n\n\n\u6a21\u677f\u751f\u6210\u548c\u8bcd\u6cd5\u89e3\u6790\u7684\u5e93\u548c\u5de5\u5177\u3002\n\n\n\n\nJinja2\n\uff1a\u4e00\u4e2a\u73b0\u4ee3\u7684\uff0c\u5bf9\u8bbe\u8ba1\u5e08\u53cb\u597d\u7684\u6a21\u677f\u5f15\u64ce\u3002\n\u5b98\u7f51\n\n\nChameleon\uff1a\u4e00\u4e2a HTML/XML \u6a21\u677f\u5f15\u64ce\u3002 \u6a21\u4eff\u4e86 ZPT\uff08Zope Page Templates\uff09, \u8fdb\u884c\u4e86\u901f\u5ea6\u4e0a\u7684\u4f18\u5316\u3002\n\u5b98\u7f51\n\n\nGenshi\uff1aPython \u6a21\u677f\u5de5\u5177\uff0c\u7528\u4ee5\u751f\u6210 web \u611f\u77e5\u7684\u7ed3\u679c\u3002\n\u5b98\u7f51\n\n\nMako\uff1aPython \u5e73\u53f0\u7684\u8d85\u9ad8\u901f\u8f7b\u91cf\u7ea7\u6a21\u677f\u3002\n\u5b98\u7f51\n\n\n\n\n\u961f\u5217\n\n\n\u5904\u7406\u4e8b\u4ef6\u4ee5\u53ca\u4efb\u52a1\u961f\u5217\u7684\u5e93\u3002\n\n\n\n\ncelery\uff1a\u4e00\u4e2a\u5f02\u6b65\u4efb\u52a1\u961f\u5217/\u4f5c\u4e1a\u961f\u5217\uff0c\u57fa\u4e8e\u5206\u5e03\u5f0f\u6d88\u606f\u4f20\u9012\u3002\n\u5b98\u7f51\n\n\nhuey\uff1a\u5c0f\u578b\u591a\u7ebf\u7a0b\u4efb\u52a1\u961f\u5217\u3002\n\u5b98\u7f51\n\n\nmrq\n\uff1aMr. Queue -\u4e00\u4e2a Python \u7684\u5206\u5e03\u5f0f worker \u4efb\u52a1\u961f\u5217\uff0c \u4f7f\u7528 Redis \u548c gevent\u3002\n\u5b98\u7f51\n\n\nrq\uff1a\u7b80\u5355\u7684 Python \u4f5c\u4e1a\u961f\u5217\u3002\n\u5b98\u7f51\n\n\nsimpleq\uff1a\u4e00\u4e2a\u7b80\u5355\u7684\uff0c\u53ef\u65e0\u9650\u6269\u5f20\u7684\uff0c\u57fa\u4e8e\u4e9a\u9a6c\u900a SQS \u7684\u961f\u5217\u3002\n\u5b98\u7f51\n\n\n\n\n\u641c\u7d22\n\n\n\u5bf9\u6570\u636e\u8fdb\u884c\u7d22\u5f15\u548c\u6267\u884c\u641c\u7d22\u67e5\u8be2\u7684\u5e93\u548c\u8f6f\u4ef6\u3002\n\n\n\n\ndjango-haystack\uff1aDjango \u6a21\u5757\u5316\u641c\u7d22\u3002\n\u5b98\u7f51\n\n\nelasticsearch-py\uff1aElasticsearch \u7684\u5b98\u65b9\u5e95\u5c42 Python \u5ba2\u6237\u7aef\u3002\n\u5b98\u7f51\n\n\nelasticsearch-dsl-py\uff1aElasticsearch \u7684\u5b98\u65b9\u9ad8\u7ea7 Python \u5ba2\u6237\u7aef\u3002\n\u5b98\u7f51\n \n\n\nsolrpy\uff1a\nsolr\n \u7684 Python \u5ba2\u6237\u7aef\u3002\n\u5b98\u7f51\n\n\nWhoosh\uff1a\u4e00\u4e2a\u5feb\u901f\u7684\u7eaf Python \u641c\u7d22\u5f15\u64ce\u5e93\u3002\n\u5b98\u7f51\n\n\n\n\n\u52a8\u6001\u6d88\u606f\n\n\n\u7528\u6765\u521b\u5efa\u7528\u6237\u6d3b\u52a8\u7684\u5e93\u3002\n\n\n\n\ndjango-activity-stream\uff1a\u4ece\u4f60\u7684\u7ad9\u70b9\u884c\u4e3a\u4e2d\u751f\u6210\u901a\u7528\u6d3b\u52a8\u4fe1\u606f\u6d41\u3002\n\u5b98\u7f51\n\n\nStream-Framework\uff1a\u4f7f\u7528 Cassandra \u548c Redis \u521b\u5efa\u52a8\u6001\u6d88\u606f\u548c\u901a\u77e5\u7cfb\u7edf\u3002\n\u5b98\u7f51\n\n\n\n\n\u8d44\u6e90\u7ba1\u7406\n\n\n\u7ba1\u7406\u3001\u538b\u7f29\u3001\u7f29\u5c0f\u7f51\u7ad9\u8d44\u6e90\u7684\u5de5\u5177\u3002\n\n\n\n\ndjango-compressor\uff1a\u5c06\u94fe\u63a5\u548c\u5185\u8054\u7684 JavaScript \u6216 CSS \u538b\u7f29\u5230\u4e00\u4e2a\u5355\u72ec\u7684\u7f13\u5b58\u6587\u4ef6\u4e2d\u3002\n\u5b98\u7f51\n\n\ndjango-storages\uff1a\u4e00\u4e2a\u9488\u5bf9 Django \u7684\u81ea\u5b9a\u4e49\u5b58\u50a8\u540e\u7aef\u7684\u5de5\u5177\u96c6\u5408\u3002\n\u5b98\u7f51\n\n\nfanstatic\uff1a\u6253\u5305\u3001\u4f18\u5316\uff0c\u5e76\u4e14\u628a\u9759\u6001\u6587\u4ef6\u4f9d\u8d56\u4f5c\u4e3a Python \u7684\u5305\u6765\u63d0\u4f9b\u3002\n\u5b98\u7f51\n\n\nFile Conveyor\uff1a\u4e00\u4e2a\u540e\u53f0\u9a7b\u7559\u7684\u7a0b\u5e8f\uff0c\u7528\u6765\u53d1\u73b0\u548c\u540c\u6b65\u6587\u4ef6\u5230 CDNs, S3 \u548c FTP\u3002\n\u5b98\u7f51\n\n\nFlask-Assets\uff1a\u5e2e\u4f60\u5c06 web \u8d44\u6e90\u6574\u5408\u5230\u4f60\u7684 Flask app \u4e2d\u3002\n\u5b98\u7f51\n\n\njinja-assets-compressor\uff1a\u4e00\u4e2a Jinja \u6269\u5c55\uff0c\u7528\u6765\u7f16\u8bd1\u548c\u538b\u7f29\u4f60\u7684\u8d44\u6e90\u3002\n\u5b98\u7f51\n\n\nwebassets\uff1a\u4e3a\u4f60\u7684\u9759\u6001\u8d44\u6e90\u6253\u5305\u3001\u4f18\u5316\u548c\u7ba1\u7406\u751f\u6210\u72ec\u4e00\u65e0\u4e8c\u7684\u7f13\u5b58 URL\u3002\n\u5b98\u7f51\n\n\n\n\n\u7f13\u5b58\n\n\n\u7f13\u5b58\u6570\u636e\u7684\u5e93\u3002\n\n\n\n\nBeaker\uff1a\u4e00\u4e2a\u7f13\u5b58\u548c\u4f1a\u8bdd\u5e93\uff0c\u53ef\u4ee5\u7528\u5728 web \u5e94\u7528\u548c\u72ec\u7acb Python \u811a\u672c\u548c\u5e94\u7528\u4e0a\u3002\n\u5b98\u7f51\n\n\ndjango-cache-machine\uff1aDjango \u6a21\u578b\u7684\u81ea\u52a8\u7f13\u5b58\u548c\u5931\u6548\u3002\n\u5b98\u7f51\n\n\ndjango-cacheops\uff1a\u5177\u6709\u81ea\u52a8\u9897\u7c92\u5316\u4e8b\u4ef6\u9a71\u52a8\u5931\u6548\u529f\u80fd\u7684 ORM\u3002\n\u5b98\u7f51\n\n\ndjango-viewlet\uff1a\u6e32\u67d3\u6a21\u677f\uff0c\u540c\u65f6\u5177\u6709\u989d\u5916\u7684\u7f13\u5b58\u63a7\u5236\u529f\u80fd\u3002\n\u5b98\u7f51\n\n\ndogpile.cache\uff1adogpile.cache \u662f Beaker \u7684\u4e0b\u4e00\u4ee3\u66ff\u4ee3\u54c1\uff0c\u7531\u540c\u4e00\u4f5c\u8005\u5f00\u53d1\u3002\n\u5b98\u7f51\n\n\nHermesCache\uff1aPython \u7f13\u5b58\u5e93\uff0c\u5177\u6709\u57fa\u4e8e\u6807\u7b7e\u7684\u5931\u6548\u548c dogpile effect \u4fdd\u62a4\u529f\u80fd\u3002\n\u5b98\u7f51\n\n\njohnny-cache\uff1adjango \u5e94\u7528\u7f13\u5b58\u6846\u67b6\u3002\n\u5b98\u7f51\n\n\npylibmc\uff1a\nlibmemcached\n \u63a5\u53e3\u7684 Python \u5c01\u88c5\u3002\n\u5b98\u7f51\n\n\n\n\n\u7535\u5b50\u90ae\u4ef6\n\n\n\u7528\u6765\u53d1\u9001\u548c\u89e3\u6790\u7535\u5b50\u90ae\u4ef6\u7684\u5e93\u3002\n\n\n\n\ndjango-celery-ses\uff1a\u5e26\u6709 AWS SES \u548c Celery \u7684 Django email \u540e\u7aef\u3002\n\u5b98\u7f51\n\n\nenvelopes\uff1a\u4f9b\u4eba\u7c7b\u4f7f\u7528\u7684\u7535\u5b50\u90ae\u4ef6\u5e93\u3002\n\u5b98\u7f51\n\n\nflanker\uff1a\u4e00\u4e2a email \u5730\u5740\u548c Mime \u89e3\u6790\u5e93\u3002\n\u5b98\u7f51\n\n\nimbox\uff1aPython IMAP \u5e93\u3002\n\u5b98\u7f51\n\n\ninbox.py\uff1aPython SMTP \u670d\u52a1\u5668\u3002\n\u5b98\u7f51\n\n\ninbox\uff1a\u4e00\u4e2a\u5f00\u6e90\u7535\u5b50\u90ae\u4ef6\u5de5\u5177\u7bb1\u3002\n\u5b98\u7f51\n\n\nlamson\uff1aPython \u98ce\u683c\u7684 SMTP \u5e94\u7528\u670d\u52a1\u5668\u3002\n\u5b98\u7f51\n\n\nmailjet\uff1aMailjet API \u5b9e\u73b0\uff0c\u7528\u6765\u63d0\u4f9b\u6279\u91cf\u53d1\u9001\u90ae\u4ef6\uff0c\u7edf\u8ba1\u7b49\u529f\u80fd\u3002\n\u5b98\u7f51\n\n\nmarrow.mailer\uff1a\u9ad8\u6027\u80fd\u53ef\u6269\u5c55\u90ae\u4ef6\u5206\u53d1\u6846\u67b6\u3002\n\u5b98\u7f51\n\n\nmodoboa\uff1a\u4e00\u4e2a\u90ae\u4ef6\u6258\u7ba1\u548c\u7ba1\u7406\u5e73\u53f0\uff0c\u5177\u6709\u73b0\u4ee3\u7684\u3001\u7b80\u7ea6\u7684 Web UI\u3002\n\u5b98\u7f51\n\n\npyzmail\uff1a\u521b\u5efa\uff0c\u53d1\u9001\u548c\u89e3\u6790\u7535\u5b50\u90ae\u4ef6\u3002\n\u5b98\u7f51\n\n\nTalon\uff1aMailgun \u5e93\uff0c\u7528\u6765\u62bd\u53d6\u4fe1\u606f\u548c\u7b7e\u540d\u3002\n\u5b98\u7f51\n\n\n\n\n\u56fd\u9645\u5316\n\n\n\u7528\u6765\u8fdb\u884c\u56fd\u9645\u5316\u7684\u5e93\u3002\n\n\n\n\nBabel\uff1a\u4e00\u4e2a Python \u7684\u56fd\u9645\u5316\u5e93\u3002\n\u5b98\u7f51\n\n\nKorean\uff1a\u4e00\u4e2a\u97e9\u8bed\u8bcd\u6001\u5e93\u3002\n\u5b98\u7f51\n\n\n\n\nURL \u5904\u7406\n\n\n\u89e3\u6790 URLs \u7684\u5e93\n\n\n\n\nfurl\uff1a\u4e00\u4e2a\u8ba9\u5904\u7406 URL \u66f4\u7b80\u5355\u5c0f\u578b Python \u5e93\u3002\n\u5b98\u7f51\n\n\npurl\uff1a\u4e00\u4e2a\u7b80\u5355\u7684\uff0c\u4e0d\u53ef\u53d8\u7684 URL \u7c7b\uff0c\u5177\u6709\u7b80\u6d01\u7684 API \u6765\u8fdb\u884c\u8be2\u95ee\u548c\u5904\u7406\u3002\n\u5b98\u7f51\n\n\npyshorteners\uff1a\u4e00\u4e2a\u7eaf Python URL \u7f29\u77ed\u5e93\u3002\n\u5b98\u7f51\n\n\nshorturl\uff1a\u751f\u6210\u77ed\u5c0f URL \u548c\u7c7b\u4f3c bit.ly \u77ed\u94fe\u7684 Python \u5b9e\u73b0\u3002\n\u5b98\u7f51\n\n\nwebargs\uff1a\u4e00\u4e2a\u89e3\u6790 HTTP \u8bf7\u6c42\u53c2\u6570\u7684\u5e93\uff0c\u5185\u7f6e\u5bf9\u6d41\u884c web \u6846\u67b6\u7684\u652f\u6301\uff0c\u5305\u62ec Flask, Django, Bottle, Tornado \u548c Pyramid\u3002\n\u5b98\u7f51\n\n\n\n\nHTML \u5904\u7406\n\n\n\u5904\u7406 HTML \u548c XML \u7684\u5e93\u3002\n\n\n\n\nBeautifulSoup\uff1a\u4ee5 Python \u98ce\u683c\u7684\u65b9\u5f0f\u6765\u5bf9 HTML \u6216 XML \u8fdb\u884c\u8fed\u4ee3\uff0c\u641c\u7d22\u548c\u4fee\u6539\u3002\n\u5b98\u7f51\n\n\nbleach\uff1a\u4e00\u4e2a\u57fa\u4e8e\u767d\u540d\u5355\u7684 HTML \u6e05\u7406\u548c\u6587\u672c\u94fe\u63a5\u5e93\u3002\n\u5b98\u7f51\n\n\ncssutils\uff1a\u4e00\u4e2a Python \u7684 CSS \u5e93\u3002\n\u5b98\u7f51\n\n\nhtml5lib\uff1a\u4e00\u4e2a\u517c\u5bb9\u6807\u51c6\u7684 HTML \u6587\u6863\u548c\u7247\u6bb5\u89e3\u6790\u53ca\u5e8f\u5217\u5316\u5e93\u3002\n\u5b98\u7f51\n\n\nlxml\uff1a\u4e00\u4e2a\u975e\u5e38\u5feb\u901f\uff0c\u7b80\u5355\u6613\u7528\uff0c\u529f\u80fd\u9f50\u5168\u7684\u5e93\uff0c\u7528\u6765\u5904\u7406 HTML \u548c XML\u3002\n\u5b98\u7f51\n\n\nMarkupSafe\uff1a\u4e3a Python \u5b9e\u73b0 XML/HTML/XHTML \u6807\u8bb0\u5b89\u5168\u5b57\u7b26\u4e32\u3002\n\u5b98\u7f51\n\n\npyquery\uff1a\u4e00\u4e2a\u89e3\u6790 HTML \u7684\u5e93\uff0c\u7c7b\u4f3c jQuery\u3002\n\u5b98\u7f51\n\n\nrequests-html\uff1a\u4eba\u6027\u5316\u7684\uff0cPythonic \u7684 HTML \u89e3\u6790\u5e93\u3002\n\u5b98\u7f51\n\n\nuntangle\uff1a\u5c06 XML \u6587\u6863\u8f6c\u6362\u4e3a Python \u5bf9\u8c61\uff0c\u4f7f\u5176\u53ef\u4ee5\u65b9\u4fbf\u7684\u8bbf\u95ee\u3002\n\u5b98\u7f51\n\n\nxhtml2pdf\uff1aHTML/CSS \u8f6c PDF \u5de5\u5177\u3002\n\u5b98\u7f51\n\n\nxmltodict\uff1a\u50cf\u5904\u7406 JSON \u4e00\u6837\u5904\u7406 XML\u3002\n\u5b98\u7f51\n\n\n\n\n\u722c\u53d6\u7f51\u7edc\u7ad9\u70b9\u7684\u5e93\n\n\n\n\nScrapy\uff1a\u4e00\u4e2a\u5feb\u901f\u9ad8\u7ea7\u7684\u5c4f\u5e55\u722c\u53d6\u53ca\u7f51\u9875\u91c7\u96c6\u6846\u67b6\u3002\n\u5b98\u7f51\n\n\ncola\uff1a\u4e00\u4e2a\u5206\u5e03\u5f0f\u722c\u866b\u6846\u67b6\u3002\n\u5b98\u7f51\n\n\nDemiurge\uff1a\u57fa\u4e8e PyQuery \u7684\u722c\u866b\u5fae\u578b\u6846\u67b6\u3002\n\u5b98\u7f51\n\n\nfeedparser\uff1a\u901a\u7528 feed \u89e3\u6790\u5668\u3002\n\u5b98\u7f51\n\n\nGrab\uff1a\u7ad9\u70b9\u722c\u53d6\u6846\u67b6\u3002\n\u5b98\u7f51\n\n\nMechanicalSoup\uff1a\u7528\u4e8e\u81ea\u52a8\u548c\u7f51\u7edc\u7ad9\u70b9\u4ea4\u4e92\u7684 Python \u5e93\u3002\n\u5b98\u7f51\n\n\nportia\uff1aScrapy \u53ef\u89c6\u5316\u722c\u53d6\u3002\n\u5b98\u7f51\n\n\npyspider\uff1a\u4e00\u4e2a\u5f3a\u5927\u7684\u722c\u866b\u7cfb\u7edf\u3002\n\u5b98\u7f51\n\n\nRoboBrowser\uff1a\u4e00\u4e2a\u7b80\u5355\u7684\uff0cPython \u98ce\u683c\u7684\u5e93\uff0c\u7528\u6765\u6d4f\u89c8\u7f51\u7ad9\uff0c\u800c\u4e0d\u9700\u8981\u4e00\u4e2a\u72ec\u7acb\u5b89\u88c5\u7684\u6d4f\u89c8\u5668\u3002\n\u5b98\u7f51\n\n\n\n\n\u7f51\u9875\u5185\u5bb9\u63d0\u53d6\n\n\n\u7528\u4e8e\u8fdb\u884c\u7f51\u9875\u5185\u5bb9\u63d0\u53d6\u7684\u5e93\u3002\n\n\n\n\nHaul\uff1a\u4e00\u4e2a\u53ef\u4ee5\u6269\u5c55\u7684\u56fe\u50cf\u722c\u53d6\u5de5\u5177\u3002\n\u5b98\u7f51\n\n\nhtml2text\uff1a\u5c06 HTML \u8f6c\u6362\u4e3a Markdown \u683c\u5f0f\u6587\u672c\u3002\n\u5b98\u7f51\n\n\nlassie\uff1a\u4eba\u6027\u5316\u7684\u7f51\u9875\u5185\u5bb9\u68c0\u7d22\u5e93\u3002\n\u5b98\u7f51\n\n\nmicawber\uff1a\u4e00\u4e2a\u5c0f\u578b\u7f51\u9875\u5185\u5bb9\u63d0\u53d6\u5e93\uff0c\u7528\u6765\u4ece URLs \u63d0\u53d6\u5bcc\u5185\u5bb9\u3002\n\u5b98\u7f51\n \n\n\nnewspaper\n\uff1a\u4f7f\u7528 Python \u8fdb\u884c\u65b0\u95fb\u63d0\u53d6\uff0c\u6587\u7ae0\u63d0\u53d6\u4ee5\u53ca\u5185\u5bb9\u7b56\u5c55\u3002\n\u5b98\u7f51\n\n\nopengraph\uff1a\u4e00\u4e2a\u7528\u6765\u89e3\u6790\u5f00\u653e\u5185\u5bb9\u534f\u8bae(Open Graph Protocol)\u7684 Python \u6a21\u5757\u3002\n\u5b98\u7f51\n\n\npython-goose\n\uff1aHTML \u5185\u5bb9/\u6587\u7ae0\u63d0\u53d6\u5668\u3002\n\u5b98\u7f51\n\n\npython-readability\uff1aarc90 \u516c\u53f8 readability \u5de5\u5177\u7684 Python \u9ad8\u901f\u7aef\u53e3\u3002\n\u5b98\u7f51\n\n\nsanitize\uff1a\u4e3a\u6742\u4e71\u7684\u6570\u636e\u4e16\u754c\u5e26\u6765\u8c03\u7406\u6027\u3002\n\u5b98\u7f51\n\n\nsumy\uff1a\u4e00\u4e2a\u4e3a\u6587\u672c\u6587\u4ef6\u548c HTML \u9875\u9762\u8fdb\u884c\u81ea\u52a8\u6458\u8981\u7684\u6a21\u5757\u3002\n\u5b98\u7f51\n\n\ntextract\uff1a\u4ece\u4efb\u4f55\u683c\u5f0f\u7684\u6587\u6863\u4e2d\u63d0\u53d6\u6587\u672c\uff0cWord\uff0cPowerPoint\uff0cPDFs \u7b49\u7b49\u3002\n\u5b98\u7f51\n\n\n\n\n\u8868\u5355\n\n\n\u8fdb\u884c\u8868\u5355\u64cd\u4f5c\u7684\u5e93\u3002\n\n\n\n\nDeform\uff1aPython HTML \u8868\u5355\u751f\u6210\u5e93\uff0c\u53d7\u5230\u4e86 formish \u8868\u5355\u751f\u6210\u5e93\u7684\u542f\u53d1\u3002\n\u5b98\u7f51\n\n\ndjango-bootstrap3\uff1a\u96c6\u6210\u4e86 Bootstrap 3 \u7684 Django\u3002\n\u5b98\u7f51\n\n\ndjango-crispy-forms\uff1a\u4e00\u4e2a Django \u5e94\u7528\uff0c\u4ed6\u53ef\u4ee5\u8ba9\u4f60\u4ee5\u4e00\u79cd\u975e\u5e38\u4f18\u96c5\u4e14 DRY\uff08Don't repeat yourself\uff09 \u7684\u65b9\u5f0f\u6765\u521b\u5efa\u7f8e\u89c2\u7684\u8868\u5355\u3002\n\u5b98\u7f51\n\n\ndjango-remote-forms\uff1a\u4e00\u4e2a\u5e73\u53f0\u72ec\u7acb\u7684 Django \u8868\u5355\u5e8f\u5217\u5316\u5de5\u5177\u3002\n\u5b98\u7f51\n\n\nWTForms\uff1a\u4e00\u4e2a\u7075\u6d3b\u7684\u8868\u5355\u9a8c\u8bc1\u548c\u5448\u73b0\u5e93\u3002\n\u5b98\u7f51\n\n\nWTForms-JSON\uff1a\u4e00\u4e2a WTForms \u6269\u5c55\uff0c\u7528\u6765\u5904\u7406 JSON \u6570\u636e\u3002\n\u5b98\u7f51\n\n\n\n\n\u6570\u636e\u9a8c\u8bc1\n\n\n\u6570\u636e\u9a8c\u8bc1\u5e93\u3002\u591a\u7528\u4e8e\u8868\u5355\u9a8c\u8bc1\u3002\n\n\n\n\nCerberus\uff1a\u4e00\u4e2a\u6620\u5c04\u9a8c\u8bc1\u5668\uff08mappings-validator\uff09\u3002\u652f\u6301\u591a\u79cd\u89c4\u5219\uff0c\u63d0\u4f9b\u5f52\u4e00\u5316\u529f\u80fd\uff0c\u53ef\u4ee5\u65b9\u4fbf\u5730\u5b9a\u5236\u4e3a Python \u98ce\u683c\u7684 schema \u5b9a\u4e49\u3002\n\u5b98\u7f51\n\n\ncolander\uff1a\u4e00\u4e2a\u7528\u4e8e\u5bf9\u4ece XML, JSON\uff0cHTML \u8868\u5355\u83b7\u53d6\u7684\u6570\u636e\u6216\u5176\u4ed6\u540c\u6837\u7b80\u5355\u7684\u5e8f\u5217\u5316\u6570\u636e\u8fdb\u884c\u9a8c\u8bc1\u548c\u53cd\u5e8f\u5217\u5316\u7684\u7cfb\u7edf\u3002\n\u5b98\u7f51\n\n\nkmatch\uff1a\u4e00\u79cd\u7528\u4e8e\u5339\u914d/\u9a8c\u8bc1/\u7b5b\u9009 Python \u5b57\u5178\u7684\u8bed\u8a00\u3002\n\u5b98\u7f51\n\n\nschema\uff1a\u4e00\u4e2a\u7528\u4e8e\u5bf9 Python \u6570\u636e\u7ed3\u6784\u8fdb\u884c\u9a8c\u8bc1\u7684\u5e93\u3002\n\u5b98\u7f51\n \n\n\nSchematics\uff1a\u6570\u636e\u7ed3\u6784\u9a8c\u8bc1\u3002\n\u5b98\u7f51\n\n\nvalideer\uff1a\u8f7b\u91cf\u7ea7\u53ef\u6269\u5c55\u7684\u6570\u636e\u9a8c\u8bc1\u548c\u9002\u914d\u5e93\u3002\n\u5b98\u7f51\n\n\nvoluptuous\uff1a\u4e00\u4e2a Python \u6570\u636e\u9a8c\u8bc1\u5e93\u3002\u4e3b\u8981\u662f\u4e3a\u4e86\u9a8c\u8bc1\u4f20\u5165 Python \u7684 JSON\uff0cYAML \u7b49\u6570\u636e\u3002\n\u5b98\u7f51\n\n\n\n\n\u53cd\u5783\u573e\u6280\u672f\n\n\n\u5e2e\u52a9\u4f60\u548c\u7535\u5b50\u5783\u573e\u8fdb\u884c\u6218\u6597\u7684\u5e93\u3002\n\n\n\n\ndjango-simple-captcha\uff1a\u4e00\u4e2a\u7b80\u5355\u3001\u9ad8\u5ea6\u53ef\u5b9a\u5236\u7684 Django \u5e94\u7528\uff0c\u53ef\u4ee5\u4e3a\u4efb\u4f55 Django \u8868\u5355\u6dfb\u52a0\u9a8c\u8bc1\u7801\u3002\n\u5b98\u7f51\n\n\ndjango-simple-spam-blocker\uff1a\u4e00\u4e2a\u7528\u4e8e Django \u7684\u7b80\u5355\u7684\u7535\u5b50\u5783\u573e\u5c4f\u853d\u5de5\u5177\u3002\n\u5b98\u7f51\n\n\n\n\n\u6807\u8bb0\n\n\n\u7528\u6765\u8fdb\u884c\u6807\u8bb0\u7684\u5e93\u3002\n\n\n\n\ndjango-taggit\uff1a\u7b80\u5355\u7684 Django \u6807\u8bb0\u5de5\u5177\u3002\n\u5b98\u7f51\n\n\n\n\n\u7ba1\u7406\u9762\u677f\n\n\n\u7ba1\u7406\u754c\u9762\u5e93\u3002\n\n\n\n\nAjenti\uff1a\u4e00\u4e2a\u4f60\u7684\u670d\u52a1\u5668\u503c\u5f97\u62e5\u6709\u7684\u7ba1\u7406\u9762\u677f\u3002\n\u5b98\u7f51\n\n\ndjango-suit\uff1aDjango \u7ba1\u7406\u754c\u9762\u7684\u4e00\u4e2a\u66ff\u4ee3\u54c1 (\u4ec5\u5bf9\u4e8e\u975e\u5546\u4e1a\u7528\u9014\u662f\u514d\u8d39\u7684)\u3002\n\u5b98\u7f51\n\n\ndjango-xadmin\uff1aDjango admin \u7684\u4e00\u4e2a\u66ff\u4ee3\u54c1\uff0c\u5177\u6709\u5f88\u591a\u4e0d\u9519\u7684\u529f\u80fd\u3002\n\u5b98\u7f51\n\n\nflask-admin\uff1a\u4e00\u4e2a\u7528\u4e8e Flask \u7684\u7b80\u5355\u53ef\u6269\u5c55\u7684\u7ba1\u7406\u754c\u9762\u6846\u67b6\u3002\n\u5b98\u7f51\n\n\nflower\uff1a\u4e00\u4e2a\u5bf9 Celery \u96c6\u7fa4\u8fdb\u884c\u5b9e\u65f6\u76d1\u63a7\u548c\u63d0\u4f9b web \u7ba1\u7406\u754c\u9762\u7684\u5de5\u5177\u3002\n\u5b98\u7f51\n\n\nGrappelli\uff1aDjango \u7ba1\u7406\u754c\u9762\u7684\u4e00\u4e2a\u6f02\u4eae\u7684\u76ae\u80a4\u3002\n\u5b98\u7f51\n \n\n\nWooey\uff1a\u4e00\u4e2a Django \u5e94\u7528\uff0c\u53ef\u4ee5\u4e3a Python \u811a\u672c\u521b\u5efa web \u7528\u6237\u754c\u9762\u3002\n\u5b98\u7f51\n\n\n\n\n\u9759\u6001\u7ad9\u70b9\u751f\u6210\u5668\n\n\n\u9759\u6001\u7ad9\u70b9\u751f\u6210\u5668\u662f\u4e00\u4e2a\u8f6f\u4ef6\uff0c\u5b83\u628a\u6587\u672c\u548c\u6a21\u677f\u4f5c\u4e3a\u8f93\u5165\uff0c\u7136\u540e\u8f93\u51fa HTML \u6587\u4ef6\u3002\n\n\n\n\nPelican\uff1a\u4f7f\u7528 Markdown \u6216 ReST \u6765\u5904\u7406\u5185\u5bb9\uff0c Jinja 2 \u6765\u5236\u4f5c\u4e3b\u9898\u3002\u652f\u6301 DVCS, Disqus.\u3002AGPL \u8bb8\u53ef\u3002\n\u5b98\u7f51\n\n\nCactus\uff1a\u4e3a\u8bbe\u8ba1\u5e08\u8bbe\u8ba1\u7684\u9759\u6001\u7ad9\u70b9\u751f\u6210\u5668\u3002\n\u5b98\u7f51\n \n\n\nHyde\uff1a\u57fa\u4e8e Jinja2 \u7684\u9759\u6001\u7ad9\u70b9\u751f\u6210\u5668\u3002\n\u5b98\u7f51\n\n\nNikola\uff1a\u4e00\u4e2a\u9759\u6001\u7f51\u7ad9\u548c\u535a\u5ba2\u751f\u6210\u5668\u3002\n\u5b98\u7f51\n\n\nTinkerer\uff1aTinkerer \u662f\u4e00\u4e2a\u535a\u5ba2\u5f15\u64ce/\u9759\u6001\u7ad9\u70b9\u751f\u6210\u5668\uff0c\u7531 Sphinx \u9a71\u52a8\u3002\n\u5b98\u7f51\n\n\nLektor\uff1a\u4e00\u4e2a\u7b80\u5355\u6613\u7528\u7684\u9759\u6001 CMS \u548c\u535a\u5ba2\u5f15\u64ce\u3002\n\u5b98\u7f51\n\n\n\n\n\u8fdb\u7a0b\n\n\n\u64cd\u4f5c\u7cfb\u7edf\u8fdb\u7a0b\u542f\u52a8\u53ca\u901a\u4fe1\u5e93\u3002\n\n\n\n\nenvoy\uff1a\u6bd4 Python \nsubprocess\n \u6a21\u5757\u66f4\u4eba\u6027\u5316\u3002\n\u5b98\u7f51\n\n\nsarge\uff1a\u53e6\u4e00 \u79cd subprocess \u6a21\u5757\u7684\u5c01\u88c5\u3002\n\u5b98\u7f51\n\n\nsh\uff1a\u4e00\u4e2a\u5b8c\u5907\u7684 subprocess \u66ff\u4ee3\u5e93\u3002\n\u5b98\u7f51\n\n\n\n\n\u5e76\u53d1\u548c\u5e76\u884c\n\n\n\u7528\u4ee5\u8fdb\u884c\u5e76\u53d1\u548c\u5e76\u884c\u64cd\u4f5c\u7684\u5e93\u3002\n\n\n\n\nmultiprocessing\uff1a(Python \u6807\u51c6\u5e93) \u57fa\u4e8e\u8fdb\u7a0b\u7684\u201c\u7ebf\u7a0b\u201d\u63a5\u53e3\u3002\n\u5b98\u7f51\n\n\nthreading\uff1a(Python \u6807\u51c6\u5e93)\u66f4\u9ad8\u5c42\u7684\u7ebf\u7a0b\u63a5\u53e3\u3002\n\u5b98\u7f51\n\n\neventlet\uff1a\u652f\u6301 WSGI \u7684\u5f02\u6b65\u6846\u67b6\u3002\n\u5b98\u7f51\n\n\ngevent\uff1a\u4e00\u4e2a\u57fa\u4e8e\u534f\u7a0b\u7684 Python \u7f51\u7edc\u5e93\uff0c\u4f7f\u7528 \ngreenlet\n\u3002\n\u5b98\u7f51\n\n\nTomorrow\uff1a\u7528\u4e8e\u4ea7\u751f\u5f02\u6b65\u4ee3\u7801\u7684\u795e\u5947\u7684\u88c5\u9970\u5668\u8bed\u6cd5\u5b9e\u73b0\u3002\n\u5b98\u7f51\n\n\nuvloop\uff1a\u5728 libuv \u4e4b\u4e0a\u8d85\u5feb\u901f\u5b9e\u73b0 asyncio \u4e8b\u4ef6\u5faa\u73af\u3002\n\u5b98\u7f51\n\n\n\n\n\u7f51\u7edc\n\n\n\u7528\u4e8e\u7f51\u7edc\u7f16\u7a0b\u7684\u5e93\u3002\n\n\n\n\nasyncio\uff1a(Python \u6807\u51c6\u5e93) \u5f02\u6b65 I/O, \u4e8b\u4ef6\u5faa\u73af, \u534f\u7a0b\u4ee5\u53ca\u4efb\u52a1\u3002\n\u5b98\u7f51\n\n\nTwisted\n\uff1a\u4e00\u4e2a\u4e8b\u4ef6\u9a71\u52a8\u7684\u7f51\u7edc\u5f15\u64ce\u3002\n\u5b98\u7f51\n\n\npulsar\uff1a\u4e8b\u4ef6\u9a71\u52a8\u7684\u5e76\u53d1\u6846\u67b6\u3002\n\u5b98\u7f51\n\n\ndiesel\uff1a\u57fa\u4e8e Greenlet \u7684\u4e8b\u4ef6 I/O \u6846\u67b6\u3002\n\u5b98\u7f51\n\n\npyzmq\uff1a\u4e00\u4e2a ZeroMQ \u6d88\u606f\u5e93\u7684 Python \u5c01\u88c5\u3002\n\u5b98\u7f51\n\n\nToapi\uff1a\u4e00\u4e2a\u8f7b\u5de7\uff0c\u7b80\u5355\uff0c\u5feb\u901f\u7684 Flask \u5e93\uff0c\u81f4\u529b\u4e8e\u4e3a\u6240\u6709\u7f51\u7ad9\u63d0\u4f9b API \u670d\u52a1\u3002\n\u5b98\u7f51\n\n\ntxZMQ\uff1a\u57fa\u4e8e Twisted \u7684 ZeroMQ \u6d88\u606f\u5e93\u7684 Python \u5c01\u88c5\u3002\n\u5b98\u7f51\n\n\n\n\nWebSocket\n\n\n\u5e2e\u52a9\u4f7f\u7528 WebSocket \u7684\u5e93\u3002\n\n\n\n\nAutobahnPython\uff1a\u7ed9 Python \u3001\u4f7f\u7528\u7684 WebSocket \n WAMP \u57fa\u4e8e Twisted \u548c \nasyncio\n\u3002\n\u5b98\u7f51\n\n\nCrossbar\uff1a\u5f00\u6e90\u7edf\u4e00\u5e94\u7528\u8def\u7531(Websocket \n WAMP for Python on Autobahn)\u3002\n\u5b98\u7f51\n\n\ndjango-socketio\uff1a\u7ed9 Django \u7528\u7684 WebSockets\u3002\n\u5b98\u7f51\n\n\nWebSocket-for-Python\uff1a\u4e3a Python2/3 \u4ee5\u53ca PyPy \u7f16\u5199\u7684 WebSocket \u5ba2\u6237\u7aef\u548c\u670d\u52a1\u5668\u5e93\u3002\n\u5b98\u7f51\n\n\n\n\nWSGI \u670d\u52a1\u5668\n\n\n\u517c\u5bb9 WSGI \u7684 web \u670d\u52a1\u5668\n\n\n\n\ngunicorn\uff1aPre-forked, \u90e8\u5206\u662f\u7531 C \u8bed\u8a00\u7f16\u5199\u7684\u3002\n\u5b98\u7f51\n\n\nuwsgi\uff1auwsgi \u9879\u76ee\u7684\u76ee\u7684\u662f\u5f00\u53d1\u4e00\u7ec4\u5168\u6808\u5de5\u5177\uff0c\u7528\u6765\u5efa\u7acb\u6258\u7ba1\u670d\u52a1\uff0c \u7531 C \u8bed\u8a00\u7f16\u5199\u3002\n\u5b98\u7f51\n\n\nbjoern\n\uff1a\u5f02\u6b65\uff0c\u975e\u5e38\u5feb\u901f\uff0c\u7531 C \u8bed\u8a00\u7f16\u5199\u3002\n\u5b98\u7f51\n\n\nfapws3\uff1a\u5f02\u6b65 (\u4ec5\u5bf9\u4e8e\u7f51\u7edc\u7aef)\uff0c\u7531 C \u8bed\u8a00\u7f16\u5199\u3002\n\u5b98\u7f51\n\n\nmeinheld\uff1a\u5f02\u6b65\uff0c\u90e8\u5206\u662f\u7531 C \u8bed\u8a00\u7f16\u5199\u7684\u3002\n\u5b98\u7f51\n\n\nnetius\uff1a\u5f02\u6b65\uff0c\u975e\u5e38\u5feb\u901f\u3002\n\u5b98\u7f51\n\n\npaste\uff1a\u591a\u7ebf\u7a0b\uff0c\u7a33\u5b9a\uff0c\u4e45\u7ecf\u8003\u9a8c\u3002\n\u5b98\u7f51\n\n\nrocket\uff1a\u591a\u7ebf\u7a0b\u3002\n\u5b98\u7f51\n\n\nwaitress\uff1a\u591a\u7ebf\u7a0b, \u662f\u5b83\u9a71\u52a8\u7740 Pyramid \u6846\u67b6\u3002\n\u5b98\u7f51\n\n\nWerkzeug\uff1a\u4e00\u4e2a WSGI \u5de5\u5177\u5e93\uff0c\u9a71\u52a8\u7740 Flask \uff0c\u800c\u4e14\u53ef\u4ee5\u5f88\u65b9\u4fbf\u5927\u5d4c\u5165\u5230\u4f60\u7684\u9879\u76ee\u4e2d\u53bb\u3002\n\u5b98\u7f51\n\n\n\n\nRPC \u670d\u52a1\u5668\n\n\n\u517c\u5bb9 RPC \u7684\u670d\u52a1\u5668\u3002\n\n\n\n\nSimpleJSONRPCServer\uff1a\u8fd9\u4e2a\u5e93\u662f JSON-RPC \u89c4\u8303\u7684\u4e00\u4e2a\u5b9e\u73b0\u3002\n\u5b98\u7f51\n\n\nSimpleXMLRPCServer\uff1a(Python \u6807\u51c6\u5e93) \u7b80\u5355\u7684 XML-RPC \u670d\u52a1\u5668\u5b9e\u73b0\uff0c\u5355\u7ebf\u7a0b\u3002\n\u5b98\u7f51\n\n\nzeroRPC\uff1azerorpc \u662f\u4e00\u4e2a\u7075\u6d3b\u7684 RPC \u5b9e\u73b0\uff0c\u57fa\u4e8e ZeroMQ \u548c MessagePack\u3002\n\u5b98\u7f51\n\n\n\n\n\u5bc6\u7801\u5b66\n\n\n\n\ncryptography\uff1a\u8fd9\u4e2a\u8f6f\u4ef6\u5305\u610f\u5728\u63d0\u4f9b\u5bc6\u7801\u5b66\u57fa\u672c\u5185\u5bb9\u548c\u65b9\u6cd5\u63d0\u4f9b\u7ed9 Python \u5f00\u53d1\u8005\u3002\n\u5b98\u7f51\n\n\nhashids\uff1a\u5728 Python \u4e2d\u5b9e\u73b0 \nhashids\n \u3002\n\u5b98\u7f51\n\n\nParamiko\uff1aSSHv2 \u534f\u8bae\u7684 Python (2.6+, 3.3+) \uff0c\u63d0\u4f9b\u5ba2\u6237\u7aef\u548c\u670d\u52a1\u7aef\u7684\u529f\u80fd\u3002\n\u5b98\u7f51\n\n\nPasslib\uff1a\u5b89\u5168\u5bc6\u7801\u5b58\u50a8\uff0f\u54c8\u5e0c\u5e93\uff0c\n\u5b98\u7f51\n\n\nPyCrypto\uff1aPython \u5bc6\u7801\u5b66\u5de5\u5177\u7bb1\u3002\n\u5b98\u7f51\n\n\nPyNacl\uff1a\u7f51\u7edc\u548c\u5bc6\u7801\u5b66(NaCl) \u5e93\u7684 Python \u7ed1\u5b9a\u3002\n\u5b98\u7f51\n\n\n\n\n\u56fe\u5f62\u7528\u6237\u754c\u9762\n\n\n\u7528\u6765\u521b\u5efa\u56fe\u5f62\u7528\u6237\u754c\u9762\u7a0b\u5e8f\u7684\u5e93\u3002\n\n\n\n\ncurses\uff1a\u5185\u5efa\u7684 \nncurses\n \u5c01\u88c5\uff0c\u7528\u6765\u521b\u5efa\u7ec8\u7aef\u56fe\u5f62\u7528\u6237\u754c\u9762\u3002\n\u5b98\u7f51\n\n\nenaml\uff1a\u4f7f\u7528\u7c7b\u4f3c QML \u7684 Declaratic \u8bed\u6cd5\u6765\u521b\u5efa\u7f8e\u89c2\u7684\u7528\u6237\u754c\u9762\u3002\n\u5b98\u7f51\n\n\nkivy\n\uff1a\u4e00\u4e2a\u7528\u6765\u521b\u5efa\u81ea\u7136\u7528\u6237\u4ea4\u4e92\uff08NUI\uff09\u5e94\u7528\u7a0b\u5e8f\u7684\u5e93\uff0c\u53ef\u4ee5\u8fd0\u884c\u5728 Windows, Linux, Mac OS X, Android \u4ee5\u53ca iOS \u5e73\u53f0\u4e0a\u3002\n\u5b98\u7f51\n\n\npyglet\uff1a\u4e00\u4e2a Python \u7684\u8de8\u5e73\u53f0\u7a97\u53e3\u53ca\u591a\u5a92\u4f53\u5e93\u3002\n\u5b98\u7f51\n\n\nPyQt\uff1a\u8de8\u5e73\u53f0\u7528\u6237\u754c\u9762\u6846\u67b6 \nQt\n \u7684 Python \u7ed1\u5b9a \uff0c\u652f\u6301 Qt v4 \u548c Qt v5\u3002\n\u5b98\u7f51\n\n\nPySide\uff1a\u8de8\u5e73\u53f0\u7528\u6237\u754c\u9762\u6846\u67b6 \nQt\n \u7684 Python \u7ed1\u5b9a \uff0c\u652f\u6301 Qt v4\u3002\n\u5b98\u7f51\n\n\nTkinter\uff1aTkinter \u662f Python GUI \u7684\u4e00\u4e2a\u4e8b\u5b9e\u6807\u51c6\u5e93\u3002\n\u5b98\u7f51\n\n\nToga\uff1a\u4e00\u4e2a Python \u539f\u751f\u7684, \u64cd\u4f5c\u7cfb\u7edf\u539f\u751f\u7684 GUI \u5de5\u5177\u5305\u3002\n\u5b98\u7f51\n\n\nurwid\uff1a\u4e00\u4e2a\u7528\u6765\u521b\u5efa\u7ec8\u7aef GUI \u5e94\u7528\u7684\u5e93\uff0c\u652f\u6301\u7ec4\u4ef6\uff0c\u4e8b\u4ef6\u548c\u4e30\u5bcc\u7684\u8272\u5f69\u7b49\u3002\n\u5b98\u7f51\n\n\nwxPython\uff1awxPython \u662f wxWidgets C++ \u7c7b\u5e93\u548c Python \u8bed\u8a00\u6df7\u5408\u7684\u4ea7\u7269\u3002\n\u5b98\u7f51\n\n\nPyGObject\uff1aGLib/GObject/GIO/GTK+ (GTK+3) \u7684 Python \u7ed1\u5b9a\u3002\n\u5b98\u7f51\n\n\nFlexx\uff1aFlexx \u662f\u4e00\u4e2a\u7eaf Python \u8bed\u8a00\u7f16\u5199\u7684\u7528\u6765\u521b\u5efa GUI \u7a0b\u5e8f\u7684\u5de5\u5177\u96c6\uff0c\u5b83\u4f7f\u7528 web \u6280\u672f\u8fdb\u884c\u754c\u9762\u7684\u5c55\u793a\u3002\n\u5b98\u7f51\n\n\n\n\n\u6e38\u620f\u5f00\u53d1\n\n\n\u8d85\u8d5e\u7684\u6e38\u620f\u5f00\u53d1\u5e93\u3002\n\n\n\n\nCocos2d\uff1acocos2d \u662f\u4e00\u4e2a\u7528\u6765\u5f00\u53d1 2D \u6e38\u620f\uff0c \u793a\u4f8b\u548c\u5176\u4ed6\u56fe\u5f62/\u4ea4\u4e92\u5e94\u7528\u7684\u6846\u67b6\u3002\u57fa\u4e8e pyglet\u3002\n\u5b98\u7f51\n\n\nPanda3D\uff1a\u7531\u8fea\u58eb\u5c3c\u5f00\u53d1\u7684 3D \u6e38\u620f\u5f15\u64ce\uff0c\u5e76\u7531\u5361\u5185\u57fa\u6885\u9647\u5a31\u4e50\u6280\u672f\u4e2d\u5fc3\u8d1f\u8d23\u7ef4\u62a4\u3002\u4f7f\u7528 C++ \u7f16\u5199, \u9488\u5bf9 Python \u8fdb\u884c\u4e86\u5b8c\u5168\u7684\u5c01\u88c5\u3002\n\u5b98\u7f51\n\n\nPygame\uff1aPygame \u662f\u4e00\u7ec4 Python \u6a21\u5757\uff0c\u7528\u6765\u7f16\u5199\u6e38\u620f\u3002\n\u5b98\u7f51\n\n\nPyOgre\uff1aOgre 3D \u6e32\u67d3\u5f15\u64ce\u7684 Python \u7ed1\u5b9a\uff0c\u53ef\u4ee5\u7528\u6765\u5f00\u53d1\u6e38\u620f\u548c\u4eff\u771f\u7a0b\u5e8f\u7b49\u4efb\u4f55 3D \u5e94\u7528\u3002\n\u5b98\u7f51\n\n\nPyOpenGL\uff1aOpenGL \u7684 Python \u7ed1\u5b9a\u53ca\u5176\u76f8\u5173 APIs\u3002\n\u5b98\u7f51\n\n\nPySDL2\uff1aSDL2 \u5e93\u7684\u5c01\u88c5\uff0c\u57fa\u4e8e ctypes\u3002\n\u5b98\u7f51\n\n\nRenPy\uff1a\u4e00\u4e2a\u89c6\u89c9\u5c0f\u8bf4\uff08visual novel\uff09\u5f15\u64ce\u3002\n\u5b98\u7f51\n\n\n\n\n\u65e5\u5fd7\n\n\n\u7528\u6765\u751f\u6210\u548c\u64cd\u4f5c\u65e5\u5fd7\u7684\u5e93\u3002\n\n\n\n\nlogging\uff1a(Python \u6807\u51c6\u5e93) \u4e3a Python \u63d0\u4f9b\u65e5\u5fd7\u529f\u80fd\u3002\n\u5b98\u7f51\n\n\nlogbook\uff1aLogging \u5e93\u7684\u66ff\u4ee3\u54c1\u3002\n\u5b98\u7f51\n\n\nEliot\uff1a\u4e3a\u590d\u6742\u7684\u548c\u5206\u5e03\u5f0f\u7cfb\u7edf\u521b\u5efa\u65e5\u5fd7\u3002\n\u5b98\u7f51\n\n\nRaven\uff1aSentry \u7684 Python \u5ba2\u6237\u7aef\u3002\n\u5b98\u7f51\n\n\nSentry\uff1a\u5b9e\u65f6\u8bb0\u5f55\u548c\u6536\u96c6\u65e5\u5fd7\u7684\u670d\u52a1\u5668\u3002\n\u5b98\u7f51\n\n\n\n\n\u6d4b\u8bd5\n\n\n\u8fdb\u884c\u4ee3\u7801\u5e93\u6d4b\u8bd5\u548c\u751f\u6210\u6d4b\u8bd5\u6570\u636e\u7684\u5e93\u3002\n\n\n\n\n\u6d4b\u8bd5\u6846\u67b6\n\n\nunittest\uff1a(Python \u6807\u51c6\u5e93) \u5355\u5143\u6d4b\u8bd5\u6846\u67b6\u3002\n\u5b98\u7f51\n\n\nnose\uff1anose \u6269\u5c55\u4e86 unittest \u7684\u529f\u80fd\u3002\n\u5b98\u7f51\n\n\ncontexts\uff1a\u4e00\u4e2a Python 3.3+ \u7684 BDD \u6846\u67b6\u3002\u53d7\u5230 C# \u2013 Machine.Specifications \u7684\u542f\u53d1\u3002\n\u5b98\u7f51\n\n\nhypothesis\uff1aHypothesis \u662f\u4e00\u4e2a\u57fa\u4e8e\u5148\u8fdb\u7684 Quickcheck \u98ce\u683c\u7279\u6027\u7684\u6d4b\u8bd5\u5e93\u3002\n\u5b98\u7f51\n\n\nmamba\uff1aPython \u7684\u7ec8\u6781\u6d4b\u8bd5\u5de5\u5177\uff0c \u62e5\u62a4 BDD\u3002\n\u5b98\u7f51\n\n\nPyAutoGUI\uff1aPyAutoGUI \u662f\u4e00\u4e2a\u4eba\u6027\u5316\u7684\u8de8\u5e73\u53f0 GUI \u81ea\u52a8\u6d4b\u8bd5\u6a21\u5757\u3002\n\u5b98\u7f51\n\n\npyshould\uff1aShould \u98ce\u683c\u7684\u65ad\u8a00\uff0c\u57fa\u4e8e \nPyHamcrest\n\u3002\n\u5b98\u7f51\n\n\npytest\uff1a\u4e00\u4e2a\u6210\u719f\u7684\u5168\u529f\u80fd Python \u6d4b\u8bd5\u5de5\u5177\u3002\n\u5b98\u7f51\n\n\ngreen\uff1a\u5e72\u51c0\uff0c\u591a\u5f69\u7684\u6d4b\u8bd5\u5de5\u5177\u3002\n\u5b98\u7f51\n\n\npyvows\uff1aBDD \u98ce\u683c\u7684\u6d4b\u8bd5\u5de5\u5177\uff0c\u53d7 Vows.js \u7684\u542f\u53d1\u3002\n\u5b98\u7f51\n\n\nRobot Framework\uff1a\u4e00\u4e2a\u901a\u7528\u7684\u81ea\u52a8\u5316\u6d4b\u8bd5\u6846\u67b6\u3002\n\u5b98\u7f51\n\n\n\n\n\n\nWeb \u6d4b\u8bd5\n\n\nSelenium\uff1a\nSelenium\n WebDriver \u7684 Python \u7ed1\u5b9a\u3002\n\u5b98\u7f51\n\n\nlocust\uff1a\u4f7f\u7528 Python \u7f16\u5199\u7684\uff0c\u53ef\u6269\u5c55\u7684\u7528\u6237\u52a0\u8f7d\u6d4b\u8bd5\u5de5\u5177\u3002\n\u5b98\u7f51\n\n\nsixpack\uff1a\u4e00\u4e2a\u548c\u8bed\u8a00\u65e0\u5173\u7684 A/B \u6d4b\u8bd5\u6846\u67b6\u3002\n\u5b98\u7f51\n\n\nsplinter\uff1a\u5f00\u6e90\u7684 web \u5e94\u7528\u6d4b\u8bd5\u5de5\u5177\u3002\n\u5b98\u7f51\n\n\n\n\n\n\nMock \u6d4b\u8bd5\n\n\nmock\uff1a(Python \u6807\u51c6\u5e93) \u4e00\u4e2a\u7528\u4e8e\u4f2a\u9020\u6d4b\u8bd5\u7684\u5e93\u3002\n\u5b98\u7f51\n\n\ndoublex\uff1aPython \u7684\u4e00\u4e2a\u529f\u80fd\u5f3a\u5927\u7684 doubles \u00a0\u6d4b\u8bd5\u6846\u67b6\u3002\n\u5b98\u7f51\n\n\nfreezegun\uff1a\u901a\u8fc7\u4f2a\u9020\u65e5\u671f\u6a21\u5757\u6765\u751f\u6210\u4e0d\u540c\u7684\u65f6\u95f4\u3002\n\u5b98\u7f51\n\n\nhttmock\uff1a\u9488\u5bf9 Python 2.6+ \u548c 3.2+ \u751f\u6210 \u4f2a\u9020\u8bf7\u6c42\u7684\u5e93\u3002\n\u5b98\u7f51\n\n\nhttpretty\uff1aPython \u7684 HTTP \u8bf7\u6c42 mock \u5de5\u5177\u3002\n\u5b98\u7f51\n\n\nresponses\uff1a\u4f2a\u9020 Python \u4e2d\u7684 requests \u5e93\u7684\u4e00\u4e2a\u901a\u7528\u5e93\u3002\n\u5b98\u7f51\n\n\nVCR.py\uff1a\u5728\u4f60\u7684\u6d4b\u8bd5\u4e2d\u8bb0\u5f55\u548c\u91cd\u653e HTTP \u4ea4\u4e92\u3002\n\u5b98\u7f51\n\n\n\n\n\n\n\u5bf9\u8c61\u5de5\u5382\n\n\nfactoryboy\uff1a\u4e00\u4e2a Python \u7528\u7684\u6d4b\u8bd5\u56fa\u4ef6 (test fixtures) \u66ff\u4ee3\u5e93\u3002\n\u5b98\u7f51\n\n\nmixer\uff1a\u53e6\u5916\u4e00\u4e2a\u6d4b\u8bd5\u56fa\u4ef6 (test fixtures) \u66ff\u4ee3\u5e93\uff0c\u652f\u6301 Django, Flask, SQLAlchemy, Peewee \u7b49\u3002\n\u5b98\u7f51\n\n\nmodelmommy\uff1a\u4e3a Django \u6d4b\u8bd5\u521b\u5efa\u968f\u673a\u56fa\u4ef6\u3002\n\u5b98\u7f51\n\n\n\n\n\n\n\u4ee3\u7801\u8986\u76d6\u7387\n\n\ncoverage\uff1a\u4ee3\u7801\u8986\u76d6\u7387\u6d4b\u91cf\u3002\n\u5b98\u7f51\n\n\nCodecov\uff1a\u4e00\u4e2a\u4ee3\u7801\u8986\u76d6\u7387\u6d4b\u8bd5\u5de5\u5177\uff0c\u4e3a\u5f00\u6e90\u9879\u76ee\u63d0\u4f9b\u514d\u8d39\u4ee3\u7801\u8986\u76d6\u7387\u6d4b\u8bd5\u670d\u52a1\u3002\n\u5b98\u7f51\n\n\n\n\n\n\n\u4f2a\u6570\u636e\n\n\nfaker\uff1a\u4e00\u4e2a Python \u5e93\uff0c\u7528\u6765\u751f\u6210\u4f2a\u6570\u636e\u3002\n\u5b98\u7f51\n\n\nfake2db\uff1a\u4f2a\u6570\u636e\u5e93\u751f\u6210\u5668\u3002\n\u5b98\u7f51\n\n\nradar\uff1a\u751f\u6210\u968f\u673a\u7684\u65e5\u671f/\u65f6\u95f4\u3002\n\u5b98\u7f51\n\n\n\n\n\n\n\u9519\u8bef\u5904\u7406\n\n\nFuckIt.py\uff1aFuckIt.py \u4f7f\u7528\u6700\u5148\u8fdb\u7684\u6280\u672f\u6765\u4fdd\u8bc1\u4f60\u7684 Python \u4ee3\u7801\u65e0\u8bba\u5bf9\u9519\u90fd\u80fd\u7ee7\u7eed\u8fd0\u884c\u3002\n\u5b98\u7f51\n\n\n\n\n\n\n\n\n\u4ee3\u7801\u5206\u6790\u548c Lint \u5de5\u5177\n\n\n\u8fdb\u884c\u4ee3\u7801\u5206\u6790\uff0c\u89e3\u6790\u548c\u64cd\u4f5c\u4ee3\u7801\u5e93\u7684\u5e93\u548c\u5de5\u5177\u3002\n\n\n\n\n\u4ee3\u7801\u5206\u6790\n\n\ncoala\uff1a\u8bed\u8a00\u72ec\u7acb\u548c\u6613\u4e8e\u6269\u5c55\u7684\u4ee3\u7801\u5206\u6790\u5e94\u7528\u7a0b\u5e8f\u3002\n\u5b98\u7f51\n\n\ncode2flow\uff1a\u628a\u4f60\u7684 Python \u548c JavaScript \u4ee3\u7801\u8f6c\u6362\u4e3a\u6d41\u7a0b\u56fe\u3002\n\u5b98\u7f51\n\n\npycallgraph\uff1a\u8fd9\u4e2a\u5e93\u53ef\u4ee5\u628a\u4f60\u7684 Python \u5e94\u7528\u7684\u6d41\u7a0b(\u8c03\u7528\u56fe)\u8fdb\u884c\u53ef\u89c6\u5316\u3002\n\u5b98\u7f51\n\n\npysonar2\uff1aPython \u7c7b\u578b\u63a8\u65ad\u548c\u68c0\u7d22\u5de5\u5177\u3002\n\u5b98\u7f51\n\n\n\n\n\n\nLint \u5de5\u5177\n\n\nFlake8\uff1a\u6a21\u5757\u5316\u6e90\u7801\u68c0\u67e5\u5de5\u5177: pep8, pyflakes \u4ee5\u53ca co\u3002\n\u5b98\u7f51\n\n\nPylint\uff1a\u4e00\u4e2a\u5b8c\u5168\u53ef\u5b9a\u5236\u7684\u6e90\u7801\u5206\u6790\u5668\u3002\n\u5b98\u7f51\n\n\nYAPF: Google \u7684 Python \u4ee3\u7801\u683c\u5f0f\u5316\u5de5\u5177\u3002\n\u5b98\u7f51\n\n\npylama\uff1aPython \u548c JavaScript \u7684\u4ee3\u7801\u5ba1\u67e5\u5de5\u5177\u3002\n\u5b98\u7f51\n\n\n\n\n\n\n\u4ee3\u7801\u683c\u5f0f\u5316\n\n\nautopep8\uff1a\u81ea\u52a8\u683c\u5f0f\u5316 Python \u4ee3\u7801\uff0c\u4ee5\u4f7f\u5176\u7b26\u5408 PEP8 \u89c4\u8303\u3002\n\u5b98\u7f51\n\n\nblack\uff1a\u4e00\u4e2a\u575a\u5b9a\u7684 Python \u4ee3\u7801\u683c\u5f0f\u5316\u5de5\u5177\u3002\n\u5b98\u7f51\n\n\n\n\n\n\n\n\n\u8c03\u8bd5\u5de5\u5177\n\n\n\u7528\u6765\u8fdb\u884c\u4ee3\u7801\u8c03\u8bd5\u7684\u5e93\u3002\n\n\n\n\n\u8c03\u8bd5\u5668\n\n\nipdb\uff1aIPython \u542f\u7528\u7684 \npdb\n\u3002\n\u5b98\u7f51\n\n\npudb\uff1a\u5168\u5c4f\uff0c\u57fa\u4e8e\u63a7\u5236\u53f0\u7684 Python \u8c03\u8bd5\u5668\u3002\n\u5b98\u7f51\n\n\npyringe\uff1a\u53ef\u4ee5\u5728 Python \u8fdb\u7a0b\u4e2d\u9644\u52a0\u548c\u6ce8\u5165\u4ee3\u7801\u7684\u8c03\u8bd5\u5668\u3002\n\u5b98\u7f51\n\n\nwdb\uff1a\u4e00\u4e2a\u5947\u5f02\u7684 web \u8c03\u8bd5\u5668\uff0c\u901a\u8fc7 WebSockets \u5de5\u4f5c\u3002\n\u5b98\u7f51\n\n\nwinpdb\uff1a\u4e00\u4e2a\u5177\u6709\u56fe\u5f62\u7528\u6237\u754c\u9762\u7684 Python \u8c03\u8bd5\u5668\uff0c\u53ef\u4ee5\u8fdb\u884c\u8fdc\u7a0b\u8c03\u8bd5\uff0c\u57fa\u4e8e rpdb2\u3002\n\u5b98\u7f51\n\n\ndjango-debug-toolbar\uff1a\u4e3a Django \u663e\u793a\u5404\u79cd\u8c03\u8bd5\u4fe1\u606f\u3002\n\u5b98\u7f51\n\n\ndjango-devserver\uff1a\u4e00\u4e2a Django \u8fd0\u884c\u670d\u52a1\u5668\u7684\u66ff\u4ee3\u54c1\u3002\n\u5b98\u7f51\n\n\nflask-debugtoolbar\uff1adjango-debug-toolbar \u7684 flask \u7248\u3002\n\u5b98\u7f51\n\n\n\n\n\n\n\u6027\u80fd\u5206\u6790\u5668\n\n\nlineprofiler\uff1a\u9010\u884c\u6027\u80fd\u5206\u6790\u3002\n\u5b98\u7f51\n\n\nMemory Profiler\n\uff1a\u76d1\u63a7 Python \u4ee3\u7801\u7684\u5185\u5b58\u4f7f\u7528\u3002\n\u5b98\u7f51\n\u3001\n\u5185\u5b58\n\n\nprofiling\uff1a\u4e00\u4e2a\u4ea4\u4e92\u5f0f Python \u6027\u80fd\u5206\u6790\u5de5\u5177\u3002\n\u5b98\u7f51\n\n\n\n\n\n\n\u5176\u4ed6\n\n\npyelftools\uff1a\u89e3\u6790\u548c\u5206\u6790 ELF \u6587\u4ef6\u4ee5\u53ca DWARF \u8c03\u8bd5\u4fe1\u606f\u3002\n\u5b98\u7f51\n\n\npython-statsd\uff1a\nstatsd\n \u670d\u52a1\u5668\u7684 Python \u5ba2\u6237\u7aef\u3002\n\u5b98\u7f51\n\n\n\n\n\n\n\n\n\u79d1\u5b66\u8ba1\u7b97\u548c\u6570\u636e\u5206\u6790\n\n\n\u7528\u6765\u8fdb\u884c\u79d1\u5b66\u8ba1\u7b97\u548c\u6570\u636e\u5206\u6790\u7684\u5e93\u3002\n\n\n\n\nastropy\uff1a\u4e00\u4e2a\u5929\u6587\u5b66 Python \u5e93\u3002\n\u5b98\u7f51\n\n\nbcbio-nextgen\n\uff1a\u8fd9\u4e2a\u5de5\u5177\u7bb1\u4e3a\u5168\u81ea\u52a8\u9ad8\u901a\u91cf\u6d4b\u5e8f\u5206\u6790\u63d0\u4f9b\u7b26\u5408\u6700\u4f73\u5b9e\u8df5\u7684\u5904\u7406\u6d41\u7a0b\u3002\n\u5b98\u7f51\n\n\nbccb\uff1a\u751f\u7269\u5206\u6790\u76f8\u5173\u4ee3\u7801\u96c6\u5408\u3002\n\u5b98\u7f51\n\n\nBiopython\uff1aBiopython \u662f\u4e00\u7ec4\u53ef\u4ee5\u514d\u8d39\u4f7f\u7528\u7684\u7528\u6765\u8fdb\u884c\u751f\u7269\u8ba1\u7b97\u7684\u5de5\u5177\u3002\n\u5b98\u7f51\n\n\nblaze\n\uff1aNumPy \u548c Pandas \u7684\u5927\u6570\u636e\u63a5\u53e3\u3002\n\u5b98\u7f51\n\n\ncclib\n\uff1a\u4e00\u4e2a\u7528\u6765\u89e3\u6790\u548c\u89e3\u91ca\u8ba1\u7b97\u5316\u5b66\u8f6f\u4ef6\u5305\u8f93\u51fa\u7ed3\u679c\u7684\u5e93\u3002\n\u5b98\u7f51\n\n\nNetworkX\uff1a\u4e00\u4e2a\u4e3a\u590d\u6742\u7f51\u7edc\u8bbe\u8ba1\u7684\u9ad8\u6027\u80fd\u8f6f\u4ef6\u3002\n\u5b98\u7f51\n\n\nNeupy\uff1a\u6267\u884c\u548c\u6d4b\u8bd5\u5404\u79cd\u4e0d\u540c\u7684\u4eba\u5de5\u795e\u7ecf\u7f51\u7edc\u7b97\u6cd5\u3002\n\u5b98\u7f51\n\n\nNumba\uff1aPython JIT (just in time) \u7f16\u8bd1\u5668\uff0c\u9488\u5bf9\u79d1\u5b66\u7528\u7684 Python \uff0c\u7531 Cython \u548c NumPy \u7684\u5f00\u53d1\u8005\u5f00\u53d1\u3002\n\u5b98\u7f51\n\n\nNumPy\n\uff1a\u4f7f\u7528 Python \u8fdb\u884c\u79d1\u5b66\u8ba1\u7b97\u7684\u57fa\u7840\u5305\u3002\n\u5b98\u7f51\n\n\nOpen Babel\uff1a\u4e00\u4e2a\u5316\u5b66\u5de5\u5177\u7bb1\uff0c\u7528\u6765\u63cf\u8ff0\u591a\u79cd\u5316\u5b66\u6570\u636e\u3002\n\u5b98\u7f51\n\n\nOpen Mining\n\uff1a\u4f7f\u7528 Python \u6316\u6398\u5546\u4e1a\u60c5\u62a5 (BI) (Pandas web \u63a5\u53e3)\u3002\n\u5b98\u7f51\n\n\norange\n\uff1a\u901a\u8fc7\u53ef\u89c6\u5316\u7f16\u7a0b\u6216 Python \u811a\u672c\u8fdb\u884c\u6570\u636e\u6316\u6398\uff0c\u6570\u636e\u53ef\u89c6\u5316\uff0c\u5206\u6790\u548c\u673a\u5668\u5b66\u4e60\u3002\n\u5b98\u7f51\n\n\nPandas\uff1a\u63d0\u4f9b\u9ad8\u6027\u80fd\uff0c\u6613\u7528\u7684\u6570\u636e\u7ed3\u6784\u548c\u6570\u636e\u5206\u6790\u5de5\u5177\u3002\n\u5b98\u7f51\n\n\nPyDy\uff1aPyDy \u662f Python Dynamics \u7684\u7f29\u5199\uff0c\u7528\u6765\u4e3a\u52a8\u529b\u5b66\u8fd0\u52a8\u5efa\u6a21\u5de5\u4f5c\u6d41\u7a0b\u63d0\u4f9b\u5e2e\u52a9\uff0c \u57fa\u4e8e NumPy, SciPy, IPython \u548c matplotlib\u3002\n\u5b98\u7f51\n\n\nPyMC\n\uff1a\u9a6c\u5c14\u79d1\u592b\u94fe\u8499\u7279\u5361\u6d1b\u91c7\u6837\u5de5\u5177\u3002\n\u5b98\u7f51\n\n\nRDKit\uff1a\u5316\u5b66\u4fe1\u606f\u5b66\u548c\u673a\u5668\u5b66\u4e60\u8f6f\u4ef6\u3002\n\u5b98\u7f51\n\n\nSciPy\n\uff1a\u7531\u4e00\u4e9b\u57fa\u4e8e Python \uff0c\u7528\u4e8e\u6570\u5b66\uff0c\u79d1\u5b66\u548c\u5de5\u7a0b\u7684\u5f00\u6e90\u8f6f\u4ef6\u6784\u6210\u7684\u751f\u6001\u7cfb\u7edf\u3002\n\u5b98\u7f51\n\n\nstatsmodels\n\uff1a\u7edf\u8ba1\u5efa\u6a21\u548c\u8ba1\u91cf\u7ecf\u6d4e\u5b66\u3002\n\u5b98\u7f51\n\n\nSymPy\uff1a\u4e00\u4e2a\u7528\u4e8e\u7b26\u53f7\u6570\u5b66\u7684 Python \u5e93\u3002\n\u5b98\u7f51\n\n\nzipline\uff1a\u4e00\u4e2a Python \u7b97\u6cd5\u4ea4\u6613\u5e93\u3002\n\u5b98\u7f51\n\n\nBayesian-belief-networks\n\uff1a\u4f18\u96c5\u7684\u8d1d\u53f6\u65af\u4fe1\u5ff5\u7f51\u7edc\u6846\u67b6\u3002\n\u5b98\u7f51\n\n\n\n\n\u6570\u636e\u53ef\u89c6\u5316\n\n\n\u8fdb\u884c\u6570\u636e\u53ef\u89c6\u5316\u7684\u5e93\u3002 \u53c2\u89c1: \nawesome-javascript\n\u3002\n\n\n\n\nmatplotlib\uff1a\u4e00\u4e2a Python 2D \u7ed8\u56fe\u5e93\u3002\n\u5b98\u7f51\n\n\nbokeh\uff1a\u7528 Python \u8fdb\u884c\u4ea4\u4e92\u5f0f web \u7ed8\u56fe\u3002\n\u5b98\u7f51\n\n\nggplot\uff1aggplot2 \u7ed9 R \u63d0\u4f9b\u7684 API \u7684 Python \u7248\u672c\u3002\n\u5b98\u7f51\n\n\nplotly\uff1a\u534f\u540c Python \u548c matplotlib \u5de5\u4f5c\u7684 web \u7ed8\u56fe\u5e93\u3002\n\u5b98\u7f51\n\n\npyecharts\uff1a\u57fa\u4e8e\u767e\u5ea6 Echarts \u7684\u6570\u636e\u53ef\u89c6\u5316\u5e93\u3002\n\u5b98\u7f51\n\n\npygal\uff1a\u4e00\u4e2a Python SVG \u56fe\u8868\u521b\u5efa\u5de5\u5177\u3002\n\u5b98\u7f51\n\n\npygraphviz\uff1aGraphviz \u7684 Python \u63a5\u53e3\u3002\n\u5b98\u7f51\n\n\nPyQtGraph\uff1a\u4ea4\u4e92\u5f0f\u5b9e\u65f6 2D/3D/ \u56fe\u50cf\u7ed8\u5236\u53ca\u79d1\u5b66/\u5de5\u7a0b\u5b66\u7ec4\u4ef6\u3002\n\u5b98\u7f51\n\n\nSnakeViz\uff1a\u4e00\u4e2a\u57fa\u4e8e\u6d4f\u89c8\u5668\u7684 Python's cProfile \u6a21\u5757\u8f93\u51fa\u7ed3\u679c\u67e5\u770b\u5de5\u5177\u3002\n\u5b98\u7f51\n\n\nvincent\uff1a\u628a Python \u8f6c\u6362\u4e3a Vega \u8bed\u6cd5\u7684\u8f6c\u6362\u5de5\u5177\u3002\n\u5b98\u7f51\n\n\nVisPy\uff1a\u57fa\u4e8e OpenGL \u7684\u9ad8\u6027\u80fd\u79d1\u5b66\u53ef\u89c6\u5316\u5de5\u5177\u3002\n\u5b98\u7f51\n\n\n\n\n\u8ba1\u7b97\u673a\u89c6\u89c9\n\n\n\u8ba1\u7b97\u673a\u89c6\u89c9\u5e93\u3002\n\n\n\n\nOpenCV\uff1a\u5f00\u6e90\u8ba1\u7b97\u673a\u89c6\u89c9\u5e93\u3002\n\u5b98\u7f51\n\n\npyocr\uff1aTesseract \u548c Cuneiform \u7684\u5305\u88c5\u5e93\u3002\n\u5b98\u7f51\n\n\npytesseract\uff1a\nGoogle Tesseract OCR\n \u7684\u53e6\u4e00\u5305\u88c5\u5e93\u3002\n\u5b98\u7f51\n\n\nSimpleCV\n\uff1a\u4e00\u4e2a\u7528\u6765\u521b\u5efa\u8ba1\u7b97\u673a\u89c6\u89c9\u5e94\u7528\u7684\u5f00\u6e90\u6846\u67b6\u3002\n\u5b98\u7f51\n\n\n\n\n\u673a\u5668\u5b66\u4e60\n\n\n\u673a\u5668\u5b66\u4e60\u5e93\u3002 \u53c2\u89c1: \nawesome-machine-learning\n.\n\n\n\n\nCaffe: \u4e00\u4e2a \nCaffe\n \u7684 python \u63a5\u53e3\u3002\n\u5b98\u7f51\n\n\nCaffe2\n\uff1a\u4e00\u4e2a\u8f7b\u91cf\u7ea7\u7684\uff0c\u6a21\u5757\u5316\u7684\uff0c\u53ef\u6269\u5c55\u7684\u6df1\u5ea6\u5b66\u4e60\u6846\u67b6\u3002\n\u5b98\u7f51\n\n\nCrab\uff1a\u7075\u6d3b\u3001\u5feb\u901f\u7684\u63a8\u8350\u5f15\u64ce\u3002\n\u5b98\u7f51\n\n\ngensim\uff1a\u4eba\u6027\u5316\u7684\u8bdd\u9898\u5efa\u6a21\u5e93\u3002\n\u5b98\u7f51\n\n\nhebel\uff1aGPU \u52a0\u901f\u7684\u6df1\u5ea6\u5b66\u4e60\u5e93\u3002\n\u5b98\u7f51\n\n\nkeras\n: \u4ee5 tensorflow/theano/CNTK \u4e3a\u540e\u7aef\u7684\u6df1\u5ea6\u5b66\u4e60\u5c01\u88c5\u5e93\uff0c\u5feb\u901f\u4e0a\u624b\u795e\u7ecf\u7f51\u7edc\u3002\n\u5b98\u7f51\n\n\nMXNet\n\uff1a\u4e00\u4e2a\u9ad8\u6548\u548c\u7075\u6d3b\u7684\u6df1\u5ea6\u5b66\u4e60\u6846\u67b6\u3002\n\u5b98\u7f51\n\n\nNuPIC\uff1a\u667a\u80fd\u8ba1\u7b97 Numenta \u5e73\u53f0\u3002\n\u5b98\u7f51\n\n\npattern\uff1aPython \u7f51\u7edc\u6316\u6398\u6a21\u5757\u3002\n\u5b98\u7f51\n\n\nPyBrain\n\uff1a\u53e6\u4e00\u4e2a Python \u673a\u5668\u5b66\u4e60\u5e93\u3002\n\u5b98\u7f51\n\n\npydeep\uff1aPython \u6df1\u5ea6\u5b66\u4e60\u5e93\u3002\n\u5b98\u7f51\n\n\nPylearn2\n\uff1a\u4e00\u4e2a\u57fa\u4e8e \nTheano\n \u7684\u673a\u5668\u5b66\u4e60\u5e93\u3002\n\u5b98\u7f51\n\n\npython-recsys\n\uff1a\u4e00\u4e2a\u7528\u6765\u5b9e\u73b0\u63a8\u8350\u7cfb\u7edf\u7684 Python \u5e93\u3002\n\u5b98\u7f51\n\n\nPytorch\n\uff1a\u4e00\u4e2a\u5177\u6709\u5f20\u91cf\u548c\u52a8\u6001\u795e\u7ecf\u7f51\u7edc\uff0c\u5e76\u6709\u5f3a\u5927 GPU \u52a0\u901f\u80fd\u529b\u7684\u6df1\u5ea6\u5b66\u4e60\u6846\u67b6\u3002\n\u5b98\u7f51\n\n\nscikit-learn\uff1a\u57fa\u4e8e SciPy \u6784\u5efa\u7684\u673a\u5668\u5b66\u4e60 Python \u6a21\u5757\u3002\n\u5b98\u7f51\n\n\nskflow\uff1a\u4e00\u4e2a \nTensorFlow\n \u7684\u7b80\u5316\u63a5\u53e3(\u6a21\u4eff scikit-learn)\u3002\n\u5b98\u7f51\n\n\nTensorFlow\n\uff1a\u8c37\u6b4c\u5f00\u6e90\u7684\u6700\u53d7\u6b22\u8fce\u7684\u6df1\u5ea6\u5b66\u4e60\u6846\u67b6\u3002\n\u5b98\u7f51\n\n\nTheano\uff1a\u4e00\u4e2a\u5feb\u901f\u6570\u503c\u8ba1\u7b97\u5e93\u3002\n\u5b98\u7f51\n\n\nvowpalporpoise\uff1a\u8f7b\u91cf\u7ea7 \nVowpal Wabbit\n \u7684 Python \u5c01\u88c5\u3002\n\u5b98\u7f51\n\n\n\n\nMapReduce\n\n\nMapReduce \u6846\u67b6\u548c\u5e93\u3002\n\n\n\n\ndpark\n\uff1aSpark \u7684 Python \u514b\u9686\u7248\uff0c\u4e00\u4e2a\u7c7b\u4f3c MapReduce \u7684\u6846\u67b6\u3002\n\u5b98\u7f51\n\n\ndumbo\uff1a\u8fd9\u4e2a Python \u6a21\u5757\u53ef\u4ee5\u8ba9\u4eba\u8f7b\u677e\u7684\u7f16\u5199\u548c\u8fd0\u884c Hadoop \u7a0b\u5e8f\u3002\n\u5b98\u7f51\n\n\nluigi\uff1a\u8fd9\u4e2a\u6a21\u5757\u5e2e\u4f60\u6784\u5efa\u6279\u5904\u7406\u4f5c\u4e1a\u7684\u590d\u6742\u6d41\u6c34\u7ebf\u3002\n\u5b98\u7f51\n\n\nmrjob\uff1a\u5728 Hadoop \u6216 Amazon Web Services \u4e0a\u8fd0\u884c MapReduce \u4efb\u52a1\u3002\n\u5b98\u7f51\n\n\nPySpark\uff1aSpark \u7684 Python API \u3002\n\u5b98\u7f51\n\n\nstreamparse\uff1a\u8fd0\u884c\u9488\u5bf9\u4e8b\u5b9e\u6570\u636e\u6d41\u7684 Python \u4ee3\u7801\u3002\u96c6\u6210\u4e86 \nApache Storm\n\u3002\n\u5b98\u7f51\n\n\n\n\n\u51fd\u6570\u5f0f\u7f16\u7a0b\n\n\n\u4f7f\u7528 Python \u8fdb\u884c\u51fd\u6570\u5f0f\u7f16\u7a0b\u3002\n\n\n\n\nCyToolz\uff1aToolz \u7684 Cython \u5b9e\u73b0 : \u9ad8\u6027\u80fd\u51fd\u6570\u5f0f\u5de5\u5177\u3002\n\u5b98\u7f51\n\n\nfn.py\uff1a\u5728 Python \u4e2d\u8fdb\u884c\u51fd\u6570\u5f0f\u7f16\u7a0b : \u5b9e\u73b0\u4e86\u4e00\u4e9b\u4eab\u53d7\u51fd\u6570\u5f0f\u7f16\u7a0b\u7f3a\u5931\u7684\u529f\u80fd\u3002\n\u5b98\u7f51\n\n\nfuncy\uff1a\u70ab\u9177\u53c8\u5b9e\u7528\u7684\u51fd\u6570\u5f0f\u5de5\u5177\u3002\n\u5b98\u7f51\n\n\nToolz\uff1a\u4e00\u7ec4\u7528\u4e8e\u8fed\u4ee3\u5668\uff0c\u51fd\u6570\u548c\u5b57\u5178\u7684\u51fd\u6570\u5f0f\u7f16\u7a0b\u5de5\u5177\u3002\n\u5b98\u7f51\n\n\n\n\n\u7b2c\u4e09\u65b9 API\n\n\n\u7528\u6765\u8bbf\u95ee\u7b2c\u4e09\u65b9 API \u7684\u5e93\u3002 \u53c2\u89c1\uff1a \nList of Python API Wrappers and Libraries\n\u3002\n\n\n\n\napache-libcloud\uff1a\u4e00\u4e2a\u4e3a\u5404\u79cd\u4e91\u8bbe\u8ba1\u7684 Python \u5e93\u3002\n\u5b98\u7f51\n\n\nboto\uff1aAmazon Web Services \u7684 Python \u63a5\u53e3\u3002\n\u5b98\u7f51\n\n\ndjango-wordpress\uff1aWordPress models and views for Django.\n\u5b98\u7f51\n\n\nfacebook-sdk\uff1aFacebook \u5e73\u53f0\u7684 Python SDK.\n\u5b98\u7f51\n\n\nfacepy\uff1aFacepy \u8ba9\u548c Facebook's Graph API \u7684\u4ea4\u4e92\u53d8\u5f97\u66f4\u5bb9\u6613\u3002\n\u5b98\u7f51\n\n\ngmail\uff1aGmail \u7684 Python \u63a5\u53e3\u3002\n\u5b98\u7f51\n\n\ngoogle-api-python-client\uff1aPython \u7528\u7684 Google APIs \u5ba2\u6237\u7aef\u5e93\u3002\n\u5b98\u7f51\n\n\ngspread\uff1aGoogle \u7535\u5b50\u8868\u683c\u7684 Python API.\n\u5b98\u7f51\n\n\ntwython\uff1aTwitter API \u7684\u5c01\u88c5\u3002\n\u5b98\u7f51\n\n\n\n\nDevOps \u5de5\u5177\n\n\n\u7528\u4e8e DevOps \u7684\u8f6f\u4ef6\u548c\u5e93\u3002\n\n\n\n\nAnsible\uff1a\u4e00\u4e2a\u975e\u5e38\u7b80\u5355\u7684 IT \u81ea\u52a8\u5316\u5e73\u53f0\u3002\n\u5b98\u7f51\n\n\nSaltStack\uff1a\u57fa\u7840\u8bbe\u65bd\u81ea\u52a8\u5316\u548c\u7ba1\u7406\u7cfb\u7edf\u3002\n\u5b98\u7f51\n\n\nOpenStack\uff1a\u7528\u4e8e\u6784\u5efa\u79c1\u6709\u548c\u516c\u6709\u4e91\u7684\u5f00\u6e90\u8f6f\u4ef6\u3002\n\u5b98\u7f51\n\n\nDocker Compose\uff1a\u5feb\u901f\uff0c\u5206\u79bb\u7684\u5f00\u53d1\u73af\u5883\uff0c\u4f7f\u7528 Docker\u3002\n\u5b98\u7f51\n\n\nFabric\uff1a\u4e00\u4e2a\u7b80\u5355\u7684\uff0cPython \u98ce\u683c\u7684\u5de5\u5177\uff0c\u7528\u6765\u8fdb\u884c\u8fdc\u7a0b\u6267\u884c\u548c\u90e8\u7f72\u3002\n\u5b98\u7f51\n\n\ncuisine\uff1a\u4e3a Fabric \u63d0\u4f9b\u4e00\u7cfb\u5217\u9ad8\u7ea7\u51fd\u6570\u3002\n\u5b98\u7f51\n\n\nFabtools\uff1a\u4e00\u4e2a\u7528\u6765\u7f16\u5199\u8d85\u8d5e\u7684 Fabric \u6587\u4ef6\u7684\u5de5\u5177\u3002\n\u5b98\u7f51\n\n\ngitapi\uff1aGit \u7684\u7eaf Python API\u3002\n\u5b98\u7f51\n\n\nhgapi\uff1aMercurial \u7684\u7eaf Python API\u3002\n\u5b98\u7f51\n\n\nhoncho\uff1a\nForeman\n \u7684 Python \u514b\u9686\u7248\uff0c\u7528\u6765\u7ba1\u7406\u57fa\u4e8e \nProcfile\n \u7684\u5e94\u7528\u3002\n\u5b98\u7f51\n\n\npexpect\uff1aControlling interactive programs in a pseudo-terminal like \u5728\u4e00\u4e2a\u4f2a\u7ec8\u7aef\u4e2d\u63a7\u5236\u4ea4\u4e92\u7a0b\u5e8f\uff0c\u5c31\u50cf GNU expect \u4e00\u6837\u3002\n\u5b98\u7f51\n\n\npsutil\uff1a\u4e00\u4e2a\u8de8\u5e73\u53f0\u8fdb\u7a0b\u548c\u7cfb\u7edf\u5de5\u5177\u6a21\u5757\u3002\n\u5b98\u7f51\n\n\nsupervisor\uff1aUNIX \u7684\u8fdb\u7a0b\u63a7\u5236\u7cfb\u7edf\u3002\n\u5b98\u7f51\n\n\n\n\n\u4efb\u52a1\u8c03\u5ea6\n\n\n\u4efb\u52a1\u8c03\u5ea6\u5e93\u3002\n\n\n\n\nAPScheduler\uff1a\u8f7b\u5de7\u4f46\u5f3a\u5927\u7684\u8fdb\u7a0b\u5185\u4efb\u52a1\u8c03\u5ea6\uff0c\u4f7f\u4f60\u53ef\u4ee5\u8c03\u5ea6\u51fd\u6570\u3002\n\u5b98\u7f51\n\n\ndjango-schedule\uff1a\u4e00\u4e2a Django \u6392\u7a0b\u5e94\u7528\u3002\n\u5b98\u7f51\n\n\ndoit\uff1a\u4e00\u4e2a\u4efb\u52a1\u6267\u884c\u548c\u6784\u5efa\u5de5\u5177\u3002\n\u5b98\u7f51\n\n\ngunnery\uff1a\u5206\u5e03\u5f0f\u7cfb\u7edf\u4f7f\u7528\u7684\u591a\u7528\u9014\u4efb\u52a1\u6267\u884c\u5de5\u5177 \uff0c\u5177\u6709 web \u4ea4\u4e92\u754c\u9762\u3002\n\u5b98\u7f51\n\n\nJoblib\uff1a\u4e00\u7ec4\u4e3a Python \u63d0\u4f9b\u8f7b\u91cf\u7ea7\u4f5c\u4e1a\u6d41\u6c34\u7ebf\u7684\u5de5\u5177\u3002\n\u5b98\u7f51\n\n\nPlan\uff1a\u5982\u6709\u795e\u52a9\u5730\u7f16\u5199 crontab \u6587\u4ef6\u3002\n\u5b98\u7f51\n\n\nschedule\uff1a\u4eba\u6027\u5316\u7684 Python \u4efb\u52a1\u8c03\u5ea6\u5e93\u3002\n\u5b98\u7f51\n\n\nSpiff\uff1a\u4f7f\u7528\u7eaf Python \u5b9e\u73b0\u7684\u5f3a\u5927\u7684\u5de5\u4f5c\u6d41\u5f15\u64ce\u3002\n\u5b98\u7f51\n\n\nTaskFlow\uff1a\u4e00\u4e2a\u53ef\u4ee5\u8ba9\u4f60\u65b9\u4fbf\u6267\u884c\u4efb\u52a1\u7684 Python \u5e93\uff0c\u4e00\u81f4\u5e76\u4e14\u53ef\u9760\u3002\n\u5b98\u7f51\n\n*\u00a0 AirFlow\uff1aAirflow \u662fAirbnb\u516c\u53f8\u5f00\u6e90\u7684\uff0c\u662f\u4e00\u4e2a\u5de5\u4f5c\u6d41\u5206\u914d\u7ba1\u7406\u7cfb\u7edf\uff0c\u901a\u8fc7\u6709\u5411\u975e\u5faa\u73af\u56fe\u7684\u65b9\u5f0f\u7ba1\u7406\u4efb\u52a1\u6d41\u7a0b\uff0c\u8bbe\u7f6e\u4efb\u52a1\u4f9d\u8d56\u5173\u7cfb\u548c\u65f6\u95f4\u8c03\u5ea6\u3002\n\u5b98\u65b9\n\n\u00a0\n\n\n\n\n\u5916\u6765\u51fd\u6570\u63a5\u53e3\n\n\n\u4f7f\u7528\u5916\u6765\u51fd\u6570\u63a5\u53e3\u7684\u5e93\u3002\n\n\n\n\ncffi\uff1a\u7528\u6765\u8c03\u7528 C \u4ee3\u7801\u7684\u5916\u6765\u51fd\u6570\u63a5\u53e3\u3002\n\u5b98\u7f51\n\n\nctypes\n\uff1a(Python \u6807\u51c6\u5e93) \u7528\u6765\u8c03\u7528 C \u4ee3\u7801\u7684\u5916\u6765\u51fd\u6570\u63a5\u53e3\u3002\n\u5b98\u7f51\n\n\nPyCUDA\uff1aNvidia CUDA API \u7684\u5c01\u88c5\u3002\n\u5b98\u7f51\n\n\nSWIG\uff1a\u7b80\u5316\u7684\u5c01\u88c5\u548c\u63a5\u53e3\u751f\u6210\u5668\u3002\n\u5b98\u7f51\n\n\n\n\n\u9ad8\u6027\u80fd\n\n\n\u8ba9 Python \u66f4\u5feb\u7684\u5e93\u3002\n\n\n\n\nCython\uff1a\u4f18\u5316\u7684 Python \u9759\u6001\u7f16\u8bd1\u5668\u3002\u4f7f\u7528\u7c7b\u578b\u6df7\u5408\u4f7f Python \u7f16\u8bd1\u6210 C \u6216 C++ \u6a21\u5757\u6765\u83b7\u5f97\u6027\u80fd\u7684\u6781\u5927\u63d0\u5347\u3002\n\u5b98\u7f51\n\n\nPeachPy\uff1a\u5d4c\u5165 Python \u7684 x86-64 \u6c47\u7f16\u5668\u3002\u53ef\u4ee5\u88ab\u7528\u4f5c Python \u5185\u8054\u7684\u6c47\u7f16\u5668\u6216\u8005\u662f\u72ec\u7acb\u7684\u6c47\u7f16\u5668\uff0c\u7528\u4e8e Windows, Linux, OS X, Native Client \u6216\u8005 Go \u3002\n\u5b98\u7f51\n\n\nPyPy\uff1a\u4f7f\u7528 Python \u5b9e\u73b0\u7684 Python\u3002\u89e3\u91ca\u5668\u4f7f\u7528\u9ed1\u9b54\u6cd5\u52a0\u5feb Python \u8fd0\u884c\u901f\u5ea6\u4e14\u4e0d\u9700\u8981\u52a0\u5165\u989d\u5916\u7684\u7c7b\u578b\u4fe1\u606f\u3002\n\u5b98\u7f51\n\n\nPyston\n\uff1a\u4f7f\u7528 LLVM \u548c\u73b0\u4ee3 JIT \u6280\u672f\u6784\u5efa\u7684 Python \u5b9e\u73b0\uff0c\u76ee\u6807\u662f\u4e3a\u4e86\u83b7\u5f97\u5f88\u597d\u7684\u6027\u80fd\u3002\n\u5b98\u7f51\n\n\nStackless Python\uff1a\u4e00\u4e2a\u5f3a\u5316\u7248\u7684 Python\u3002\n\u5b98\u7f51\n\n\n\n\n\u5fae\u8f6f\u7684 Windows \u5e73\u53f0\n\n\n\u5728 Windows \u5e73\u53f0\u4e0a\u8fdb\u884c Python \u7f16\u7a0b\u3002\n\n\n\n\nPython(x,y)\uff1a\u9762\u5411\u79d1\u5b66\u5e94\u7528\u7684 Python \u53d1\u884c\u7248\uff0c\u57fa\u4e8e Qt \u548c Spyder\u3002\n\u5b98\u7f51\n\n\npythonlibs\uff1a\u975e\u5b98\u65b9\u7684 Windows \u5e73\u53f0 Python \u6269\u5c55\u4e8c\u8fdb\u5236\u5305\u3002\n\u5b98\u7f51\n\n\nPythonNet\uff1aPython \u4e0e .NET \u516c\u5171\u8bed\u8a00\u8fd0\u884c\u5e93 (CLR)\u7684\u96c6\u6210\u3002\n\u5b98\u7f51\n\n\nPyWin32\uff1a\u9488\u5bf9 Windows \u7684 Python \u6269\u5c55\u3002\n\u5b98\u7f51\n\n\nWinPython\uff1aWindows 7/8 \u7cfb\u7edf\u4e0b\u4fbf\u643a\u5f0f\u5f00\u53d1\u73af\u5883\u3002\n\u5b98\u7f51\n\n\n\n\n\u7f51\u7edc\u53ef\u89c6\u5316\u548c SDN\n\n\n\u7528\u6765\u8fdb\u884c\u7f51\u7edc\u53ef\u89c6\u5316\u548c SDN(\u8f6f\u4ef6\u5b9a\u4e49\u7f51\u7edc)\u7684\u5de5\u5177\u548c\u5e93\u3002\n\n\n\n\nMininet\uff1a\u4e00\u6b3e\u6d41\u884c\u7684\u7f51\u7edc\u6a21\u62df\u5668\u4ee5\u53ca\u7528 Python \u7f16\u5199\u7684 API\u3002\n\u5b98\u7f51\n\n\nPOX\uff1a\u4e00\u4e2a\u9488\u5bf9\u57fa\u4e8e Python \u7684\u8f6f\u4ef6\u5b9a\u4e49\u7f51\u7edc\u5e94\u7528\uff08\u4f8b\u5982 OpenFlow SDN \u63a7\u5236\u5668\uff09\u7684\u5f00\u6e90\u5f00\u53d1\u5e73\u53f0\u3002\n\u5b98\u7f51\n\n\nPyretic\uff1a\u706b\u70ed\u7684 SDN \u7f16\u7a0b\u8bed\u8a00\u4e2d\u7684\u4e00\u5458\uff0c\u4e3a\u7f51\u7edc\u4ea4\u6362\u673a\u548c\u6a21\u62df\u5668\u63d0\u4f9b\u5f3a\u5927\u7684\u62bd\u8c61\u80fd\u529b\u3002\n\u5b98\u7f51\n\n\nSDX Platform\uff1a\u57fa\u4e8e SDN \u7684 IXP \u5b9e\u73b0\uff0c\u5f71\u54cd\u4e86 Mininet, POX \u548c Pyretic\u3002\n\u5b98\u7f51\n\n\nNRU\uff1a\u4e00\u4e2a\u57fa\u4e8e\u7ec4\u4ef6\u7684\u8f6f\u4ef6\u5b9a\u4e49\u7f51\u7edc\u6846\u67b6\u3002\n\u5b98\u7f51\n\n\n\n\n\u786c\u4ef6\n\n\n\u7528\u6765\u5bf9\u786c\u4ef6\u8fdb\u884c\u7f16\u7a0b\u7684\u5e93\u3002\n\n\n\n\nino\uff1a\u64cd\u4f5c \nArduino\n \u7684\u547d\u4ee4\u884c\u5de5\u5177\u3002\n\u5b98\u7f51\n \n\n\nPyro\uff1aPython \u673a\u5668\u4eba\u7f16\u7a0b\u5e93\u3002\n\u5b98\u7f51\n\n\nPyUserInput\uff1a\u8de8\u5e73\u53f0\u7684\uff0c\u63a7\u5236\u9f20\u6807\u548c\u952e\u76d8\u7684\u6a21\u5757\u3002\n\u5b98\u7f51\n\n\nscapy\uff1a\u4e00\u4e2a\u975e\u5e38\u68d2\u7684\u64cd\u4f5c\u6570\u636e\u5305\u7684\u5e93\u3002\n\u5b98\u7f51\n\n\nwifi\uff1a\u4e00\u4e2a Python \u5e93\u548c\u547d\u4ee4\u884c\u5de5\u5177\u7528\u6765\u5728 Linux \u5e73\u53f0\u4e0a\u64cd\u4f5c WiFi\u3002\n\u5b98\u7f51\n\n\nPingo\uff1aPingo \u4e3a\u7c7b\u4f3c Raspberry Pi\uff0cpcDuino\uff0c Intel Galileo \u7b49\u8bbe\u5907\u63d0\u4f9b\u7edf\u4e00\u7684 API \u7528\u4ee5\u7f16\u7a0b\u3002\n\u5b98\u7f51\n\n\n\n\n\u517c\u5bb9\u6027\n\n\n\u5e2e\u52a9\u4ece Python 2 \u5411 Python 3 \u8fc1\u79fb\u7684\u5e93\u3002\n\n\n\n\nPython-Future\uff1a\u8fd9\u5c31\u662f Python 2 \u548c Python 3 \u4e4b\u95f4\u4e22\u5931\u7684\u90a3\u4e2a\u517c\u5bb9\u6027\u5c42\u3002\n\u5b98\u7f51\n\n\nPython-Modernize\uff1a\u4f7f Python \u4ee3\u7801\u66f4\u52a0\u73b0\u4ee3\u5316\u4ee5\u4fbf\u6700\u7ec8\u8fc1\u79fb\u5230 Python 3\u3002\n\u5b98\u7f51\n\n\nSix\uff1aPython 2 \u548c 3 \u7684\u517c\u5bb9\u6027\u5de5\u5177\u3002\n\u5b98\u7f51\n\n\n\n\n\u6742\u9879\n\n\n\u4e0d\u5c5e\u4e8e\u4e0a\u9762\u4efb\u4f55\u4e00\u4e2a\u7c7b\u522b\uff0c\u4f46\u662f\u975e\u5e38\u6709\u7528\u7684\u5e93\u3002\n\n\n\n\nblinker\uff1a\u4e00\u4e2a\u5feb\u901f\u7684 Python \u8fdb\u7a0b\u5185\u4fe1\u53f7/\u4e8b\u4ef6\u5206\u53d1\u7cfb\u7edf\u3002\n\u5b98\u7f51\n\n\nitsdangerous\uff1a\u4e00\u7cfb\u5217\u8f85\u52a9\u5de5\u5177\u7528\u6765\u5c06\u53ef\u4fe1\u7684\u6570\u636e\u4f20\u5165\u4e0d\u53ef\u4fe1\u7684\u73af\u5883\u3002\n\u5b98\u7f51\n\n\npluginbase\uff1a\u4e00\u4e2a\u7b80\u5355\u4f46\u662f\u975e\u5e38\u7075\u6d3b\u7684 Python \u63d2\u4ef6\u7cfb\u7edf\u3002\n\u5b98\u7f51\n\n\nPychievements\uff1a\u4e00\u4e2a\u7528\u6765\u521b\u5efa\u548c\u8ffd\u8e2a\u6210\u5c31\u7684 Python \u6846\u67b6\u3002\n\u5b98\u7f51\n\n\nTryton\n\uff1a\u4e00\u4e2a\u901a\u7528\u5546\u52a1\u6846\u67b6\u3002\n\u5b98\u7f51\n\n\n\n\n\u7b97\u6cd5\u548c\u8bbe\u8ba1\u6a21\u5f0f\n\n\nPython \u5b9e\u73b0\u7684\u7b97\u6cd5\u548c\u8bbe\u8ba1\u6a21\u5f0f\u3002\n\n\n\n\nalgorithms\n\uff1a\u4e00\u4e2a Python \u7b97\u6cd5\u6a21\u5757\u3002\n\u5b98\u7f51\n \n\n\npython-patterns\uff1aPython \u8bbe\u8ba1\u6a21\u5f0f\u7684\u96c6\u5408\u3002\n\u5b98\u7f51\n\n\nsortedcontainers\uff1a\u5feb\u901f\uff0c\u7eaf Python \u5b9e\u73b0\u7684 SortedList\uff0cSortedDict \u548c SortedSet \u7c7b\u578b\u3002\n\u5b98\u7f51\n\n\n\n\n\u7f16\u8f91\u5668\u63d2\u4ef6\n\n\n\u7f16\u8f91\u5668\u548c IDE \u7684\u63d2\u4ef6\n\n\n\n\nEmacs\n\n\nElpy\uff1aEmacs Python \u5f00\u53d1\u73af\u5883\u3002\n\u5b98\u7f51\n\n\n\n\n\n\nSublime Text\n\n\nSublimeJEDI\uff1a\u4e00\u4e2a Sublime Text \u63d2\u4ef6\uff0c\u7528\u6765\u4f7f\u7528\u8d85\u8d5e\u7684\u81ea\u52a8\u8865\u5168\u5e93 Jedi\u3002\n\u5b98\u7f51\n\n\nAnaconda\uff1aAnaconda \u628a\u4f60\u7684 Sublime Text 3 \u53d8\u6210\u4e00\u4e2a\u529f\u80fd\u9f50\u5168\u7684 Python IDE\u3002\n\u5b98\u7f51\n\n\n\n\n\n\nVim\n\n\nYouCompleteMe\n\uff1a\u5f15\u5165\u57fa\u4e8e \nJedi\n \u7684 Python \u81ea\u52a8\u8865\u5168\u5f15\u64ce\u3002\n\u5b98\u7f51\n\n\nJedi-vim\uff1a\u7ed1\u5b9a Vim \u548c Jedi \u81ea\u52a8\u8865\u5168\u5e93\u5bf9 Python \u8fdb\u884c\u81ea\u52a8\u8865\u5168\u3002\n\u5b98\u7f51\n\n\nPython-mode\uff1a\u5c06 Vim \u53d8\u6210 Python IDE \u7684\u4e00\u6b3e\u591a\u5408\u4e00\u63d2\u4ef6\u3002\n\u5b98\u7f51\n\n\n\n\n\n\nVisual Studio\n\n\nPTVS\uff1aVisual Studio \u7684 Python \u5de5\u5177\u3002\n\u5b98\u7f51\n\n\n\n\n\n\n\n\n\u96c6\u6210\u5f00\u53d1\u73af\u5883\n\n\n\u6d41\u884c\u7684 Python \u96c6\u6210\u5f00\u53d1\u73af\u5883\u3002\n\n\n\n\nPyCharm\uff1a\u5546\u4e1a\u5316\u7684 Python IDE \uff0c\u7531 JetBrains \u5f00\u53d1\u3002\u4e5f\u6709\u514d\u8d39\u7684\u793e\u533a\u7248\u63d0\u4f9b\u3002\n\u5b98\u7f51\n\n\nLiClipse\uff1a\u57fa\u4e8e Eclipse \u7684\u514d\u8d39\u591a\u8bed\u8a00 IDE \u3002\u4f7f\u7528 PyDev \u6765\u652f\u6301 Python \u3002\n\u5b98\u7f51\n\n\nSpyder\uff1a\u5f00\u6e90 Python IDE\u3002\n\u5b98\u7f51\n\n\n\n\n\u81ea\u52a8\u804a\u5929\u5de5\u5177\n\n\n\u7528\u4e8e\u5f00\u53d1\u804a\u5929\u673a\u5668\u4eba\u7684\u5e93\n\n\n\n\nErrbot\uff1a\u6700\u7b80\u5355\u548c\u6700\u6d41\u884c\u7684\u804a\u5929\u673a\u5668\u4eba\u7528\u6765\u5b9e\u73b0\u81ea\u52a8\u804a\u5929\u5de5\u5177\u3002\n\u5b98\u7f51\n\n\n\n\n\u670d\u52a1\n\n\n\u5728\u7ebf\u5de5\u5177\u548c\u7b80\u5316\u5f00\u53d1\u7684 API \u3002\n\n\n\u91d1\u878d\u6570\u636e\n\n\n\n\nTushare \uff1a\u4e00\u4e2a\u53ef\u4ee5\u63d0\u4f9b\u514d\u8d39\u80a1\u7968\u3001\u57fa\u91d1\u3001\u671f\u8d27\u3001\u6e2f\u80a1\u7b49\u91d1\u878d\u6570\u636e\u7684 Python \u5f00\u6e90\u6570\u636e\u3002\n\u5b98\u7f51\n\n\nTa-Lib \uff1a\u91d1\u878d\u6570\u636e\u6280\u672f\u5206\u6790\u5e93\uff0c\u53ef\u4ee5\u4f9d\u636e\u539f\u59cb\u91d1\u878d\u6570\u636e\u8ba1\u7b97\u5404\u79cd\u6280\u672f\u6307\u6807,\u8ba1\u7b97\u6027\u80fd\u6bd4\u8f83\u4f18\u5f02\u3002\n\u5b98\u7f51\n\n\n\n\n\u6301\u7eed\u96c6\u6210\n\n\n\u53c2\u89c1: \nawesome-CIandCD\n.\n\n\n\n\nTravis CI\uff1a\u4e00\u4e2a\u6d41\u884c\u7684\u5de5\u5177\uff0c\u4e3a\u4f60\u7684\u5f00\u6e90\u548c \n\u79c1\u4eba\n \u9879\u76ee\u63d0\u4f9b\u6301\u7eed\u96c6\u6210\u670d\u52a1\u3002(\u4ec5\u652f\u6301 GitHub)\n\u5b98\u7f51\n\n\nCircleCI\uff1a\u4e00\u4e2a\u6301\u7eed\u96c6\u6210\u5de5\u5177\uff0c\u53ef\u4ee5\u975e\u5e38\u5feb\u901f\u7684\u8fdb\u884c\u5e76\u884c\u6d4b\u8bd5\u3002 (\u4ec5\u652f\u6301 GitHub)\n\u5b98\u7f51\n\n\nVexor CI\uff1a\u4e00\u4e2a\u4e3a\u79c1\u4eba app \u63d0\u4f9b\u6301\u7eed\u96c6\u6210\u7684\u5de5\u5177\uff0c\u652f\u6301\u6309\u5206\u949f\u4ed8\u8d39\u3002\n\u5b98\u7f51\n\n\nWercker\uff1a\u57fa\u4e8e Docker \u5e73\u53f0\uff0c\u7528\u6765\u6784\u5efa\u548c\u90e8\u7f72\u5fae\u670d\u52a1\u3002\n\u5b98\u7f51\n\n\n\n\n\u4ee3\u7801\u8d28\u91cf\n\n\n\n\nCodacy\uff1a\u81ea\u52a8\u5316\u4ee3\u7801\u5ba1\u67e5\uff0c\u66f4\u52a0\u5feb\u901f\u7684\u53d1\u5e03\u9ad8\u8d28\u91cf\u4ee3\u7801\u3002\u5bf9\u4e8e\u5f00\u6e90\u9879\u76ee\u662f\u514d\u8d39\u7684\u3002\n\u5b98\u7f51\n\n\nQuantifiedCode\uff1a\u4e00\u4e2a\u6570\u636e\u9a71\u52a8\u3001\u81ea\u52a8\u3001\u6301\u7eed\u7684\u4ee3\u7801\u5ba1\u67e5\u5de5\u5177\u3002\n\u5b98\u7f51\n\n\n\n\n\u8d44\u6e90\n\n\n\u5728\u8fd9\u91cc\u53ef\u4ee5\u627e\u5230\u65b0\u7684 Python \u5e93\u3002\n\n\n\u7f51\u7ad9\n\n\n\n\nr/Python\n\n\nCoolGithubProjects\n\n\nDjango Packages\n\n\nFull Stack Python\n\n\nPython 3 Wall of Superpowers\n\n\nPython Hackers\n\n\nPython ZEEF\n\n\nTrending Python repositories on GitHub today\n\n\nPyPI Ranking\n\n\n\n\n\u5468\u520a\n\n\n\n\nImport Python Newsletter\n\n\nPycoder's Weekly\n\n\nPython Weekly\n\n\n\n\nTwitter\n\n\n\n\n@codetengu\n\n\n@getpy\n\n\n@planetpython\n\n\n@pycoders\n\n\n@pypi\n\n\n@pythontrending\n\n\n@PythonWeekly\n\n\n\n\n\u5b66\u4e60\u6307\u5357\n\n\n\n\nScipy-lecture-notes\n\uff1a\u5982\u4f55\u7528 Python \u6765\u505a\u5b66\u672f\uff1f\n\u5b98\u7f51\n\n\nSScientific-python-lectures\n\uff1aPython \u79d1\u5b66\u8ba1\u7b97\u7684\u8d44\u6599\u3002\n\u5b98\u7f51\n\n\nMario-Level-1\n\uff1a\u7528 Python \u548c Pygame \u5199\u7684\u8d85\u7ea7\u9a6c\u91cc\u5965\u7b2c\u4e00\u5173\u3002\n\u5b98\u7f51\n\n\nPython Koans\n\uff1aPython \u7684\u4ea4\u4e92\u5f0f\u5b66\u4e60\u5de5\u5177\u3002\n\u5b98\u7f51\n\n\nMinecraft\n\uff1a\u7528 python \u5199\u7684 Minecraft \u6e38\u620f\u3002\n\u5b98\u7f51\n\n\npycrumbs\n\uff1aPython \u8d44\u6e90\u5927\u5168\u3002\n\u5b98\u7f51\n\n\npython-patterns\n\uff1a\u4f7f\u7528 python \u5b9e\u73b0\u8bbe\u8ba1\u6a21\u5f0f\u3002\n\u5b98\u7f51\n\n\nProjects\n\uff1aPython \u9879\u76ee\u5927\u96c6\u5408\u3002\n\u5b98\u7f51\n\n\nThe Hitchhiker\u2019s Guide to Python\n\uff1a\u65c5\u884c\u8005\u7684 Python \u5b66\u4e60\u6307\u5357\u3002\n\u5b98\u7f51\n\n\nCode Like a Pythonista: Idiomatic Python\n\uff1a\u5982\u4f55\u50cf Python \u9ad8\u624b(Pythonista)\u4e00\u6837\u7f16\u7a0b\u3002\n\u5b98\u7f51\n\n\n\n\n\u77e5\u540d\u7f51\u7ad9\n\n\n\n\u503c\u5f97\u5173\u6ce8\u7684 Python \u6280\u672f\u7ad9\u70b9\u3002\n\n\n\u4e2d\u6587\u7ad9\u70b9\n\n\n\n\n\n\u4f2f\u4e50\u5728\u7ebf Python \u9891\u9053\uff1a\u5206\u4eab Python \u5f00\u53d1\u6280\u672f\u3001\u76f8\u5173\u7684\u884c\u4e1a\u52a8\u6001\u3002\n\u5b98\u7f51\n\n\n\n\n\u82f1\u6587\u7ad9\u70b9\n\n\n\n\n\n\u300a\n\u503c\u5f97\u5173\u6ce8\u7684 10 \u4e2a Python \u82f1\u6587\u535a\u5ba2\n\u300b\n\n\n\n\n\u5fae\u535a\u3001\u5fae\u4fe1\u516c\u4f17\u53f7\n\n\n\n\n\nPython\u5f00\u53d1\u8005 \u5fae\u535a\uff1a\n@Python\u5f00\u53d1\u8005\n\n\nPython\u5f00\u53d1\u8005\uff1a\u4eba\u751f\u82e6\u77ed\uff0c\u6211\u7528 Python\u3002Python \u8d8a\u6765\u8d8a\u53d7\u5e7f\u5927\u7a0b\u5e8f\u5458\u7684\u559c\u7231\u3002\u300cPython\u5f00\u53d1\u8005\u300d\u662f\u6700\u53d7\u6b22\u8fce\u7684\u3001\u4e13\u6ce8\u5206\u4eab Python \u6280\u672f\u7684\u5fae\u4fe1\u516c\u4f17\u53f7\uff0c\u4e3b\u8981\u5206\u4eab Python \u76f8\u5173\u7684\u6280\u672f\u6587\u7ae0\u3001\u5de5\u5177\u8d44\u6e90\u548c\u8d44\u8baf\u7b49\u3002", + "title": "\u4eba\u751f\u82e6\u77ed\uff0c\u6211\u7528 Python" + }, + { + "location": "/#python", + "text": "\u6211\u60f3\u5f88\u591a\u7a0b\u5e8f\u5458\u5e94\u8be5\u8bb0\u5f97 GitHub \u4e0a\u6709\u4e00\u4e2a Awesome - XXX \u7cfb\u5217\u7684\u8d44\u6e90\u6574\u7406\u3002 awesome-python \u662f vinta \u53d1\u8d77\u7ef4\u62a4\u7684 Python \u8d44\u6e90\u5217\u8868\uff0c\u5185\u5bb9\u5305\u62ec\uff1aWeb \u6846\u67b6\u3001\u7f51\u7edc\u722c\u866b\u3001\u7f51\u7edc\u5185\u5bb9\u63d0\u53d6\u3001\u6a21\u677f\u5f15\u64ce\u3001\u6570\u636e\u5e93\u3001\u6570\u636e\u53ef\u89c6\u5316\u3001\u56fe\u7247\u5904\u7406\u3001\u6587\u672c\u5904\u7406\u3001\u81ea\u7136\u8bed\u8a00\u5904\u7406\u3001\u673a\u5668\u5b66\u4e60\u3001\u65e5\u5fd7\u3001\u4ee3\u7801\u5206\u6790\u7b49\u3002\u7531\u4f2f\u4e50\u5728\u7ebf\u6301\u7eed\u66f4\u65b0\u3002 Awesome \u7cfb\u5217\u867d\u7136\u633a\u5168\uff0c\u4f46\u57fa\u672c\u53ea\u5bf9\u6536\u5f55\u7684\u8d44\u6e90\u505a\u4e86\u6781\u4e3a\u7b80\u8981\u7684\u4ecb\u7ecd\uff0c\u5982\u679c\u6709\u66f4\u8be6\u7ec6\u7684\u4e2d\u6587\u4ecb\u7ecd\uff0c\u5bf9\u76f8\u5e94\u5f00\u53d1\u8005\u7684\u5e2e\u52a9\u4f1a\u66f4\u5927\u3002\u8fd9\u4e5f\u662f\u6211\u4eec\u53d1\u8d77\u8fd9\u4e2a\u5f00\u6e90\u9879\u76ee\u7684\u521d\u8877\u3002", + "title": "Python \u8d44\u6e90\u5927\u5168\u4e2d\u6587\u7248" + }, + { + "location": "/#_1", + "text": "\u57fa\u4e8e awesome-python \u5217\u8868\uff0c\u6211\u4eec\u5c06\u5bf9\u5176\u4e2d\u7684\u5404\u4e2a\u8d44\u6e90\u9879\u8fdb\u884c\u7f16\u8bd1\u6574\u7406\u3002\u6b64\u5916\u8fd8\u5c06\u4ece\u5176\u4ed6\u6765\u6e90\u8865\u5145\u597d\u8d44\u6e90\u3002 \u6574\u7406\u540e\u7684\u5185\u5bb9\uff0c\u5c06\u6536\u5f55\u5728 \u4f2f\u4e50\u5728\u7ebf\u8d44\u6e90\u9891\u9053 \u3002\u53ef\u53c2\u8003\u5df2\u6574\u7406\u7684\u5185\u5bb9\uff1a \u300a Scrapy\uff1aPython \u7684\u722c\u866b\u6846\u67b6 \u300b \u300a Flask\uff1a\u4e00\u4e2a\u4f7f\u7528 Python \u7f16\u5199\u7684\u8f7b\u91cf\u7ea7 Web \u5e94\u7528\u6846\u67b6 \u300b", + "title": "\u6211\u4eec\u8981\u505a\u4ec0\u4e48\uff1f" + }, + { + "location": "/#_2", + "text": "\u6b22\u8fce\u5927\u5bb6\u4e3a\u5217\u8868\u8d21\u732e\u9ad8\u8d28\u91cf\u7684\u65b0\u8d44\u6e90\uff0c\u63d0\u4ea4 PR \u65f6\u8bf7\u53c2\u7167\u4ee5\u4e0b\u8981\u6c42\uff1a \u8bf7\u786e\u4fdd\u63a8\u8350\u7684\u8d44\u6e90\u81ea\u5df1\u4f7f\u7528\u8fc7 \u63d0\u4ea4 PR \u65f6\u8bf7\u6ce8\u660e\u63a8\u8350\u7406\u7531 \u8d44\u6e90\u5217\u8868\u7ba1\u7406\u6536\u5230 PR \u8bf7\u6c42\u540e\uff0c\u4f1a\u5b9a\u671f\uff08\u6bcf\u5468\uff09\u5728\u5fae\u535a\u8f6c\u53d1\u672c\u5468\u63d0\u4ea4\u7684 PR \u5217\u8868\uff0c\u5e76\u5728\u5fae\u535a\u4e0a\u9762\u542c\u53d6\u4f7f\u7528\u8fc7\u8fd9\u4e9b\u8d44\u6e90\u7684\u610f\u89c1\u3002\u786e\u8ba4\u901a\u8fc7\u540e\uff0c\u4f1a\u52a0\u5165\u8d44\u6e90\u5927\u5168\u3002 \u611f\u8c22\u60a8\u7684\u8d21\u732e\uff01", + "title": "\u5982\u4f55\u4e3a\u5217\u8868\u8d21\u732e\u65b0\u8d44\u6e90\uff1f" + }, + { + "location": "/#_3", + "text": "\u7ef4\u62a4\u8005\uff1a \u8d21\u732e\u8005\uff1a \u827e\u51cc\u98ce \u3001Namco\u3001 Daetalus \u3001 \u9ec4\u5229\u6c11 \u3001 atupal \u3001 rainbow \u3001 \u6728\u5934lbj \u3001 beyondwu \u3001 cissoid \u3001 \u674e\u5e7f\u80dc \u3001 polyval \u3001 \u51b0\u658c \u3001 \u8d75\u53f6\u5b87 \u3001 \u043b stalgic \u3001 \u7855\u6069 \u3001 strongit \u3001 yuukilp \u3001 chenjiandongx \u3001 autopenguin \u3001 visonforcoding \u3001 Super\u8d5b\u4e9a\u4eba \u6ce8\uff1a\u540d\u5355\u4e0d\u5206\u6392\u540d\uff0c\u4e0d\u5b9a\u671f\u8865\u5145\u66f4\u65b0", + "title": "\u672c\u9879\u76ee\u7684\u53c2\u4e0e\u8005" + }, + { + "location": "/#_4", + "text": "\u7ba1\u7406 Python \u7248\u672c\u548c\u73af\u5883\u7684\u5de5\u5177 p\uff1a\u975e\u5e38\u7b80\u5355\u7684\u4ea4\u4e92\u5f0f python \u7248\u672c\u7ba1\u7406\u5de5\u5177\u3002 \u5b98\u7f51 pyenv\uff1a\u7b80\u5355\u7684 Python \u7248\u672c\u7ba1\u7406\u5de5\u5177\u3002 \u5b98\u7f51 Vex\uff1a\u53ef\u4ee5\u5728\u865a\u62df\u73af\u5883\u4e2d\u6267\u884c\u547d\u4ee4\u3002 \u5b98\u7f51 virtualenv\uff1a\u521b\u5efa\u72ec\u7acb Python \u73af\u5883\u7684\u5de5\u5177\u3002 \u5b98\u7f51 virtualenvwrapper\uff1avirtualenv \u7684\u4e00\u7ec4\u6269\u5c55\u3002 \u5b98\u7f51", + "title": "\u73af\u5883\u7ba1\u7406" + }, + { + "location": "/#_5", + "text": "\u7ba1\u7406\u5305\u548c\u4f9d\u8d56\u7684\u5de5\u5177\u3002 pip\uff1aPython \u5305\u548c\u4f9d\u8d56\u5173\u7cfb\u7ba1\u7406\u5de5\u5177\u3002 \u5b98\u7f51 pip-tools\uff1a\u4fdd\u8bc1 Python \u5305\u4f9d\u8d56\u5173\u7cfb\u66f4\u65b0\u7684\u4e00\u7ec4\u5de5\u5177\u3002 \u5b98\u7f51 pipenv\uff1aPyhton \u5b98\u65b9\u63a8\u8350\u7684\u65b0\u4e00\u4ee3\u5305\u7ba1\u7406\u5de5\u5177\u3002 \u5b98\u7f51 conda\uff1a\u8de8\u5e73\u53f0\uff0cPython \u4e8c\u8fdb\u5236\u5305\u7ba1\u7406\u5de5\u5177\u3002 \u5b98\u7f51 Curdling\uff1a\u7ba1\u7406 Python \u5305\u7684\u547d\u4ee4\u884c\u5de5\u5177\u3002 \u5b98\u7f51 wheel\uff1aPython \u5206\u53d1\u7684\u65b0\u6807\u51c6\uff0c\u610f\u5728\u53d6\u4ee3 eggs\u3002 \u5b98\u7f51", + "title": "\u5305\u7ba1\u7406" + }, + { + "location": "/#_6", + "text": "\u672c\u5730 PyPI \u4ed3\u5e93\u670d\u52a1\u548c\u4ee3\u7406\u3002 warehouse \uff1a\u4e0b\u4e00\u4ee3 PyPI\u3002 \u5b98\u7f51 bandersnatch\uff1aPyPA \u63d0\u4f9b\u7684 PyPI \u955c\u50cf\u5de5\u5177\u3002 \u5b98\u7f51 devpi\uff1aPyPI \u670d\u52a1\u548c\u6253\u5305/\u6d4b\u8bd5/\u5206\u53d1\u5de5\u5177\u3002 \u5b98\u7f51 localshop\uff1a\u672c\u5730 PyPI \u670d\u52a1\uff08\u81ea\u5b9a\u4e49\u5305\u5e76\u4e14\u81ea\u52a8\u5bf9 PyPI \u955c\u50cf\uff09\u3002 \u5b98\u7f51", + "title": "\u5305\u4ed3\u5e93" + }, + { + "location": "/#_7", + "text": "\u6253\u5305\u4e3a\u53ef\u6267\u884c\u6587\u4ef6\u4ee5\u4fbf\u5206\u53d1\u3002 PyInstaller\uff1a\u5c06 Python \u7a0b\u5e8f\u8f6c\u6362\u6210\u72ec\u7acb\u7684\u6267\u884c\u6587\u4ef6\uff08\u8de8\u5e73\u53f0\uff09\u3002 \u5b98\u7f51 dh-virtualenv\uff1a\u6784\u5efa\u5e76\u5c06 virtualenv \u865a\u62df\u73af\u5883\u4f5c\u4e3a\u4e00\u4e2a Debian \u5305\u6765\u53d1\u5e03\u3002 \u5b98\u7f51 Nuitka\uff1a\u5c06\u811a\u672c\u3001\u6a21\u5757\u3001\u5305\u7f16\u8bd1\u6210\u53ef\u6267\u884c\u6587\u4ef6\u6216\u6269\u5c55\u6a21\u5757\u3002 \u5b98\u7f51 py2app\uff1a\u5c06 Python \u811a\u672c\u53d8\u4e3a\u72ec\u7acb\u8f6f\u4ef6\u5305\uff08Mac OS X\uff09\u3002 \u5b98\u7f51 py2exe\uff1a\u5c06 Python \u811a\u672c\u53d8\u4e3a\u72ec\u7acb\u8f6f\u4ef6\u5305\uff08Windows\uff09\u3002 \u5b98\u7f51 pynsist\uff1a\u4e00\u4e2a\u7528\u6765\u521b\u5efa Windows \u5b89\u88c5\u7a0b\u5e8f\u7684\u5de5\u5177\uff0c\u53ef\u4ee5\u5728\u5b89\u88c5\u7a0b\u5e8f\u4e2d\u6253\u5305 Python \u672c\u8eab\u3002 \u5b98\u7f51", + "title": "\u5206\u53d1" + }, + { + "location": "/#_8", + "text": "\u5c06\u6e90\u7801\u7f16\u8bd1\u6210\u8f6f\u4ef6\u3002 buildout\uff1a\u4e00\u4e2a\u6784\u5efa\u7cfb\u7edf\uff0c\u4ece\u591a\u4e2a\u7ec4\u4ef6\u6765\u521b\u5efa\uff0c\u7ec4\u88c5\u548c\u90e8\u7f72\u5e94\u7528\u3002 \u5b98\u7f51 BitBake\uff1a\u9488\u5bf9\u5d4c\u5165\u5f0f Linux \u7684\u7c7b\u4f3c make \u7684\u6784\u5efa\u5de5\u5177\u3002 \u5b98\u7f51 fabricate\uff1a\u5bf9\u4efb\u4f55\u8bed\u8a00\u81ea\u52a8\u627e\u5230\u4f9d\u8d56\u5173\u7cfb\u7684\u6784\u5efa\u5de5\u5177\u3002 \u5b98\u7f51 PlatformIO\uff1a\u591a\u5e73\u53f0\u547d\u4ee4\u884c\u6784\u5efa\u5de5\u5177\u3002 \u5b98\u7f51 PyBuilder\uff1a\u7eaf Python \u5b9e\u73b0\u7684\u6301\u7eed\u5316\u6784\u5efa\u5de5\u5177\u3002 \u5b98\u7f51 SCons\uff1a\u8f6f\u4ef6\u6784\u5efa\u5de5\u5177\u3002 \u5b98\u7f51", + "title": "\u6784\u5efa\u5de5\u5177" + }, + { + "location": "/#_9", + "text": "\u4ea4\u4e92\u5f0f Python \u89e3\u6790\u5668\u3002 IPython\uff1a\u529f\u80fd\u4e30\u5bcc\u7684\u5de5\u5177\uff0c\u975e\u5e38\u6709\u6548\u7684\u4f7f\u7528\u4ea4\u4e92\u5f0f Python\u3002 \u5b98\u7f51 bpython \uff1a\u754c\u9762\u4e30\u5bcc\u7684 Python \u89e3\u6790\u5668\u3002 \u5b98\u7f51 ptpython\uff1a\u9ad8\u7ea7\u4ea4\u4e92\u5f0f Python \u89e3\u6790\u5668\uff0c \u6784\u5efa\u4e8e python-prompt-toolkit \u4e4b\u4e0a\u3002 \u5b98\u7f51", + "title": "\u4ea4\u4e92\u5f0f\u89e3\u6790\u5668" + }, + { + "location": "/#_10", + "text": "\u6587\u4ef6\u7ba1\u7406\u548c MIME\uff08\u591a\u7528\u9014\u7684\u7f51\u9645\u90ae\u4ef6\u6269\u5145\u534f\u8bae\uff09\u7c7b\u578b\u68c0\u6d4b\u3002 aiofiles\uff1a\u57fa\u4e8e asyncio\uff0c\u63d0\u4f9b\u6587\u4ef6\u5f02\u6b65\u64cd\u4f5c\u3002 \u5b98\u7f51 imghdr\uff1a\uff08Python \u6807\u51c6\u5e93\uff09\u68c0\u6d4b\u56fe\u7247\u7c7b\u578b\u3002 \u5b98\u7f51 mimetypes\uff1a\uff08Python \u6807\u51c6\u5e93\uff09\u5c06\u6587\u4ef6\u540d\u6620\u5c04\u4e3a MIME \u7c7b\u578b\u3002 \u5b98\u7f51 path.py\uff1a\u5bf9 os.path \u8fdb\u884c\u5c01\u88c5\u7684\u6a21\u5757\u3002 \u5b98\u7f51 pathlib\uff1a\uff08Python3.4+ \u6807\u51c6\u5e93\uff09\u8de8\u5e73\u53f0\u7684\u3001\u9762\u5411\u5bf9\u8c61\u7684\u8def\u5f84\u64cd\u4f5c\u5e93\u3002 \u5b98\u7f51 python-magic\uff1a\u6587\u4ef6\u7c7b\u578b\u68c0\u6d4b\u7684\u7b2c\u4e09\u65b9\u5e93 libmagic \u7684 Python \u63a5\u53e3\u3002 \u5b98\u7f51 Unipath\uff1a\u7528\u9762\u5411\u5bf9\u8c61\u7684\u65b9\u5f0f\u64cd\u4f5c\u6587\u4ef6\u548c\u76ee\u5f55\u3002 \u5b98\u7f51 watchdog\uff1a\u7ba1\u7406\u6587\u4ef6\u7cfb\u7edf\u4e8b\u4ef6\u7684 API \u548c shell \u5de5\u5177\u3002 \u5b98\u7f51", + "title": "\u6587\u4ef6" + }, + { + "location": "/#_11", + "text": "\u64cd\u4f5c\u65e5\u671f\u548c\u65f6\u95f4\u7684\u7c7b\u5e93\u3002 arrow\uff1a\u66f4\u597d\u7684 Python \u65e5\u671f\u65f6\u95f4\u64cd\u4f5c\u7c7b\u5e93\u3002 \u5b98\u7f51 Chronyk\uff1aPython 3 \u7684\u7c7b\u5e93\uff0c\u7528\u4e8e\u89e3\u6790\u624b\u5199\u683c\u5f0f\u7684\u65f6\u95f4\u548c\u65e5\u671f\u3002 \u5b98\u7f51 dateutil\uff1aPython datetime \u6a21\u5757\u7684\u6269\u5c55\u3002 \u5b98\u7f51 delorean\uff1a\u89e3\u51b3 Python \u4e2d\u6709\u5173\u65e5\u671f\u5904\u7406\u7684\u68d8\u624b\u95ee\u9898\u7684\u5e93\u3002 \u5b98\u7f51 maya\uff1a\u4eba\u6027\u5316\u7684\u65f6\u95f4\u5904\u7406\u5e93\u3002 \u5b98\u7f51 moment\uff1a\u4e00\u4e2a\u7528\u6765\u5904\u7406\u65f6\u95f4\u548c\u65e5\u671f\u7684 Python \u5e93\u3002\u7075\u611f\u6765\u81ea\u4e8e Moment.js\u3002 \u5b98\u7f51 pendulum\uff1a\u4e00\u4e2a\u6bd4 arrow \u66f4\u5177\u6709\u660e\u786e\u7684\uff0c\u53ef\u9884\u6d4b\u7684\u884c\u4e3a\u7684\u65f6\u95f4\u64cd\u4f5c\u5e93\u3002 \u5b98\u7f51 PyTime\uff1a\u4e00\u4e2a\u7b80\u5355\u6613\u7528\u7684 Python \u6a21\u5757\uff0c\u7528\u4e8e\u901a\u8fc7\u5b57\u7b26\u4e32\u6765\u64cd\u4f5c\u65e5\u671f/\u65f6\u95f4\u3002 \u5b98\u7f51 pytz\uff1a\u73b0\u4ee3\u4ee5\u53ca\u5386\u53f2\u7248\u672c\u7684\u4e16\u754c\u65f6\u533a\u5b9a\u4e49\u3002\u5c06\u65f6\u533a\u6570\u636e\u5e93\u5f15\u5165 Python\u3002 \u5b98\u7f51 when.py\uff1a\u63d0\u4f9b\u7528\u6237\u53cb\u597d\u7684\u51fd\u6570\u6765\u5e2e\u52a9\u7528\u6237\u8fdb\u884c\u5e38\u7528\u7684\u65e5\u671f\u548c\u65f6\u95f4\u64cd\u4f5c\u3002 \u5b98\u7f51", + "title": "\u65e5\u671f\u548c\u65f6\u95f4" + }, + { + "location": "/#_12", + "text": "\u7528\u4e8e\u89e3\u6790\u548c\u64cd\u4f5c\u6587\u672c\u7684\u5e93\u3002 \u901a\u7528 chardet \uff1a\u5b57\u7b26\u7f16\u7801\u68c0\u6d4b\u5668\uff0c\u517c\u5bb9 Python2 \u548c Python3\u3002 \u5b98\u7f51 difflib\uff1a(Python \u6807\u51c6\u5e93)\u5e2e\u52a9\u6211\u4eec\u8fdb\u884c\u5dee\u5f02\u5316\u6bd4\u8f83\u3002 \u5b98\u7f51 ftfy\uff1a\u8ba9 Unicode \u6587\u672c\u66f4\u5b8c\u6574\u66f4\u8fde\u8d2f\u3002 \u5b98\u7f51 fuzzywuzzy\uff1a\u6a21\u7cca\u5b57\u7b26\u4e32\u5339\u914d\u3002 \u5b98\u7f51 Levenshtein\uff1a\u5feb\u901f\u8ba1\u7b97\u7f16\u8f91\u8ddd\u79bb\u4ee5\u53ca\u5b57\u7b26\u4e32\u7684\u76f8\u4f3c\u5ea6\u3002 \u5b98\u7f51 pangu.py\uff1a\u5728\u4e2d\u65e5\u97e9\u8bed\u5b57\u7b26\u548c\u6570\u5b57\u5b57\u6bcd\u4e4b\u95f4\u6dfb\u52a0\u7a7a\u683c\u3002 \u5b98\u7f51 pypinyin\uff1a\u6c49\u5b57\u62fc\u97f3\u8f6c\u6362\u5de5\u5177 Python \u7248\u3002 \u5b98\u7f51 shortuuid\uff1a\u4e00\u4e2a\u751f\u6210\u5668\u5e93\uff0c\u7528\u4ee5\u751f\u6210\u7b80\u6d01\u7684\uff0c\u660e\u767d\u7684\uff0cURL \u5b89\u5168\u7684 UUID\u3002 \u5b98\u7f51 simplejson \uff1aPython \u7684 JSON \u7f16\u7801\u3001\u89e3\u7801\u5668\u3002 \u5b98\u7f51 unidecode\uff1aUnicode \u6587\u672c\u7684 ASCII \u8f6c\u6362\u5f62\u5f0f \u3002 \u5b98\u7f51 uniout\uff1a\u6253\u5370\u53ef\u8bfb\u7684\u5b57\u7b26\uff0c\u800c\u4e0d\u662f\u8f6c\u4e49\u7684\u5b57\u7b26\u4e32\u3002 \u5b98\u7f51 xpinyin\uff1a\u4e00\u4e2a\u7528\u4e8e\u628a\u6c49\u5b57\u8f6c\u6362\u4e3a\u62fc\u97f3\u7684\u5e93\u3002 \u5b98\u7f51 yfiglet-figlet\uff1a pyfiglet -figlet \u7684 Python \u5b9e\u73b0\u3002 Slug \u5316 awesome-slugify\uff1a\u4e00\u4e2a Python slug \u5316\u5e93\uff0c\u53ef\u4ee5\u4fdd\u6301 Unicode\u3002 \u5b98\u7f51 python-slugify\uff1aPython slug \u5316\u5e93\uff0c\u53ef\u4ee5\u628a unicode \u8f6c\u5316\u4e3a ASCII\u3002 \u5b98\u7f51 unicode-slugify\uff1a\u4e00\u4e2a slug \u5de5\u5177\uff0c\u53ef\u4ee5\u751f\u6210 unicode slugs ,\u9700\u8981\u4f9d\u8d56 Django \u3002 \u5b98\u7f51 \u89e3\u6790\u5668 phonenumbers\uff1a\u89e3\u6790\uff0c\u683c\u5f0f\u5316\uff0c\u50a8\u5b58\uff0c\u9a8c\u8bc1\u7535\u8bdd\u53f7\u7801\u3002 \u5b98\u7f51 PLY\uff1alex \u548c yacc \u89e3\u6790\u5de5\u5177\u7684 Python \u5b9e\u73b0\u3002 \u5b98\u7f51 Pygments\uff1a\u901a\u7528\u8bed\u6cd5\u9ad8\u4eae\u5de5\u5177\u3002 \u5b98\u7f51 pyparsing\uff1a\u751f\u6210\u901a\u7528\u89e3\u6790\u5668\u7684\u6846\u67b6\u3002 \u5b98\u7f51 python-nameparser\uff1a\u628a\u4e00\u4e2a\u4eba\u540d\u5206\u89e3\u4e3a\u51e0\u4e2a\u72ec\u7acb\u7684\u90e8\u5206\u3002 \u5b98\u7f51 python-user-agents\uff1a\u6d4f\u89c8\u5668 user agent \u89e3\u6790\u5668\u3002 \u5b98\u7f51 sqlparse\uff1a\u4e00\u4e2a\u65e0\u9a8c\u8bc1\u7684 SQL \u89e3\u6790\u5668\u3002 \u5b98\u7f51", + "title": "\u6587\u672c\u5904\u7406" + }, + { + "location": "/#_13", + "text": "\u4e00\u4e9b\u7528\u6765\u89e3\u6790\u548c\u64cd\u4f5c\u7279\u6b8a\u6587\u672c\u683c\u5f0f\u7684\u5e93\u3002 \u901a\u7528 tablib\uff1a\u4e00\u4e2a\u7528\u6765\u5904\u7406\u4e2d\u8868\u683c\u6570\u636e\u7684\u6a21\u5757\u3002 \u5b98\u7f51 Office Marmir\uff1a\u628a\u8f93\u5165\u7684 Python \u6570\u636e\u7ed3\u6784\u8f6c\u6362\u4e3a\u7535\u5b50\u8868\u5355\u3002 \u5b98\u7f51 openpyxl\uff1a\u4e00\u4e2a\u7528\u6765\u8bfb\u5199 Excel 2010 xlsx/xlsm/xltx/xltm \u6587\u4ef6\u7684\u5e93\u3002 \u5b98\u7f51 pyexcel\uff1a\u4e00\u4e2a\u63d0\u4f9b\u7edf\u4e00 API\uff0c\u7528\u6765\u8bfb\u5199\uff0c\u64cd\u4f5c Excel \u6587\u4ef6\u7684\u5e93\u3002 \u5b98\u7f51 python-docx\uff1a\u8bfb\u53d6\uff0c\u67e5\u8be2\u4ee5\u53ca\u4fee\u6539 Microsoft Word 2007/2008 docx \u6587\u4ef6\u3002 \u5b98\u7f51 relatorio\uff1a\u6a21\u677f\u5316 OpenDocument \u6587\u4ef6\u3002 \u5b98\u7f51 unoconv\uff1a\u5728 LibreOffice/OpenOffice \u652f\u6301\u7684\u4efb\u610f\u6587\u4ef6\u683c\u5f0f\u4e4b\u95f4\u8fdb\u884c\u8f6c\u6362\u3002 \u5b98\u7f51 XlsxWriter\uff1a\u4e00\u4e2a\u7528\u4e8e\u521b\u5efa Excel .xlsx \u6587\u4ef6\u7684 Python \u6a21\u5757\u3002 \u5b98\u7f51 xlwings\uff1a\u4e00\u4e2a\u4f7f\u5f97\u5728 Excel \u4e2d\u65b9\u4fbf\u8c03\u7528 Python \u7684\u5e93\uff08\u53cd\u4e4b\u4ea6\u7136\uff09\uff0c\u57fa\u4e8e BSD \u534f\u8bae\u3002 \u5b98\u7f51 xlwt \uff1a\u8bfb\u5199 Excel \u6587\u4ef6\u7684\u6570\u636e\u548c\u683c\u5f0f\u4fe1\u606f\u3002 \u5b98\u7f51 / xlrd PDF PDFMiner\uff1a\u4e00\u4e2a\u7528\u4e8e\u4ece PDF \u6587\u6863\u4e2d\u62bd\u53d6\u4fe1\u606f\u7684\u5de5\u5177\u3002 \u5b98\u7f51 PyPDF2\uff1a\u4e00\u4e2a\u53ef\u4ee5\u5206\u5272\uff0c\u5408\u5e76\u548c\u8f6c\u6362 PDF \u9875\u9762\u7684\u5e93\u3002 \u5b98\u7f51 ReportLab\uff1a\u5feb\u901f\u521b\u5efa\u5bcc\u6587\u672c PDF \u6587\u6863\u3002 \u5b98\u7f51 Markdown Mistune\uff1a\u5feb\u901f\u5e76\u4e14\u529f\u80fd\u9f50\u5168\u7684\u7eaf Python \u5b9e\u73b0\u7684 Markdown \u89e3\u6790\u5668\u3002 \u5b98\u7f51 Python-Markdown\uff1aJohn Gruber\u2019s Markdown \u7684 Python \u7248\u5b9e\u73b0\u3002 \u5b98\u7f51 Python-Markdown2\uff1a\u7eaf Python \u5b9e\u73b0\u7684 Markdown \u89e3\u6790\u5668\uff0c\u6bd4 Python-Markdown \u66f4\u5feb\uff0c\u66f4\u51c6\u786e\uff0c\u53ef\u6269\u5c55\u3002 \u5b98\u7f51 YAML PyYAML\uff1aPython \u7248\u672c\u7684 YAML \u89e3\u6790\u5668\u3002 \u5b98\u7f51 CSV csvkit\uff1a\u7528\u4e8e\u8f6c\u6362\u548c\u64cd\u4f5c CSV \u7684\u5de5\u5177\u3002 \u5b98\u7f51 Archive unp\uff1a\u4e00\u4e2a\u7528\u6765\u65b9\u4fbf\u89e3\u5305\u5f52\u6863\u6587\u4ef6\u7684\u547d\u4ee4\u884c\u5de5\u5177\u3002 \u5b98\u7f51", + "title": "\u7279\u6b8a\u6587\u672c\u683c\u5f0f\u5904\u7406" + }, + { + "location": "/#_14", + "text": "\u7528\u6765\u5904\u7406\u4eba\u7c7b\u8bed\u8a00\u7684\u5e93\u3002 NLTK \uff1a\u4e00\u4e2a\u5148\u8fdb\u7684\u5e73\u53f0\uff0c\u7528\u4ee5\u6784\u5efa\u5904\u7406\u4eba\u7c7b\u8bed\u8a00\u6570\u636e\u7684 Python \u7a0b\u5e8f\u3002 \u5b98\u7f51 jieba\uff1a\u4e2d\u6587\u5206\u8bcd\u5de5\u5177\u3002 \u5b98\u7f51 langid.py\uff1a\u72ec\u7acb\u7684\u8bed\u8a00\u8bc6\u522b\u7cfb\u7edf\u3002 \u5b98\u7f51 Pattern\uff1aPython \u7f51\u7edc\u4fe1\u606f\u6316\u6398\u6a21\u5757\u3002 \u5b98\u7f51 SnowNLP\uff1a\u4e00\u4e2a\u7528\u6765\u5904\u7406\u4e2d\u6587\u6587\u672c\u7684\u5e93\u3002 \u5b98\u7f51 TextBlob\uff1a\u4e3a\u8fdb\u884c\u666e\u901a\u81ea\u7136\u8bed\u8a00\u5904\u7406\u4efb\u52a1\u63d0\u4f9b\u4e00\u81f4\u7684 API\u3002 \u5b98\u7f51 TextGrocery\uff1a\u4e00\u7b80\u5355\u9ad8\u6548\u7684\u77ed\u6587\u672c\u5206\u7c7b\u5de5\u5177\uff0c\u57fa\u4e8e LibLinear \u548c Jieba\u3002 \u5b98\u7f51 thulac:\u6e05\u534e\u5927\u5b66\u81ea\u7136\u8bed\u8a00\u5904\u7406\u4e0e\u793e\u4f1a\u4eba\u6587\u8ba1\u7b97\u5b9e\u9a8c\u5ba4\u7814\u5236\u63a8\u51fa\u7684\u4e00\u5957\u4e2d\u6587\u8bcd\u6cd5\u5206\u6790\u5de5\u5177\u5305 \u5b98\u7f51", + "title": "\u81ea\u7136\u8bed\u8a00\u5904\u7406" + }, + { + "location": "/#_15", + "text": "\u7528\u4ee5\u751f\u6210\u9879\u76ee\u6587\u6863\u7684\u5e93\u3002 Sphinx \uff1aPython \u6587\u6863\u751f\u6210\u5668\u3002 \u5b98\u7f51 awesome-sphinxdoc\uff1a \u5b98\u7f51 MkDocs\uff1a\u5bf9 Markdown \u53cb\u597d\u7684\u6587\u6863\u751f\u6210\u5668\u3002 \u5b98\u7f51 pdoc\uff1a\u4e00\u4e2a\u53ef\u4ee5\u66ff\u6362 Epydoc \u7684\u5e93\uff0c\u53ef\u4ee5\u81ea\u52a8\u751f\u6210 Python \u5e93\u7684 API \u6587\u6863\u3002 \u5b98\u7f51 Pycco\uff1a\u6587\u5b66\u7f16\u7a0b\uff08literate-programming\uff09\u98ce\u683c\u7684\u6587\u6863\u751f\u6210\u5668\u3002 \u5b98\u7f51 readthedocs\uff1a\u4e00\u4e2a\u57fa\u4e8e Sphinx/MkDocs \u7684\u5728\u7ebf\u6587\u6863\u6258\u7ba1\u7cfb\u7edf\uff0c\u5bf9\u5f00\u6e90\u9879\u76ee\u514d\u8d39\u5f00\u653e\u4f7f\u7528\u3002 \u5b98\u7f51", + "title": "\u6587\u6863" + }, + { + "location": "/#_16", + "text": "\u7528\u6765\u4fdd\u5b58\u548c\u89e3\u6790\u914d\u7f6e\u7684\u5e93\u3002 config\uff1a logging \u6a21\u5757\u4f5c\u8005\u5199\u7684\u5206\u7ea7\u914d\u7f6e\u6a21\u5757\u3002 \u5b98\u7f51 ConfigObj\uff1aINI \u6587\u4ef6\u89e3\u6790\u5668\uff0c\u5e26\u9a8c\u8bc1\u529f\u80fd\u3002 \u5b98\u7f51 ConfigParser\uff1a(Python \u6807\u51c6\u5e93) INI \u6587\u4ef6\u89e3\u6790\u5668\u3002 \u5b98\u7f51 profig\uff1a\u901a\u8fc7\u591a\u79cd\u683c\u5f0f\u8fdb\u884c\u914d\u7f6e\uff0c\u5177\u6709\u6570\u503c\u8f6c\u6362\u529f\u80fd\u3002 \u5b98\u7f51 python-decouple\uff1a\u5c06\u8bbe\u7f6e\u548c\u4ee3\u7801\u5b8c\u5168\u9694\u79bb\u3002 \u5b98\u7f51", + "title": "\u914d\u7f6e" + }, + { + "location": "/#_17", + "text": "\u7528\u4e8e\u521b\u5efa\u547d\u4ee4\u884c\u7a0b\u5e8f\u7684\u5e93\u3002 \u547d\u4ee4\u884c\u7a0b\u5e8f\u5f00\u53d1 asciimatics\uff1a\u8de8\u5e73\u53f0\uff0c\u5168\u5c4f\u7ec8\u7aef\u5305\uff08\u5373\u9f20\u6807/\u952e\u76d8\u8f93\u5165\u548c\u5f69\u8272\uff0c\u5b9a\u4f4d\u6587\u672c\u8f93\u51fa\uff09\uff0c\u5b8c\u6574\u7684\u590d\u6742\u52a8\u753b\u548c\u7279\u6b8a\u6548\u679c\u7684\u9ad8\u7ea7 API\u3002 \u5b98\u7f51 cement\uff1aPython \u7684\u547d\u4ee4\u884c\u7a0b\u5e8f\u6846\u67b6\u3002 \u5b98\u7f51 click\uff1a\u4e00\u4e2a\u901a\u8fc7\u7ec4\u5408\u7684\u65b9\u5f0f\u6765\u521b\u5efa\u7cbe\u7f8e\u547d\u4ee4\u884c\u754c\u9762\u7684\u5305\u3002 \u5b98\u7f51 cliff\uff1a\u4e00\u4e2a\u7528\u4e8e\u521b\u5efa\u547d\u4ee4\u884c\u7a0b\u5e8f\u7684\u6846\u67b6\uff0c\u53ef\u4ee5\u521b\u5efa\u5177\u6709\u591a\u5c42\u547d\u4ee4\u7684\u547d\u4ee4\u884c\u7a0b\u5e8f\u3002 \u5b98\u7f51 clint\uff1aPython \u547d\u4ee4\u884c\u7a0b\u5e8f\u5de5\u5177\u3002 \u5b98\u7f51 colorama\uff1a\u8de8\u5e73\u53f0\u5f69\u8272\u7ec8\u7aef\u6587\u672c\u3002 \u5b98\u7f51 docopt\uff1aPython \u98ce\u683c\u7684\u547d\u4ee4\u884c\u53c2\u6570\u89e3\u6790\u5668\u3002 \u5b98\u7f51 Gooey\uff1a\u4e00\u6761\u547d\u4ee4\uff0c\u5c06\u547d\u4ee4\u884c\u7a0b\u5e8f\u53d8\u6210\u4e00\u4e2a GUI \u7a0b\u5e8f\u3002 \u5b98\u7f51 python-prompt-toolkit\uff1a\u4e00\u4e2a\u7528\u4e8e\u6784\u5efa\u5f3a\u5927\u7684\u4ea4\u4e92\u5f0f\u547d\u4ee4\u884c\u7a0b\u5e8f\u7684\u5e93\u3002 \u5b98\u7f51 python-fire\uff1aGoogle \u51fa\u54c1\u7684\u4e00\u4e2a\u57fa\u4e8e Python \u7c7b\u7684\u6784\u5efa\u547d\u4ee4\u884c\u754c\u9762\u7684\u5e93\u3002 \u5b98\u7f51 Pythonpy \uff1a\u5728\u547d\u4ee4\u884c\u4e2d\u76f4\u63a5\u6267\u884c\u4efb\u4f55 Python \u6307\u4ee4\u3002 \u5b98\u7f51 \u751f\u4ea7\u529b\u5de5\u5177 aws-cli\uff1aAmazon Web Services \u7684\u901a\u7528\u547d\u4ee4\u884c\u754c\u9762\u3002 \u5b98\u7f51 bashplotlib\uff1a\u5728\u7ec8\u7aef\u4e2d\u8fdb\u884c\u57fa\u672c\u7ed8\u56fe\u3002 \u5b98\u7f51 caniusepython3\uff1a\u5224\u65ad\u662f\u54ea\u4e2a\u9879\u76ee\u59a8\u788d\u4f60\u4f60\u79fb\u690d\u5230 Python3\u3002 \u5b98\u7f51 cookiecutter\uff1a\u4ece cookiecutters\uff08\u9879\u76ee\u6a21\u677f\uff09\u521b\u5efa\u9879\u76ee\u7684\u4e00\u4e2a\u547d\u4ee4\u884c\u5de5\u5177\u3002 \u5b98\u7f51 doitlive\uff1a\u4e00\u4e2a\u7528\u6765\u5728\u7ec8\u7aef\u4e2d\u8fdb\u884c\u73b0\u573a\u6f14\u793a\u7684\u5de5\u5177\u3002 \u5b98\u7f51 pyftpdlib\uff1a\u4e00\u4e2a\u901f\u5ea6\u6781\u5feb\u548c\u53ef\u6269\u5c55\u7684 Python FTP \u670d\u52a1\u5e93\u3002 \u5b98\u7f51 howdoi\uff1a\u901a\u8fc7\u547d\u4ee4\u884c\u83b7\u53d6\u5373\u65f6\u7684\u7f16\u7a0b\u95ee\u9898\u89e3\u7b54\u3002 \u5b98\u7f51 httpie\uff1a\u4e00\u4e2a\u547d\u4ee4\u884c HTTP \u5ba2\u6237\u7aef\uff0ccURL \u7684\u66ff\u4ee3\u54c1\uff0c\u6613\u7528\u6027\u66f4\u597d\u3002 \u5b98\u7f51 PathPicker\uff1a\u4ece bash \u8f93\u51fa\u4e2d\u9009\u51fa\u6587\u4ef6\u3002 \u5b98\u7f51 percol\uff1a\u5411 UNIX shell \u4f20\u7edf\u7ba1\u9053\u6982\u5ff5\u4e2d\u52a0\u5165\u4ea4\u4e92\u5f0f\u9009\u62e9\u529f\u80fd\u3002 \u5b98\u7f51 SAWS\uff1a\u4e00\u4e2a\u52a0\u5f3a\u7248\u7684 AWS \u547d\u4ee4\u884c\u3002 \u5b98\u7f51 thefuck\uff1a\u4fee\u6b63\u4f60\u4e4b\u524d\u7684\u547d\u4ee4\u884c\u6307\u4ee4\u3002 \u5b98\u7f51 mycli\uff1a\u4e00\u4e2a MySQL \u547d\u4ee4\u884c\u5ba2\u6237\u7aef\uff0c\u5177\u6709\u81ea\u52a8\u8865\u5168\u548c\u8bed\u6cd5\u9ad8\u4eae\u529f\u80fd\u3002 \u5b98\u7f51 pgcli\uff1aPostgres \u547d\u4ee4\u884c\u5de5\u5177\uff0c\u5177\u6709\u81ea\u52a8\u8865\u5168\u548c\u8bed\u6cd5\u9ad8\u4eae\u529f\u80fd\u3002 \u5b98\u7f51 try\uff1a\u4e00\u4e2a\u4ece\u6765\u6ca1\u6709\u66f4\u7b80\u5355\u7684\u547d\u4ee4\u884c\u5de5\u5177\uff0c\u7528\u6765\u8bd5\u7528 python \u5e93\u3002 \u5b98\u7f51", + "title": "\u547d\u4ee4\u884c\u5de5\u5177" + }, + { + "location": "/#_18", + "text": "\u7528\u6765\u8fdb\u884c\u4e0b\u8f7d\u7684\u5e93. s3cmd\uff1a\u4e00\u4e2a\u7528\u6765\u7ba1\u7406 Amazon S3 \u548c CloudFront \u7684\u547d\u4ee4\u884c\u5de5\u5177\u3002 \u5b98\u7f51 s4cmd\uff1a\u8d85\u7ea7 S3 \u547d\u4ee4\u884c\u5de5\u5177\uff0c\u6027\u80fd\u66f4\u52a0\u5f3a\u52b2\u3002 \u5b98\u7f51 you-get\uff1a\u4e00\u4e2a YouTube/Youku/Niconico \u89c6\u9891\u4e0b\u8f7d\u5668\uff0c\u4f7f\u7528 Python3 \u7f16\u5199\u3002 \u5b98\u7f51 youtube-dl\uff1a\u4e00\u4e2a\u5c0f\u5de7\u7684\u547d\u4ee4\u884c\u7a0b\u5e8f\uff0c\u7528\u6765\u4e0b\u8f7d YouTube \u89c6\u9891\u3002 \u5b98\u7f51", + "title": "\u4e0b\u8f7d\u5668" + }, + { + "location": "/#_19", + "text": "\u7528\u6765\u64cd\u4f5c\u56fe\u50cf\u7684\u5e93. pillow \uff1aPillow \u662f\u4e00\u4e2a\u66f4\u52a0\u6613\u7528\u7248\u7684 PIL \u3002 \u5b98\u7f51 hmap\uff1a\u56fe\u50cf\u76f4\u65b9\u56fe\u6620\u5c04\u3002 \u5b98\u7f51 imgSeek\uff1a\u4e00\u4e2a\u4f7f\u7528\u89c6\u89c9\u76f8\u4f3c\u6027\u641c\u7d22\u4e00\u7ec4\u56fe\u7247\u96c6\u5408\u7684\u9879\u76ee\u3002 \u5b98\u7f51 nude.py\uff1a\u88f8\u4f53\u68c0\u6d4b\u3002 \u5b98\u7f51 pyBarcode\uff1a\u4e0d\u501f\u52a9 PIL \u5e93\u5728 Python \u7a0b\u5e8f\u4e2d\u751f\u6210\u6761\u5f62\u7801\u3002 \u5b98\u7f51 pygram\uff1a\u7c7b\u4f3c Instagram \u7684\u56fe\u50cf\u6ee4\u955c\u3002 \u5b98\u7f51 python-qrcode\uff1a\u4e00\u4e2a\u7eaf Python \u5b9e\u73b0\u7684\u4e8c\u7ef4\u7801\u751f\u6210\u5668\u3002 \u5b98\u7f51 Quads\uff1a\u57fa\u4e8e\u56db\u53c9\u6811\u7684\u8ba1\u7b97\u673a\u827a\u672f\u3002 \u5b98\u7f51 scikit-image\uff1a\u4e00\u4e2a\u7528\u4e8e\uff08\u79d1\u5b66\uff09\u56fe\u50cf\u5904\u7406\u7684 Python \u5e93\u3002 \u5b98\u7f51 thumbor\uff1a\u4e00\u4e2a\u5c0f\u578b\u56fe\u50cf\u670d\u52a1\uff0c\u5177\u6709\u526a\u88c1\uff0c\u5c3a\u5bf8\u91cd\u8bbe\u548c\u7ffb\u8f6c\u529f\u80fd\u3002 \u5b98\u7f51 wand\uff1a MagickWand \u7684 Python \u7ed1\u5b9a\u3002MagickWand \u662f ImageMagick \u7684 C API \u3002 \u5b98\u7f51 face_recognition\uff1a\u7b80\u5355\u6613\u7528\u7684 python \u4eba\u8138\u8bc6\u522b\u5e93\u3002 \u5b98\u7f51", + "title": "\u56fe\u50cf\u5904\u7406" + }, + { + "location": "/#ocr", + "text": "\u5149\u5b66\u5b57\u7b26\u8bc6\u522b\u5e93\u3002 pyocr\uff1aTesseract \u548c Cuneiform \u7684\u4e00\u4e2a\u5c01\u88c5(wrapper)\u3002 \u5b98\u7f51 pytesseract \uff1a Google Tesseract OCR \u7684\u53e6\u4e00\u4e2a\u5c01\u88c5(wrapper)\u3002 \u5b98\u7f51 python-tesseract\uff1a Google Tesseract OCR \u00a0\u7684\u4e00\u4e2a\u5305\u88c5\u7c7b\u3002", + "title": "OCR" + }, + { + "location": "/#_20", + "text": "\u7528\u6765\u64cd\u4f5c\u97f3\u9891\u7684\u5e93 audiolazy\uff1aPython \u7684\u6570\u5b57\u4fe1\u53f7\u5904\u7406\u5305\u3002 \u5b98\u7f51 audioread\uff1a\u4ea4\u53c9\u5e93 (GStreamer + Core Audio + MAD + FFmpeg) \u97f3\u9891\u89e3\u7801\u3002 \u5b98\u7f51 beets\uff1a\u4e00\u4e2a\u97f3\u4e50\u5e93\u7ba1\u7406\u5de5\u5177\u53ca MusicBrainz \u6807\u7b7e\u6dfb\u52a0\u5de5\u5177\u3002 \u5b98\u7f51 dejavu\uff1a\u97f3\u9891\u6307\u7eb9\u63d0\u53d6\u548c\u8bc6\u522b\u3002 \u5b98\u7f51 django-elastic-transcoder \uff1aDjango + Amazon Elastic Transcoder \u3002 \u5b98\u7f51 eyeD3\uff1a\u4e00\u4e2a\u7528\u6765\u64cd\u4f5c\u97f3\u9891\u6587\u4ef6\u7684\u5de5\u5177\uff0c\u5177\u4f53\u6765\u8bb2\u5c31\u662f\u5305\u542b ID3 \u5143\u4fe1\u606f\u7684 MP3 \u6587\u4ef6\u3002 \u5b98\u7f51 id3reader\uff1a\u4e00\u4e2a\u7528\u6765\u8bfb\u53d6 MP3 \u5143\u6570\u636e\u7684 Python \u6a21\u5757\u3002 \u5b98\u7f51 m3u8\uff1a\u4e00\u4e2a\u7528\u6765\u89e3\u6790 m3u8 \u6587\u4ef6\u7684\u6a21\u5757\u3002 \u5b98\u7f51 mutagen\uff1a\u4e00\u4e2a\u7528\u6765\u5904\u7406\u97f3\u9891\u5143\u6570\u636e\u7684 Python \u6a21\u5757\u3002 \u5b98\u7f51 pydub\uff1a\u901a\u8fc7\u7b80\u5355\u3001\u7b80\u6d01\u7684\u9ad8\u5c42\u63a5\u53e3\u6765\u64cd\u4f5c\u97f3\u9891\u6587\u4ef6\u3002 \u5b98\u7f51 pyechonest\uff1a Echo Nest API \u7684 Python \u5ba2\u6237\u7aef\u3002 \u5b98\u7f51 talkbox\uff1a\u4e00\u4e2a\u7528\u6765\u5904\u7406\u6f14\u8bb2/\u4fe1\u53f7\u7684 Python \u5e93\u3002 \u5b98\u7f51 TimeSide\uff1a\u5f00\u6e90 web \u97f3\u9891\u5904\u7406\u6846\u67b6\u3002 \u5b98\u7f51 tinytag\uff1a\u4e00\u4e2a\u7528\u6765\u8bfb\u53d6 MP3, OGG, FLAC \u4ee5\u53ca Wave \u6587\u4ef6\u97f3\u4e50\u5143\u6570\u636e\u7684\u5e93\u3002 \u5b98\u7f51 mingus\uff1a\u4e00\u4e2a\u9ad8\u7ea7\u97f3\u4e50\u7406\u8bba\u548c\u66f2\u8c31\u5305\uff0c\u652f\u6301 MIDI \u6587\u4ef6\u548c\u56de\u653e\u529f\u80fd\u3002 \u5b98\u7f51", + "title": "\u97f3\u9891" + }, + { + "location": "/#video", + "text": "\u7528\u6765\u64cd\u4f5c\u89c6\u9891\u548c GIF \u7684\u5e93\u3002 moviepy\uff1a\u4e00\u4e2a\u7528\u6765\u8fdb\u884c\u57fa\u4e8e\u811a\u672c\u7684\u89c6\u9891\u7f16\u8f91\u6a21\u5757\uff0c\u9002\u7528\u4e8e\u591a\u79cd\u683c\u5f0f\uff0c\u5305\u62ec\u52a8\u56fe GIFs\u3002 \u5b98\u7f51 scikit-video\uff1aSciPy \u89c6\u9891\u5904\u7406\u5e38\u7528\u7a0b\u5e8f\u3002 \u5b98\u7f51", + "title": "Video" + }, + { + "location": "/#_21", + "text": "\u5730\u7406\u7f16\u7801\u5730\u5740\u4ee5\u53ca\u7528\u6765\u5904\u7406\u7ecf\u7eac\u5ea6\u7684\u5e93\u3002 GeoDjango\uff1a\u4e16\u754c\u7ea7\u5730\u7406\u56fe\u5f62 web \u6846\u67b6\u3002 \u5b98\u7f51 GeoIP\uff1aMaxMind GeoIP Legacy \u6570\u636e\u5e93\u7684 Python API\u3002 \u5b98\u7f51 geojson\uff1aGeoJSON \u7684 Python \u7ed1\u5b9a\u53ca\u5de5\u5177\u3002 \u5b98\u7f51 geopy\uff1aPython \u5730\u5740\u7f16\u7801\u5de5\u5177\u7bb1\u3002 \u5b98\u7f51 pygeoip\uff1a\u7eaf Python GeoIP API\u3002 \u5b98\u7f51 django-countries\uff1a\u4e00\u4e2a Django \u5e94\u7528\u7a0b\u5e8f\uff0c\u63d0\u4f9b\u7528\u4e8e\u8868\u683c\u7684\u56fd\u5bb6\u9009\u62e9\u529f\u80fd\uff0c\u56fd\u65d7\u56fe\u6807\u9759\u6001\u6587\u4ef6\u4ee5\u53ca\u6a21\u578b\u4e2d\u7684\u56fd\u5bb6\u5b57\u6bb5\u3002 \u5b98\u7f51", + "title": "\u5730\u7406\u4f4d\u7f6e" + }, + { + "location": "/#http", + "text": "\u4f7f\u7528 HTTP \u7684\u5e93\u3002 aiohttp\uff1a\u57fa\u4e8e asyncio \u7684\u5f02\u6b65 HTTP \u7f51\u7edc\u5e93\u3002 \u5b98\u7f51 requests\uff1a\u4eba\u6027\u5316\u7684 HTTP \u8bf7\u6c42\u5e93\u3002 \u5b98\u7f51 grequests\uff1arequests \u5e93 + gevent \uff0c\u7528\u4e8e\u5f02\u6b65 HTTP \u8bf7\u6c42. \u5b98\u7f51 httplib2\uff1a\u5168\u9762\u7684 HTTP \u5ba2\u6237\u7aef\u5e93\u3002 \u5b98\u7f51 treq\uff1a\u7c7b\u4f3c requests \u7684 Python API \u6784\u5efa\u4e8e Twisted HTTP \u5ba2\u6237\u7aef\u4e4b\u4e0a\u3002 \u5b98\u7f51 urllib3\uff1a\u4e00\u4e2a\u5177\u6709\u7ebf\u7a0b\u5b89\u5168\u8fde\u63a5\u6c60\uff0c\u652f\u6301\u6587\u4ef6 post\uff0c\u6e05\u6670\u53cb\u597d\u7684 HTTP \u5e93\u3002 \u5b98\u7f51", + "title": "HTTP" + }, + { + "location": "/#_22", + "text": "Python \u5b9e\u73b0\u7684\u6570\u636e\u5e93\u3002 pickleDB\uff1a\u4e00\u4e2a\u7b80\u5355\uff0c\u8f7b\u91cf\u7ea7\u952e\u503c\u50a8\u5b58\u6570\u636e\u5e93\u3002 \u5b98\u7f51 PipelineDB\uff1a\u6d41\u5f0f SQL \u6570\u636e\u5e93\u3002 \u5b98\u7f51 TinyDB\uff1a\u4e00\u4e2a\u5fae\u578b\u7684\uff0c\u9762\u5411\u6587\u6863\u578b\u6570\u636e\u5e93\u3002 \u5b98\u7f51 ZODB\uff1a\u4e00\u4e2a Python \u539f\u751f\u5bf9\u8c61\u6570\u636e\u5e93\u3002\u4e00\u4e2a\u952e\u503c\u548c\u5bf9\u8c61\u56fe\u6570\u636e\u5e93\u3002 \u5b98\u7f51", + "title": "\u6570\u636e\u5e93" + }, + { + "location": "/#_23", + "text": "\u7528\u6765\u8fde\u63a5\u548c\u64cd\u4f5c\u6570\u636e\u5e93\u7684\u5e93\u3002 MySQL\uff1a awesome-mysql \u7cfb\u5217 aiomysql\uff1a\u57fa\u4e8e asyncio \u7684\u5f02\u6b65 MySQL \u6570\u636e\u5e93\u64cd\u4f5c\u5e93\u3002 \u5b98\u7f51 mysql-python\uff1aPython \u7684 MySQL \u6570\u636e\u5e93\u8fde\u63a5\u5668\u3002 \u5b98\u7f51 ysqlclient\uff1a mysql-python \u5206\u652f\uff0c\u652f\u6301 Python 3\u3002 oursql\uff1a\u4e00\u4e2a\u66f4\u597d\u7684 MySQL \u8fde\u63a5\u5668\uff0c\u652f\u6301\u539f\u751f\u9884\u7f16\u8bd1\u6307\u4ee4\u548c BLOBs\u3002 \u5b98\u7f51 PyMySQL\uff1a\u7eaf Python MySQL \u9a71\u52a8\uff0c\u517c\u5bb9 mysql-python\u3002 \u5b98\u7f51 PostgreSQL psycopg2\uff1aPython \u4e2d\u6700\u6d41\u884c\u7684 PostgreSQL \u9002\u914d\u5668\u3002 \u5b98\u7f51 queries\uff1apsycopg2 \u5e93\u7684\u5c01\u88c5\uff0c\u7528\u6765\u548c PostgreSQL \u8fdb\u884c\u4ea4\u4e92\u3002 \u5b98\u7f51 txpostgres\uff1a\u57fa\u4e8e Twisted \u7684\u5f02\u6b65 PostgreSQL \u9a71\u52a8\u3002 \u5b98\u7f51 \u5176\u4ed6\u5173\u7cfb\u578b\u6570\u636e\u5e93 apsw\uff1a\u53e6\u4e00\u4e2a Python SQLite \u5c01\u88c5\u3002 \u5b98\u7f51 dataset\uff1a\u5728\u6570\u636e\u5e93\u4e2d\u5b58\u50a8 Python \u5b57\u5178 pymssql\uff1a\u4e00\u4e2a\u7b80\u5355\u7684 Microsoft SQL Server \u6570\u636e\u5e93\u63a5\u53e3\u3002 \u5b98\u7f51 NoSQL \u6570\u636e\u5e93 cassandra-python-driver\uff1aCassandra \u7684 Python \u9a71\u52a8\u3002 \u5b98\u7f51 HappyBase\uff1a\u4e00\u4e2a\u4e3a Apache HBase \u8bbe\u8ba1\u7684\uff0c\u5bf9\u5f00\u53d1\u8005\u53cb\u597d\u7684\u5e93\u3002 \u5b98\u7f51 Plyvel\uff1a\u4e00\u4e2a\u5feb\u901f\u4e14\u529f\u80fd\u4e30\u5bcc\u7684 LevelDB \u7684 Python \u63a5\u53e3\u3002 \u5b98\u7f51 py2neo\uff1aNeo4j restful \u63a5\u53e3\u7684 Python \u5c01\u88c5\u5ba2\u6237\u7aef\u3002 \u5b98\u7f51 pycassa\uff1aCassandra \u7684 Python Thrift \u9a71\u52a8\u3002 \u5b98\u7f51 PyMongo\uff1aMongoDB \u7684\u5b98\u65b9 Python \u5ba2\u6237\u7aef\u3002 \u5b98\u7f51 redis-py\uff1aRedis \u7684 Python \u5ba2\u6237\u7aef\u3002 \u5b98\u7f51 telephus\uff1a\u57fa\u4e8e Twisted \u7684 Cassandra \u5ba2\u6237\u7aef\u3002 \u5b98\u7f51 txRedis\uff1a\u57fa\u4e8e Twisted \u7684 Redis \u5ba2\u6237\u7aef\u3002 \u5b98\u7f51", + "title": "\u6570\u636e\u5e93\u9a71\u52a8" + }, + { + "location": "/#orm", + "text": "\u5b9e\u73b0\u5bf9\u8c61\u5173\u7cfb\u6620\u5c04\u6216\u6570\u636e\u6620\u5c04\u6280\u672f\u7684\u5e93\u3002 \u5173\u7cfb\u578b\u6570\u636e\u5e93 Django Models\uff1aDjango \u7684\u4e00\u90e8\u5206\u3002 \u5b98\u7f51 SQLAlchemy\uff1aPython SQL \u5de5\u5177\u4ee5\u53ca\u5bf9\u8c61\u5173\u7cfb\u6620\u5c04\u5de5\u5177\u3002 \u5b98\u7f51 awesome-sqlalchemy \u7cfb\u5217 Peewee \uff1a\u4e00\u4e2a\u5c0f\u5de7\uff0c\u5bcc\u6709\u8868\u8fbe\u529b\u7684 ORM\u3002 \u5b98\u7f51 PonyORM\uff1a\u63d0\u4f9b\u9762\u5411\u751f\u6210\u5668\u7684 SQL \u63a5\u53e3\u7684 ORM\u3002 \u5b98\u7f51 python-sql\uff1a\u7f16\u5199 Python \u98ce\u683c\u7684 SQL \u67e5\u8be2\u3002 \u5b98\u7f51 NoSQL \u6570\u636e\u5e93 django-mongodb-engine\uff1aDjango MongoDB \u540e\u7aef\u3002 \u5b98\u7f51 PynamoDB\uff1a Amazon DynamoDB \u7684\u4e00\u4e2a Python \u98ce\u683c\u63a5\u53e3\u3002 \u5b98\u7f51 flywheel\uff1aAmazon DynamoDB \u7684\u5bf9\u8c61\u6620\u5c04\u5de5\u5177\u3002 \u5b98\u7f51 MongoEngine\uff1a\u4e00\u4e2a Python \u5bf9\u8c61\u6587\u6863\u6620\u5c04\u5de5\u5177\uff0c\u7528\u4e8e MongoDB\u3002 \u5b98\u7f51 hot-redis\uff1a\u4e3a Redis \u63d0\u4f9b Python \u4e30\u5bcc\u7684\u6570\u636e\u7c7b\u578b\u3002 \u5b98\u7f51 redisco\uff1a\u4e00\u4e2a Python \u5e93\uff0c\u63d0\u4f9b\u53ef\u4ee5\u6301\u7eed\u5b58\u5728\u5728 Redis \u4e2d\u7684\u7b80\u5355\u6a21\u578b\u548c\u5bb9\u5668\u3002 \u5b98\u7f51 \u5176\u4ed6 butterdb\uff1aGoogle Drive \u7535\u5b50\u8868\u683c\u7684 Python ORM\u3002 \u5b98\u7f51", + "title": "ORM" + }, + { + "location": "/#web", + "text": "\u5168\u6808 Web \u6846\u67b6\u3002 Django \uff1aPython \u754c\u6700\u6d41\u884c\u7684 web \u6846\u67b6\u3002 \u5b98\u7f51 awesome-django \u7cfb\u5217 Flask \uff1a\u4e00\u4e2a Python \u5fae\u578b\u6846\u67b6\u3002 \u5b98\u7f51 awesome-flask \u7cfb\u5217 pyramid\uff1a\u4e00\u4e2a\u5c0f\u5de7\uff0c\u5feb\u901f\uff0c\u63a5\u5730\u6c14\u7684\u5f00\u6e90 Python web \u6846\u67b6\u3002 awesome-pyramid \u7cfb\u5217 Bottle \uff1a\u4e00\u4e2a\u5feb\u901f\u5c0f\u5de7\uff0c\u8f7b\u91cf\u7ea7\u7684 WSGI \u5fae\u578b web \u6846\u67b6\u3002 \u5b98\u7f51 CherryPy\uff1a\u4e00\u4e2a\u6781\u7b80\u7684 Python web \u6846\u67b6\uff0c\u670d\u4ece HTTP/1.1 \u534f\u8bae\u4e14\u5177\u6709 WSGI \u7ebf\u7a0b\u6c60\u3002 \u5b98\u7f51 TurboGears\uff1a\u4e00\u4e2a\u53ef\u4ee5\u6269\u5c55\u4e3a\u5168\u6808\u89e3\u51b3\u65b9\u6848\u7684\u5fae\u578b\u6846\u67b6\u3002 \u5b98\u7f51 web.py \uff1a\u4e00\u4e2a Python \u7684 web \u6846\u67b6\uff0c\u65e2\u7b80\u5355\uff0c\u53c8\u5f3a\u5927\u3002 \u5b98\u7f51 web2py\uff1a\u4e00\u4e2a\u5168\u6808 web \u6846\u67b6\u548c\u5e73\u53f0\uff0c\u4e13\u6ce8\u4e8e\u7b80\u5355\u6613\u7528\u3002 \u5b98\u7f51 Tornado \uff1a\u4e00\u4e2a web \u6846\u67b6\u548c\u5f02\u6b65\u7f51\u7edc\u5e93\u3002 \u5b98\u7f51 sanic\uff1a\u57fa\u4e8e Python3.5+ \u7684\u5f02\u6b65\u7f51\u7edc\u6846\u67b6\u3002 \u5b98\u7f51", + "title": "Web \u6846\u67b6" + }, + { + "location": "/#_24", + "text": "\u5141\u8bb8\u6216\u62d2\u7edd\u7528\u6237\u8bbf\u95ee\u6570\u636e\u6216\u529f\u80fd\u7684\u5e93\u3002 Carteblanche\uff1a\u7ad9\u5728\u7528\u6237\u548c\u8bbe\u8ba1\u8005\u89d2\u5ea6\u5f00\u53d1\u7684\u4e00\u4e2a\u4ee3\u7801\u5bf9\u9f50\u6a21\u5757\uff0c\u5f88\u597d\u5730\u5904\u7406\u4e86\u4ee3\u7801\u5bfc\u822a\u53ca\u6743\u9650\u3002 \u5b98\u7f51 django-guardian\uff1aDjango 1.2+ \u5b9e\u73b0\u4e86\u5355\u4e2a\u5bf9\u8c61\u6743\u9650\u3002 \u5b98\u7f51 django-rules\uff1a\u4e00\u4e2a\u5c0f\u5de7\u4f46\u662f\u5f3a\u5927\u7684\u5e94\u7528\uff0c\u63d0\u4f9b\u5bf9\u8c61\u7ea7\u522b\u7684\u6743\u9650\u7ba1\u7406\uff0c\u4e14\u4e0d\u9700\u8981\u4f7f\u7528\u6570\u636e\u5e93\u3002 \u5b98\u7f51", + "title": "\u6743\u9650" + }, + { + "location": "/#cms", + "text": "\u5185\u5bb9\u7ba1\u7406\u7cfb\u7edf odoo-cms: \u4e00\u4e2a\u5f00\u6e90\u7684\uff0c\u4f01\u4e1a\u7ea7 CMS\uff0c\u57fa\u4e8e odoo\u3002 \u5b98\u7f51 django-cms\uff1a\u4e00\u4e2a\u5f00\u6e90\u7684\uff0c\u4f01\u4e1a\u7ea7 CMS\uff0c\u57fa\u4e8e Django\u3002 \u5b98\u7f51 djedi-cms\uff1a\u4e00\u4e2a\u8f7b\u91cf\u7ea7\u4f46\u5374\u975e\u5e38\u5f3a\u5927\u7684 Django CMS \uff0c\u8003\u8651\u5230\u4e86\u63d2\u4ef6\uff0c\u5185\u8054\u7f16\u8f91\u4ee5\u53ca\u6027\u80fd\u3002 \u5b98\u7f51 FeinCMS\uff1a\u57fa\u4e8e Django \u6784\u5efa\u7684\u6700\u5148\u8fdb\u7684\u5185\u5bb9\u7ba1\u7406\u7cfb\u7edf\u4e4b\u4e00\u3002 \u5b98\u7f51 Kotti\uff1a\u4e00\u4e2a\u9ad8\u7ea7\u7684\uff0cPython \u8303\u7684 web \u5e94\u7528\u6846\u67b6\uff0c\u57fa\u4e8e Pyramid \u6784\u5efa\u3002 \u5b98\u7f51 Mezzanine\uff1a\u4e00\u4e2a\u5f3a\u5927\u7684\uff0c\u6301\u7eed\u7684\uff0c\u7075\u6d3b\u7684\u5185\u5bb9\u7ba1\u7406\u5e73\u53f0\u3002 \u5b98\u7f51 Opps\uff1a\u4e00\u4e2a\u4e3a\u6742\u5fd7\uff0c\u62a5\u7eb8\u7f51\u7ad9\u4ee5\u53ca\u5927\u6d41\u91cf\u95e8\u6237\u7f51\u7ad9\u8bbe\u8ba1\u7684 CMS \u5e73\u53f0\uff0c\u57fa\u4e8e Django\u3002 \u5b98\u7f51 Plone\uff1a\u4e00\u4e2a\u6784\u5efa\u4e8e\u5f00\u6e90\u5e94\u7528\u670d\u52a1\u5668 Zope \u4e4b\u4e0a\u7684 CMS\u3002 \u5b98\u7f51 Quokka\uff1a\u7075\u6d3b\uff0c\u53ef\u6269\u5c55\u7684\u5c0f\u578b CMS\uff0c\u57fa\u4e8e Flask \u548c MongoDB\u3002 \u5b98\u7f51 Wagtail \uff1a\u4e00\u4e2a Django \u5185\u5bb9\u7ba1\u7406\u7cfb\u7edf\u3002 \u5b98\u7f51 Widgy\uff1a\u6700\u65b0\u7684 CMS \u6846\u67b6\uff0c\u57fa\u4e8e Django\u3002 \u5b98\u7f51", + "title": "CMS" + }, + { + "location": "/#_25", + "text": "\u7528\u4e8e\u7535\u5b50\u5546\u52a1\u4ee5\u53ca\u652f\u4ed8\u7684\u6846\u67b6\u548c\u5e93\u3002 django-oscar\uff1a\u4e00\u4e2a\u7528\u4e8e Django \u7684\u5f00\u6e90\u7684\u7535\u5b50\u5546\u52a1\u6846\u67b6\u3002 \u5b98\u7f51 django-shop\uff1a\u4e00\u4e2a\u57fa\u4e8e Django \u7684\u5e97\u94fa\u7cfb\u7edf\u3002 \u5b98\u7f51 Cartridge\uff1a\u4e00\u4e2a\u57fa\u4e8e Mezzanine \u6784\u5efa\u7684\u8d2d\u7269\u8f66\u5e94\u7528\u3002 \u5b98\u7f51 shoop\uff1a\u4e00\u4e2a\u57fa\u4e8e Django \u7684\u5f00\u6e90\u7535\u5b50\u5546\u52a1\u5e73\u53f0\u3002 \u5b98\u7f51 alipay\uff1a\u975e\u5b98\u65b9\u7684 Python \u652f\u4ed8\u5b9d API\u3002 \u5b98\u7f51 merchant\uff1a\u4e00\u4e2a\u53ef\u4ee5\u63a5\u6536\u6765\u81ea\u591a\u79cd\u652f\u4ed8\u5e73\u53f0\u652f\u4ed8\u7684 Django \u5e94\u7528\u3002 \u5b98\u7f51 money\uff1a\u4e00\u4e2a\u8d27\u5e01\u7c7b\u5e93\u3002\u5e26\u6709\u53ef\u9009\u7684 CLDR \u540e\u7aef\u672c\u5730\u5316\u683c\u5f0f\uff0c\u63d0\u4f9b\u53ef\u6269\u5c55\u7684\u8d27\u5e01\u5151\u6362\u89e3\u51b3\u65b9\u6848\u3002 \u5b98\u7f51 python-currencies\uff1a\u663e\u793a\u8d27\u5e01\u683c\u5f0f\u4ee5\u53ca\u5b83\u7684\u6570\u503c\u3002 \u5b98\u7f51", + "title": "\u7535\u5b50\u5546\u52a1" + }, + { + "location": "/#restful-api", + "text": "\u7528\u6765\u5f00\u53d1 RESTful APIs \u7684\u5e93 Django django-rest-framework \uff1a\u4e00\u4e2a\u5f3a\u5927\u7075\u6d3b\u7684\u5de5\u5177\uff0c\u7528\u6765\u6784\u5efa web API\u3002 \u5b98\u7f51 django-tastypie\uff1a\u4e3a Django \u5e94\u7528\u5f00\u53d1 API\u3002 \u5b98\u7f51 django-formapi\uff1a\u4e3a Django \u7684\u8868\u5355\u9a8c\u8bc1\uff0c\u521b\u5efa JSON APIs \u3002 \u5b98\u7f51 Flask flask-api\uff1a\u4e3a flask \u5f00\u53d1\u7684\uff0c\u53ef\u6d4f\u89c8 Web APIs \u3002 \u5b98\u7f51 flask-restful\uff1a\u4e3a flask \u5feb\u901f\u521b\u5efa REST APIs \u3002 \u5b98\u7f51 flask-restless\uff1a\u4e3a SQLAlchemy \u5b9a\u4e49\u7684\u6570\u636e\u5e93\u6a21\u578b\u521b\u5efa RESTful APIs \u3002 \u5b98\u7f51 flask-api-utils\uff1a\u4e3a Flask \u5904\u7406 API \u8868\u793a\u548c\u9a8c\u8bc1\u3002 \u5b98\u7f51 eve\uff1aREST API \u6846\u67b6\uff0c\u7531 Flask, MongoDB \u7b49\u9a71\u52a8\u3002 \u5b98\u7f51 Pyramid cornice\uff1a\u4e00\u4e2a Pyramid \u7684 REST \u6846\u67b6 \u3002 \u5b98\u7f51 \u4e0e\u6846\u67b6\u65e0\u5173\u7684 falcon\uff1a\u4e00\u4e2a\u7528\u6765\u5efa\u7acb\u4e91 API \u548c web app \u540e\u7aef\u7684\u9ad8\u6027\u80fd\u6846\u67b6\u3002 \u5b98\u7f51 sandman\uff1a\u4e3a\u73b0\u5b58\u7684\u6570\u636e\u5e93\u9a71\u52a8\u7cfb\u7edf\u81ea\u52a8\u521b\u5efa REST APIs \u3002 \u5b98\u7f51 restless\uff1a\u6846\u67b6\u65e0\u5173\u7684 REST \u6846\u67b6 \uff0c\u57fa\u4e8e\u4ece Tastypie \u5b66\u5230\u7684\u77e5\u8bc6\u3002 \u5b98\u7f51 ripozo\uff1a\u5feb\u901f\u521b\u5efa REST/HATEOAS/Hypermedia APIs\u3002 \u5b98\u7f51", + "title": "RESTful API" + }, + { + "location": "/#_26", + "text": "\u5b9e\u73b0\u9a8c\u8bc1\u65b9\u6848\u7684\u5e93\u3002 OAuth Authomatic\uff1a\u7b80\u5355\u4f46\u662f\u5f3a\u5927\u7684\u6846\u67b6\uff0c\u8eab\u4efd\u9a8c\u8bc1/\u6388\u6743\u5ba2\u6237\u7aef\u3002 \u5b98\u7f51 django-allauth\uff1aDjango \u7684\u9a8c\u8bc1\u5e94\u7528\u3002 \u5b98\u7f51 django-oauth-toolkit\uff1a\u4e3a Django \u7528\u6237\u51c6\u5907\u7684 OAuth2\u3002 \u5b98\u7f51 django-oauth2-provider\uff1a\u4e3a Django \u5e94\u7528\u63d0\u4f9b OAuth2 \u63a5\u5165\u3002 \u5b98\u7f51 Flask-OAuthlib\uff1aOAuth 1.0/a, 2.0 \u5ba2\u6237\u7aef\u5b9e\u73b0\uff0c\u4f9b Flask \u4f7f\u7528\u3002 \u5b98\u7f51 OAuthLib\uff1a\u4e00\u4e2a OAuth \u8bf7\u6c42-\u7b7e\u540d\u903b\u8f91\u901a\u7528\u3001 \u5b8c\u6574\u7684\u5b9e\u73b0\u3002 \u5b98\u7f51 python-oauth2\uff1a\u4e00\u4e2a\u5b8c\u5168\u6d4b\u8bd5\u7684\u62bd\u8c61\u63a5\u53e3\u3002\u7528\u6765\u521b\u5efa OAuth \u5ba2\u6237\u7aef\u548c\u670d\u52a1\u7aef\u3002 \u5b98\u7f51 python-social-auth\uff1a\u4e00\u4e2a\u8bbe\u7f6e\u7b80\u5355\u7684\u793e\u4f1a\u5316\u9a8c\u8bc1\u65b9\u5f0f\u3002 \u5b98\u7f51 rauth\uff1aOAuth 1.0/a, 2.0, \u548c Ofly \u7684 Python \u5e93\u3002 \u5b98\u7f51 sanction\uff1a\u4e00\u4e2a\u8d85\u7ea7\u7b80\u5355\u7684 OAuth2 \u5ba2\u6237\u7aef\u5b9e\u73b0\u3002 \u5b98\u7f51 \u5176\u4ed6 jose\uff1aJavaScript \u5bf9\u8c61\u7b7e\u540d\u548c\u52a0\u5bc6\u8349\u6848\u7684\u5b9e\u73b0\u3002 \u5b98\u7f51 PyJWT\uff1aJSON Web \u4ee4\u724c\u8349\u6848 01\u3002 \u5b98\u7f51 python-jws\uff1aJSON Web \u7b7e\u540d\u8349\u6848 02 \u7684\u5b9e\u73b0\u3002 \u5b98\u7f51 python-jwt\uff1a\u4e00\u4e2a\u7528\u6765\u751f\u6210\u548c\u9a8c\u8bc1 JSON Web \u4ee4\u724c\u7684\u6a21\u5757\u3002 \u5b98\u7f51", + "title": "\u9a8c\u8bc1" + }, + { + "location": "/#_27", + "text": "\u6a21\u677f\u751f\u6210\u548c\u8bcd\u6cd5\u89e3\u6790\u7684\u5e93\u548c\u5de5\u5177\u3002 Jinja2 \uff1a\u4e00\u4e2a\u73b0\u4ee3\u7684\uff0c\u5bf9\u8bbe\u8ba1\u5e08\u53cb\u597d\u7684\u6a21\u677f\u5f15\u64ce\u3002 \u5b98\u7f51 Chameleon\uff1a\u4e00\u4e2a HTML/XML \u6a21\u677f\u5f15\u64ce\u3002 \u6a21\u4eff\u4e86 ZPT\uff08Zope Page Templates\uff09, \u8fdb\u884c\u4e86\u901f\u5ea6\u4e0a\u7684\u4f18\u5316\u3002 \u5b98\u7f51 Genshi\uff1aPython \u6a21\u677f\u5de5\u5177\uff0c\u7528\u4ee5\u751f\u6210 web \u611f\u77e5\u7684\u7ed3\u679c\u3002 \u5b98\u7f51 Mako\uff1aPython \u5e73\u53f0\u7684\u8d85\u9ad8\u901f\u8f7b\u91cf\u7ea7\u6a21\u677f\u3002 \u5b98\u7f51", + "title": "\u6a21\u677f\u5f15\u64ce" + }, + { + "location": "/#_28", + "text": "\u5904\u7406\u4e8b\u4ef6\u4ee5\u53ca\u4efb\u52a1\u961f\u5217\u7684\u5e93\u3002 celery\uff1a\u4e00\u4e2a\u5f02\u6b65\u4efb\u52a1\u961f\u5217/\u4f5c\u4e1a\u961f\u5217\uff0c\u57fa\u4e8e\u5206\u5e03\u5f0f\u6d88\u606f\u4f20\u9012\u3002 \u5b98\u7f51 huey\uff1a\u5c0f\u578b\u591a\u7ebf\u7a0b\u4efb\u52a1\u961f\u5217\u3002 \u5b98\u7f51 mrq \uff1aMr. Queue -\u4e00\u4e2a Python \u7684\u5206\u5e03\u5f0f worker \u4efb\u52a1\u961f\u5217\uff0c \u4f7f\u7528 Redis \u548c gevent\u3002 \u5b98\u7f51 rq\uff1a\u7b80\u5355\u7684 Python \u4f5c\u4e1a\u961f\u5217\u3002 \u5b98\u7f51 simpleq\uff1a\u4e00\u4e2a\u7b80\u5355\u7684\uff0c\u53ef\u65e0\u9650\u6269\u5f20\u7684\uff0c\u57fa\u4e8e\u4e9a\u9a6c\u900a SQS \u7684\u961f\u5217\u3002 \u5b98\u7f51", + "title": "\u961f\u5217" + }, + { + "location": "/#_29", + "text": "\u5bf9\u6570\u636e\u8fdb\u884c\u7d22\u5f15\u548c\u6267\u884c\u641c\u7d22\u67e5\u8be2\u7684\u5e93\u548c\u8f6f\u4ef6\u3002 django-haystack\uff1aDjango \u6a21\u5757\u5316\u641c\u7d22\u3002 \u5b98\u7f51 elasticsearch-py\uff1aElasticsearch \u7684\u5b98\u65b9\u5e95\u5c42 Python \u5ba2\u6237\u7aef\u3002 \u5b98\u7f51 elasticsearch-dsl-py\uff1aElasticsearch \u7684\u5b98\u65b9\u9ad8\u7ea7 Python \u5ba2\u6237\u7aef\u3002 \u5b98\u7f51 solrpy\uff1a solr \u7684 Python \u5ba2\u6237\u7aef\u3002 \u5b98\u7f51 Whoosh\uff1a\u4e00\u4e2a\u5feb\u901f\u7684\u7eaf Python \u641c\u7d22\u5f15\u64ce\u5e93\u3002 \u5b98\u7f51", + "title": "\u641c\u7d22" + }, + { + "location": "/#_30", + "text": "\u7528\u6765\u521b\u5efa\u7528\u6237\u6d3b\u52a8\u7684\u5e93\u3002 django-activity-stream\uff1a\u4ece\u4f60\u7684\u7ad9\u70b9\u884c\u4e3a\u4e2d\u751f\u6210\u901a\u7528\u6d3b\u52a8\u4fe1\u606f\u6d41\u3002 \u5b98\u7f51 Stream-Framework\uff1a\u4f7f\u7528 Cassandra \u548c Redis \u521b\u5efa\u52a8\u6001\u6d88\u606f\u548c\u901a\u77e5\u7cfb\u7edf\u3002 \u5b98\u7f51", + "title": "\u52a8\u6001\u6d88\u606f" + }, + { + "location": "/#_31", + "text": "\u7ba1\u7406\u3001\u538b\u7f29\u3001\u7f29\u5c0f\u7f51\u7ad9\u8d44\u6e90\u7684\u5de5\u5177\u3002 django-compressor\uff1a\u5c06\u94fe\u63a5\u548c\u5185\u8054\u7684 JavaScript \u6216 CSS \u538b\u7f29\u5230\u4e00\u4e2a\u5355\u72ec\u7684\u7f13\u5b58\u6587\u4ef6\u4e2d\u3002 \u5b98\u7f51 django-storages\uff1a\u4e00\u4e2a\u9488\u5bf9 Django \u7684\u81ea\u5b9a\u4e49\u5b58\u50a8\u540e\u7aef\u7684\u5de5\u5177\u96c6\u5408\u3002 \u5b98\u7f51 fanstatic\uff1a\u6253\u5305\u3001\u4f18\u5316\uff0c\u5e76\u4e14\u628a\u9759\u6001\u6587\u4ef6\u4f9d\u8d56\u4f5c\u4e3a Python \u7684\u5305\u6765\u63d0\u4f9b\u3002 \u5b98\u7f51 File Conveyor\uff1a\u4e00\u4e2a\u540e\u53f0\u9a7b\u7559\u7684\u7a0b\u5e8f\uff0c\u7528\u6765\u53d1\u73b0\u548c\u540c\u6b65\u6587\u4ef6\u5230 CDNs, S3 \u548c FTP\u3002 \u5b98\u7f51 Flask-Assets\uff1a\u5e2e\u4f60\u5c06 web \u8d44\u6e90\u6574\u5408\u5230\u4f60\u7684 Flask app \u4e2d\u3002 \u5b98\u7f51 jinja-assets-compressor\uff1a\u4e00\u4e2a Jinja \u6269\u5c55\uff0c\u7528\u6765\u7f16\u8bd1\u548c\u538b\u7f29\u4f60\u7684\u8d44\u6e90\u3002 \u5b98\u7f51 webassets\uff1a\u4e3a\u4f60\u7684\u9759\u6001\u8d44\u6e90\u6253\u5305\u3001\u4f18\u5316\u548c\u7ba1\u7406\u751f\u6210\u72ec\u4e00\u65e0\u4e8c\u7684\u7f13\u5b58 URL\u3002 \u5b98\u7f51", + "title": "\u8d44\u6e90\u7ba1\u7406" + }, + { + "location": "/#_32", + "text": "\u7f13\u5b58\u6570\u636e\u7684\u5e93\u3002 Beaker\uff1a\u4e00\u4e2a\u7f13\u5b58\u548c\u4f1a\u8bdd\u5e93\uff0c\u53ef\u4ee5\u7528\u5728 web \u5e94\u7528\u548c\u72ec\u7acb Python \u811a\u672c\u548c\u5e94\u7528\u4e0a\u3002 \u5b98\u7f51 django-cache-machine\uff1aDjango \u6a21\u578b\u7684\u81ea\u52a8\u7f13\u5b58\u548c\u5931\u6548\u3002 \u5b98\u7f51 django-cacheops\uff1a\u5177\u6709\u81ea\u52a8\u9897\u7c92\u5316\u4e8b\u4ef6\u9a71\u52a8\u5931\u6548\u529f\u80fd\u7684 ORM\u3002 \u5b98\u7f51 django-viewlet\uff1a\u6e32\u67d3\u6a21\u677f\uff0c\u540c\u65f6\u5177\u6709\u989d\u5916\u7684\u7f13\u5b58\u63a7\u5236\u529f\u80fd\u3002 \u5b98\u7f51 dogpile.cache\uff1adogpile.cache \u662f Beaker \u7684\u4e0b\u4e00\u4ee3\u66ff\u4ee3\u54c1\uff0c\u7531\u540c\u4e00\u4f5c\u8005\u5f00\u53d1\u3002 \u5b98\u7f51 HermesCache\uff1aPython \u7f13\u5b58\u5e93\uff0c\u5177\u6709\u57fa\u4e8e\u6807\u7b7e\u7684\u5931\u6548\u548c dogpile effect \u4fdd\u62a4\u529f\u80fd\u3002 \u5b98\u7f51 johnny-cache\uff1adjango \u5e94\u7528\u7f13\u5b58\u6846\u67b6\u3002 \u5b98\u7f51 pylibmc\uff1a libmemcached \u63a5\u53e3\u7684 Python \u5c01\u88c5\u3002 \u5b98\u7f51", + "title": "\u7f13\u5b58" + }, + { + "location": "/#_33", + "text": "\u7528\u6765\u53d1\u9001\u548c\u89e3\u6790\u7535\u5b50\u90ae\u4ef6\u7684\u5e93\u3002 django-celery-ses\uff1a\u5e26\u6709 AWS SES \u548c Celery \u7684 Django email \u540e\u7aef\u3002 \u5b98\u7f51 envelopes\uff1a\u4f9b\u4eba\u7c7b\u4f7f\u7528\u7684\u7535\u5b50\u90ae\u4ef6\u5e93\u3002 \u5b98\u7f51 flanker\uff1a\u4e00\u4e2a email \u5730\u5740\u548c Mime \u89e3\u6790\u5e93\u3002 \u5b98\u7f51 imbox\uff1aPython IMAP \u5e93\u3002 \u5b98\u7f51 inbox.py\uff1aPython SMTP \u670d\u52a1\u5668\u3002 \u5b98\u7f51 inbox\uff1a\u4e00\u4e2a\u5f00\u6e90\u7535\u5b50\u90ae\u4ef6\u5de5\u5177\u7bb1\u3002 \u5b98\u7f51 lamson\uff1aPython \u98ce\u683c\u7684 SMTP \u5e94\u7528\u670d\u52a1\u5668\u3002 \u5b98\u7f51 mailjet\uff1aMailjet API \u5b9e\u73b0\uff0c\u7528\u6765\u63d0\u4f9b\u6279\u91cf\u53d1\u9001\u90ae\u4ef6\uff0c\u7edf\u8ba1\u7b49\u529f\u80fd\u3002 \u5b98\u7f51 marrow.mailer\uff1a\u9ad8\u6027\u80fd\u53ef\u6269\u5c55\u90ae\u4ef6\u5206\u53d1\u6846\u67b6\u3002 \u5b98\u7f51 modoboa\uff1a\u4e00\u4e2a\u90ae\u4ef6\u6258\u7ba1\u548c\u7ba1\u7406\u5e73\u53f0\uff0c\u5177\u6709\u73b0\u4ee3\u7684\u3001\u7b80\u7ea6\u7684 Web UI\u3002 \u5b98\u7f51 pyzmail\uff1a\u521b\u5efa\uff0c\u53d1\u9001\u548c\u89e3\u6790\u7535\u5b50\u90ae\u4ef6\u3002 \u5b98\u7f51 Talon\uff1aMailgun \u5e93\uff0c\u7528\u6765\u62bd\u53d6\u4fe1\u606f\u548c\u7b7e\u540d\u3002 \u5b98\u7f51", + "title": "\u7535\u5b50\u90ae\u4ef6" + }, + { + "location": "/#_34", + "text": "\u7528\u6765\u8fdb\u884c\u56fd\u9645\u5316\u7684\u5e93\u3002 Babel\uff1a\u4e00\u4e2a Python \u7684\u56fd\u9645\u5316\u5e93\u3002 \u5b98\u7f51 Korean\uff1a\u4e00\u4e2a\u97e9\u8bed\u8bcd\u6001\u5e93\u3002 \u5b98\u7f51", + "title": "\u56fd\u9645\u5316" + }, + { + "location": "/#url", + "text": "\u89e3\u6790 URLs \u7684\u5e93 furl\uff1a\u4e00\u4e2a\u8ba9\u5904\u7406 URL \u66f4\u7b80\u5355\u5c0f\u578b Python \u5e93\u3002 \u5b98\u7f51 purl\uff1a\u4e00\u4e2a\u7b80\u5355\u7684\uff0c\u4e0d\u53ef\u53d8\u7684 URL \u7c7b\uff0c\u5177\u6709\u7b80\u6d01\u7684 API \u6765\u8fdb\u884c\u8be2\u95ee\u548c\u5904\u7406\u3002 \u5b98\u7f51 pyshorteners\uff1a\u4e00\u4e2a\u7eaf Python URL \u7f29\u77ed\u5e93\u3002 \u5b98\u7f51 shorturl\uff1a\u751f\u6210\u77ed\u5c0f URL \u548c\u7c7b\u4f3c bit.ly \u77ed\u94fe\u7684 Python \u5b9e\u73b0\u3002 \u5b98\u7f51 webargs\uff1a\u4e00\u4e2a\u89e3\u6790 HTTP \u8bf7\u6c42\u53c2\u6570\u7684\u5e93\uff0c\u5185\u7f6e\u5bf9\u6d41\u884c web \u6846\u67b6\u7684\u652f\u6301\uff0c\u5305\u62ec Flask, Django, Bottle, Tornado \u548c Pyramid\u3002 \u5b98\u7f51", + "title": "URL \u5904\u7406" + }, + { + "location": "/#html", + "text": "\u5904\u7406 HTML \u548c XML \u7684\u5e93\u3002 BeautifulSoup\uff1a\u4ee5 Python \u98ce\u683c\u7684\u65b9\u5f0f\u6765\u5bf9 HTML \u6216 XML \u8fdb\u884c\u8fed\u4ee3\uff0c\u641c\u7d22\u548c\u4fee\u6539\u3002 \u5b98\u7f51 bleach\uff1a\u4e00\u4e2a\u57fa\u4e8e\u767d\u540d\u5355\u7684 HTML \u6e05\u7406\u548c\u6587\u672c\u94fe\u63a5\u5e93\u3002 \u5b98\u7f51 cssutils\uff1a\u4e00\u4e2a Python \u7684 CSS \u5e93\u3002 \u5b98\u7f51 html5lib\uff1a\u4e00\u4e2a\u517c\u5bb9\u6807\u51c6\u7684 HTML \u6587\u6863\u548c\u7247\u6bb5\u89e3\u6790\u53ca\u5e8f\u5217\u5316\u5e93\u3002 \u5b98\u7f51 lxml\uff1a\u4e00\u4e2a\u975e\u5e38\u5feb\u901f\uff0c\u7b80\u5355\u6613\u7528\uff0c\u529f\u80fd\u9f50\u5168\u7684\u5e93\uff0c\u7528\u6765\u5904\u7406 HTML \u548c XML\u3002 \u5b98\u7f51 MarkupSafe\uff1a\u4e3a Python \u5b9e\u73b0 XML/HTML/XHTML \u6807\u8bb0\u5b89\u5168\u5b57\u7b26\u4e32\u3002 \u5b98\u7f51 pyquery\uff1a\u4e00\u4e2a\u89e3\u6790 HTML \u7684\u5e93\uff0c\u7c7b\u4f3c jQuery\u3002 \u5b98\u7f51 requests-html\uff1a\u4eba\u6027\u5316\u7684\uff0cPythonic \u7684 HTML \u89e3\u6790\u5e93\u3002 \u5b98\u7f51 untangle\uff1a\u5c06 XML \u6587\u6863\u8f6c\u6362\u4e3a Python \u5bf9\u8c61\uff0c\u4f7f\u5176\u53ef\u4ee5\u65b9\u4fbf\u7684\u8bbf\u95ee\u3002 \u5b98\u7f51 xhtml2pdf\uff1aHTML/CSS \u8f6c PDF \u5de5\u5177\u3002 \u5b98\u7f51 xmltodict\uff1a\u50cf\u5904\u7406 JSON \u4e00\u6837\u5904\u7406 XML\u3002 \u5b98\u7f51 \u722c\u53d6\u7f51\u7edc\u7ad9\u70b9\u7684\u5e93 Scrapy\uff1a\u4e00\u4e2a\u5feb\u901f\u9ad8\u7ea7\u7684\u5c4f\u5e55\u722c\u53d6\u53ca\u7f51\u9875\u91c7\u96c6\u6846\u67b6\u3002 \u5b98\u7f51 cola\uff1a\u4e00\u4e2a\u5206\u5e03\u5f0f\u722c\u866b\u6846\u67b6\u3002 \u5b98\u7f51 Demiurge\uff1a\u57fa\u4e8e PyQuery \u7684\u722c\u866b\u5fae\u578b\u6846\u67b6\u3002 \u5b98\u7f51 feedparser\uff1a\u901a\u7528 feed \u89e3\u6790\u5668\u3002 \u5b98\u7f51 Grab\uff1a\u7ad9\u70b9\u722c\u53d6\u6846\u67b6\u3002 \u5b98\u7f51 MechanicalSoup\uff1a\u7528\u4e8e\u81ea\u52a8\u548c\u7f51\u7edc\u7ad9\u70b9\u4ea4\u4e92\u7684 Python \u5e93\u3002 \u5b98\u7f51 portia\uff1aScrapy \u53ef\u89c6\u5316\u722c\u53d6\u3002 \u5b98\u7f51 pyspider\uff1a\u4e00\u4e2a\u5f3a\u5927\u7684\u722c\u866b\u7cfb\u7edf\u3002 \u5b98\u7f51 RoboBrowser\uff1a\u4e00\u4e2a\u7b80\u5355\u7684\uff0cPython \u98ce\u683c\u7684\u5e93\uff0c\u7528\u6765\u6d4f\u89c8\u7f51\u7ad9\uff0c\u800c\u4e0d\u9700\u8981\u4e00\u4e2a\u72ec\u7acb\u5b89\u88c5\u7684\u6d4f\u89c8\u5668\u3002 \u5b98\u7f51", + "title": "HTML \u5904\u7406" + }, + { + "location": "/#_35", + "text": "\u7528\u4e8e\u8fdb\u884c\u7f51\u9875\u5185\u5bb9\u63d0\u53d6\u7684\u5e93\u3002 Haul\uff1a\u4e00\u4e2a\u53ef\u4ee5\u6269\u5c55\u7684\u56fe\u50cf\u722c\u53d6\u5de5\u5177\u3002 \u5b98\u7f51 html2text\uff1a\u5c06 HTML \u8f6c\u6362\u4e3a Markdown \u683c\u5f0f\u6587\u672c\u3002 \u5b98\u7f51 lassie\uff1a\u4eba\u6027\u5316\u7684\u7f51\u9875\u5185\u5bb9\u68c0\u7d22\u5e93\u3002 \u5b98\u7f51 micawber\uff1a\u4e00\u4e2a\u5c0f\u578b\u7f51\u9875\u5185\u5bb9\u63d0\u53d6\u5e93\uff0c\u7528\u6765\u4ece URLs \u63d0\u53d6\u5bcc\u5185\u5bb9\u3002 \u5b98\u7f51 newspaper \uff1a\u4f7f\u7528 Python \u8fdb\u884c\u65b0\u95fb\u63d0\u53d6\uff0c\u6587\u7ae0\u63d0\u53d6\u4ee5\u53ca\u5185\u5bb9\u7b56\u5c55\u3002 \u5b98\u7f51 opengraph\uff1a\u4e00\u4e2a\u7528\u6765\u89e3\u6790\u5f00\u653e\u5185\u5bb9\u534f\u8bae(Open Graph Protocol)\u7684 Python \u6a21\u5757\u3002 \u5b98\u7f51 python-goose \uff1aHTML \u5185\u5bb9/\u6587\u7ae0\u63d0\u53d6\u5668\u3002 \u5b98\u7f51 python-readability\uff1aarc90 \u516c\u53f8 readability \u5de5\u5177\u7684 Python \u9ad8\u901f\u7aef\u53e3\u3002 \u5b98\u7f51 sanitize\uff1a\u4e3a\u6742\u4e71\u7684\u6570\u636e\u4e16\u754c\u5e26\u6765\u8c03\u7406\u6027\u3002 \u5b98\u7f51 sumy\uff1a\u4e00\u4e2a\u4e3a\u6587\u672c\u6587\u4ef6\u548c HTML \u9875\u9762\u8fdb\u884c\u81ea\u52a8\u6458\u8981\u7684\u6a21\u5757\u3002 \u5b98\u7f51 textract\uff1a\u4ece\u4efb\u4f55\u683c\u5f0f\u7684\u6587\u6863\u4e2d\u63d0\u53d6\u6587\u672c\uff0cWord\uff0cPowerPoint\uff0cPDFs \u7b49\u7b49\u3002 \u5b98\u7f51", + "title": "\u7f51\u9875\u5185\u5bb9\u63d0\u53d6" + }, + { + "location": "/#_36", + "text": "\u8fdb\u884c\u8868\u5355\u64cd\u4f5c\u7684\u5e93\u3002 Deform\uff1aPython HTML \u8868\u5355\u751f\u6210\u5e93\uff0c\u53d7\u5230\u4e86 formish \u8868\u5355\u751f\u6210\u5e93\u7684\u542f\u53d1\u3002 \u5b98\u7f51 django-bootstrap3\uff1a\u96c6\u6210\u4e86 Bootstrap 3 \u7684 Django\u3002 \u5b98\u7f51 django-crispy-forms\uff1a\u4e00\u4e2a Django \u5e94\u7528\uff0c\u4ed6\u53ef\u4ee5\u8ba9\u4f60\u4ee5\u4e00\u79cd\u975e\u5e38\u4f18\u96c5\u4e14 DRY\uff08Don't repeat yourself\uff09 \u7684\u65b9\u5f0f\u6765\u521b\u5efa\u7f8e\u89c2\u7684\u8868\u5355\u3002 \u5b98\u7f51 django-remote-forms\uff1a\u4e00\u4e2a\u5e73\u53f0\u72ec\u7acb\u7684 Django \u8868\u5355\u5e8f\u5217\u5316\u5de5\u5177\u3002 \u5b98\u7f51 WTForms\uff1a\u4e00\u4e2a\u7075\u6d3b\u7684\u8868\u5355\u9a8c\u8bc1\u548c\u5448\u73b0\u5e93\u3002 \u5b98\u7f51 WTForms-JSON\uff1a\u4e00\u4e2a WTForms \u6269\u5c55\uff0c\u7528\u6765\u5904\u7406 JSON \u6570\u636e\u3002 \u5b98\u7f51", + "title": "\u8868\u5355" + }, + { + "location": "/#_37", + "text": "\u6570\u636e\u9a8c\u8bc1\u5e93\u3002\u591a\u7528\u4e8e\u8868\u5355\u9a8c\u8bc1\u3002 Cerberus\uff1a\u4e00\u4e2a\u6620\u5c04\u9a8c\u8bc1\u5668\uff08mappings-validator\uff09\u3002\u652f\u6301\u591a\u79cd\u89c4\u5219\uff0c\u63d0\u4f9b\u5f52\u4e00\u5316\u529f\u80fd\uff0c\u53ef\u4ee5\u65b9\u4fbf\u5730\u5b9a\u5236\u4e3a Python \u98ce\u683c\u7684 schema \u5b9a\u4e49\u3002 \u5b98\u7f51 colander\uff1a\u4e00\u4e2a\u7528\u4e8e\u5bf9\u4ece XML, JSON\uff0cHTML \u8868\u5355\u83b7\u53d6\u7684\u6570\u636e\u6216\u5176\u4ed6\u540c\u6837\u7b80\u5355\u7684\u5e8f\u5217\u5316\u6570\u636e\u8fdb\u884c\u9a8c\u8bc1\u548c\u53cd\u5e8f\u5217\u5316\u7684\u7cfb\u7edf\u3002 \u5b98\u7f51 kmatch\uff1a\u4e00\u79cd\u7528\u4e8e\u5339\u914d/\u9a8c\u8bc1/\u7b5b\u9009 Python \u5b57\u5178\u7684\u8bed\u8a00\u3002 \u5b98\u7f51 schema\uff1a\u4e00\u4e2a\u7528\u4e8e\u5bf9 Python \u6570\u636e\u7ed3\u6784\u8fdb\u884c\u9a8c\u8bc1\u7684\u5e93\u3002 \u5b98\u7f51 Schematics\uff1a\u6570\u636e\u7ed3\u6784\u9a8c\u8bc1\u3002 \u5b98\u7f51 valideer\uff1a\u8f7b\u91cf\u7ea7\u53ef\u6269\u5c55\u7684\u6570\u636e\u9a8c\u8bc1\u548c\u9002\u914d\u5e93\u3002 \u5b98\u7f51 voluptuous\uff1a\u4e00\u4e2a Python \u6570\u636e\u9a8c\u8bc1\u5e93\u3002\u4e3b\u8981\u662f\u4e3a\u4e86\u9a8c\u8bc1\u4f20\u5165 Python \u7684 JSON\uff0cYAML \u7b49\u6570\u636e\u3002 \u5b98\u7f51", + "title": "\u6570\u636e\u9a8c\u8bc1" + }, + { + "location": "/#_38", + "text": "\u5e2e\u52a9\u4f60\u548c\u7535\u5b50\u5783\u573e\u8fdb\u884c\u6218\u6597\u7684\u5e93\u3002 django-simple-captcha\uff1a\u4e00\u4e2a\u7b80\u5355\u3001\u9ad8\u5ea6\u53ef\u5b9a\u5236\u7684 Django \u5e94\u7528\uff0c\u53ef\u4ee5\u4e3a\u4efb\u4f55 Django \u8868\u5355\u6dfb\u52a0\u9a8c\u8bc1\u7801\u3002 \u5b98\u7f51 django-simple-spam-blocker\uff1a\u4e00\u4e2a\u7528\u4e8e Django \u7684\u7b80\u5355\u7684\u7535\u5b50\u5783\u573e\u5c4f\u853d\u5de5\u5177\u3002 \u5b98\u7f51", + "title": "\u53cd\u5783\u573e\u6280\u672f" + }, + { + "location": "/#_39", + "text": "\u7528\u6765\u8fdb\u884c\u6807\u8bb0\u7684\u5e93\u3002 django-taggit\uff1a\u7b80\u5355\u7684 Django \u6807\u8bb0\u5de5\u5177\u3002 \u5b98\u7f51", + "title": "\u6807\u8bb0" + }, + { + "location": "/#_40", + "text": "\u7ba1\u7406\u754c\u9762\u5e93\u3002 Ajenti\uff1a\u4e00\u4e2a\u4f60\u7684\u670d\u52a1\u5668\u503c\u5f97\u62e5\u6709\u7684\u7ba1\u7406\u9762\u677f\u3002 \u5b98\u7f51 django-suit\uff1aDjango \u7ba1\u7406\u754c\u9762\u7684\u4e00\u4e2a\u66ff\u4ee3\u54c1 (\u4ec5\u5bf9\u4e8e\u975e\u5546\u4e1a\u7528\u9014\u662f\u514d\u8d39\u7684)\u3002 \u5b98\u7f51 django-xadmin\uff1aDjango admin \u7684\u4e00\u4e2a\u66ff\u4ee3\u54c1\uff0c\u5177\u6709\u5f88\u591a\u4e0d\u9519\u7684\u529f\u80fd\u3002 \u5b98\u7f51 flask-admin\uff1a\u4e00\u4e2a\u7528\u4e8e Flask \u7684\u7b80\u5355\u53ef\u6269\u5c55\u7684\u7ba1\u7406\u754c\u9762\u6846\u67b6\u3002 \u5b98\u7f51 flower\uff1a\u4e00\u4e2a\u5bf9 Celery \u96c6\u7fa4\u8fdb\u884c\u5b9e\u65f6\u76d1\u63a7\u548c\u63d0\u4f9b web \u7ba1\u7406\u754c\u9762\u7684\u5de5\u5177\u3002 \u5b98\u7f51 Grappelli\uff1aDjango \u7ba1\u7406\u754c\u9762\u7684\u4e00\u4e2a\u6f02\u4eae\u7684\u76ae\u80a4\u3002 \u5b98\u7f51 Wooey\uff1a\u4e00\u4e2a Django \u5e94\u7528\uff0c\u53ef\u4ee5\u4e3a Python \u811a\u672c\u521b\u5efa web \u7528\u6237\u754c\u9762\u3002 \u5b98\u7f51", + "title": "\u7ba1\u7406\u9762\u677f" + }, + { + "location": "/#_41", + "text": "\u9759\u6001\u7ad9\u70b9\u751f\u6210\u5668\u662f\u4e00\u4e2a\u8f6f\u4ef6\uff0c\u5b83\u628a\u6587\u672c\u548c\u6a21\u677f\u4f5c\u4e3a\u8f93\u5165\uff0c\u7136\u540e\u8f93\u51fa HTML \u6587\u4ef6\u3002 Pelican\uff1a\u4f7f\u7528 Markdown \u6216 ReST \u6765\u5904\u7406\u5185\u5bb9\uff0c Jinja 2 \u6765\u5236\u4f5c\u4e3b\u9898\u3002\u652f\u6301 DVCS, Disqus.\u3002AGPL \u8bb8\u53ef\u3002 \u5b98\u7f51 Cactus\uff1a\u4e3a\u8bbe\u8ba1\u5e08\u8bbe\u8ba1\u7684\u9759\u6001\u7ad9\u70b9\u751f\u6210\u5668\u3002 \u5b98\u7f51 Hyde\uff1a\u57fa\u4e8e Jinja2 \u7684\u9759\u6001\u7ad9\u70b9\u751f\u6210\u5668\u3002 \u5b98\u7f51 Nikola\uff1a\u4e00\u4e2a\u9759\u6001\u7f51\u7ad9\u548c\u535a\u5ba2\u751f\u6210\u5668\u3002 \u5b98\u7f51 Tinkerer\uff1aTinkerer \u662f\u4e00\u4e2a\u535a\u5ba2\u5f15\u64ce/\u9759\u6001\u7ad9\u70b9\u751f\u6210\u5668\uff0c\u7531 Sphinx \u9a71\u52a8\u3002 \u5b98\u7f51 Lektor\uff1a\u4e00\u4e2a\u7b80\u5355\u6613\u7528\u7684\u9759\u6001 CMS \u548c\u535a\u5ba2\u5f15\u64ce\u3002 \u5b98\u7f51", + "title": "\u9759\u6001\u7ad9\u70b9\u751f\u6210\u5668" + }, + { + "location": "/#_42", + "text": "\u64cd\u4f5c\u7cfb\u7edf\u8fdb\u7a0b\u542f\u52a8\u53ca\u901a\u4fe1\u5e93\u3002 envoy\uff1a\u6bd4 Python subprocess \u6a21\u5757\u66f4\u4eba\u6027\u5316\u3002 \u5b98\u7f51 sarge\uff1a\u53e6\u4e00 \u79cd subprocess \u6a21\u5757\u7684\u5c01\u88c5\u3002 \u5b98\u7f51 sh\uff1a\u4e00\u4e2a\u5b8c\u5907\u7684 subprocess \u66ff\u4ee3\u5e93\u3002 \u5b98\u7f51", + "title": "\u8fdb\u7a0b" + }, + { + "location": "/#_43", + "text": "\u7528\u4ee5\u8fdb\u884c\u5e76\u53d1\u548c\u5e76\u884c\u64cd\u4f5c\u7684\u5e93\u3002 multiprocessing\uff1a(Python \u6807\u51c6\u5e93) \u57fa\u4e8e\u8fdb\u7a0b\u7684\u201c\u7ebf\u7a0b\u201d\u63a5\u53e3\u3002 \u5b98\u7f51 threading\uff1a(Python \u6807\u51c6\u5e93)\u66f4\u9ad8\u5c42\u7684\u7ebf\u7a0b\u63a5\u53e3\u3002 \u5b98\u7f51 eventlet\uff1a\u652f\u6301 WSGI \u7684\u5f02\u6b65\u6846\u67b6\u3002 \u5b98\u7f51 gevent\uff1a\u4e00\u4e2a\u57fa\u4e8e\u534f\u7a0b\u7684 Python \u7f51\u7edc\u5e93\uff0c\u4f7f\u7528 greenlet \u3002 \u5b98\u7f51 Tomorrow\uff1a\u7528\u4e8e\u4ea7\u751f\u5f02\u6b65\u4ee3\u7801\u7684\u795e\u5947\u7684\u88c5\u9970\u5668\u8bed\u6cd5\u5b9e\u73b0\u3002 \u5b98\u7f51 uvloop\uff1a\u5728 libuv \u4e4b\u4e0a\u8d85\u5feb\u901f\u5b9e\u73b0 asyncio \u4e8b\u4ef6\u5faa\u73af\u3002 \u5b98\u7f51", + "title": "\u5e76\u53d1\u548c\u5e76\u884c" + }, + { + "location": "/#_44", + "text": "\u7528\u4e8e\u7f51\u7edc\u7f16\u7a0b\u7684\u5e93\u3002 asyncio\uff1a(Python \u6807\u51c6\u5e93) \u5f02\u6b65 I/O, \u4e8b\u4ef6\u5faa\u73af, \u534f\u7a0b\u4ee5\u53ca\u4efb\u52a1\u3002 \u5b98\u7f51 Twisted \uff1a\u4e00\u4e2a\u4e8b\u4ef6\u9a71\u52a8\u7684\u7f51\u7edc\u5f15\u64ce\u3002 \u5b98\u7f51 pulsar\uff1a\u4e8b\u4ef6\u9a71\u52a8\u7684\u5e76\u53d1\u6846\u67b6\u3002 \u5b98\u7f51 diesel\uff1a\u57fa\u4e8e Greenlet \u7684\u4e8b\u4ef6 I/O \u6846\u67b6\u3002 \u5b98\u7f51 pyzmq\uff1a\u4e00\u4e2a ZeroMQ \u6d88\u606f\u5e93\u7684 Python \u5c01\u88c5\u3002 \u5b98\u7f51 Toapi\uff1a\u4e00\u4e2a\u8f7b\u5de7\uff0c\u7b80\u5355\uff0c\u5feb\u901f\u7684 Flask \u5e93\uff0c\u81f4\u529b\u4e8e\u4e3a\u6240\u6709\u7f51\u7ad9\u63d0\u4f9b API \u670d\u52a1\u3002 \u5b98\u7f51 txZMQ\uff1a\u57fa\u4e8e Twisted \u7684 ZeroMQ \u6d88\u606f\u5e93\u7684 Python \u5c01\u88c5\u3002 \u5b98\u7f51", + "title": "\u7f51\u7edc" + }, + { + "location": "/#websocket", + "text": "\u5e2e\u52a9\u4f7f\u7528 WebSocket \u7684\u5e93\u3002 AutobahnPython\uff1a\u7ed9 Python \u3001\u4f7f\u7528\u7684 WebSocket WAMP \u57fa\u4e8e Twisted \u548c asyncio \u3002 \u5b98\u7f51 Crossbar\uff1a\u5f00\u6e90\u7edf\u4e00\u5e94\u7528\u8def\u7531(Websocket WAMP for Python on Autobahn)\u3002 \u5b98\u7f51 django-socketio\uff1a\u7ed9 Django \u7528\u7684 WebSockets\u3002 \u5b98\u7f51 WebSocket-for-Python\uff1a\u4e3a Python2/3 \u4ee5\u53ca PyPy \u7f16\u5199\u7684 WebSocket \u5ba2\u6237\u7aef\u548c\u670d\u52a1\u5668\u5e93\u3002 \u5b98\u7f51", + "title": "WebSocket" + }, + { + "location": "/#wsgi", + "text": "\u517c\u5bb9 WSGI \u7684 web \u670d\u52a1\u5668 gunicorn\uff1aPre-forked, \u90e8\u5206\u662f\u7531 C \u8bed\u8a00\u7f16\u5199\u7684\u3002 \u5b98\u7f51 uwsgi\uff1auwsgi \u9879\u76ee\u7684\u76ee\u7684\u662f\u5f00\u53d1\u4e00\u7ec4\u5168\u6808\u5de5\u5177\uff0c\u7528\u6765\u5efa\u7acb\u6258\u7ba1\u670d\u52a1\uff0c \u7531 C \u8bed\u8a00\u7f16\u5199\u3002 \u5b98\u7f51 bjoern \uff1a\u5f02\u6b65\uff0c\u975e\u5e38\u5feb\u901f\uff0c\u7531 C \u8bed\u8a00\u7f16\u5199\u3002 \u5b98\u7f51 fapws3\uff1a\u5f02\u6b65 (\u4ec5\u5bf9\u4e8e\u7f51\u7edc\u7aef)\uff0c\u7531 C \u8bed\u8a00\u7f16\u5199\u3002 \u5b98\u7f51 meinheld\uff1a\u5f02\u6b65\uff0c\u90e8\u5206\u662f\u7531 C \u8bed\u8a00\u7f16\u5199\u7684\u3002 \u5b98\u7f51 netius\uff1a\u5f02\u6b65\uff0c\u975e\u5e38\u5feb\u901f\u3002 \u5b98\u7f51 paste\uff1a\u591a\u7ebf\u7a0b\uff0c\u7a33\u5b9a\uff0c\u4e45\u7ecf\u8003\u9a8c\u3002 \u5b98\u7f51 rocket\uff1a\u591a\u7ebf\u7a0b\u3002 \u5b98\u7f51 waitress\uff1a\u591a\u7ebf\u7a0b, \u662f\u5b83\u9a71\u52a8\u7740 Pyramid \u6846\u67b6\u3002 \u5b98\u7f51 Werkzeug\uff1a\u4e00\u4e2a WSGI \u5de5\u5177\u5e93\uff0c\u9a71\u52a8\u7740 Flask \uff0c\u800c\u4e14\u53ef\u4ee5\u5f88\u65b9\u4fbf\u5927\u5d4c\u5165\u5230\u4f60\u7684\u9879\u76ee\u4e2d\u53bb\u3002 \u5b98\u7f51", + "title": "WSGI \u670d\u52a1\u5668" + }, + { + "location": "/#rpc", + "text": "\u517c\u5bb9 RPC \u7684\u670d\u52a1\u5668\u3002 SimpleJSONRPCServer\uff1a\u8fd9\u4e2a\u5e93\u662f JSON-RPC \u89c4\u8303\u7684\u4e00\u4e2a\u5b9e\u73b0\u3002 \u5b98\u7f51 SimpleXMLRPCServer\uff1a(Python \u6807\u51c6\u5e93) \u7b80\u5355\u7684 XML-RPC \u670d\u52a1\u5668\u5b9e\u73b0\uff0c\u5355\u7ebf\u7a0b\u3002 \u5b98\u7f51 zeroRPC\uff1azerorpc \u662f\u4e00\u4e2a\u7075\u6d3b\u7684 RPC \u5b9e\u73b0\uff0c\u57fa\u4e8e ZeroMQ \u548c MessagePack\u3002 \u5b98\u7f51", + "title": "RPC \u670d\u52a1\u5668" + }, + { + "location": "/#_45", + "text": "cryptography\uff1a\u8fd9\u4e2a\u8f6f\u4ef6\u5305\u610f\u5728\u63d0\u4f9b\u5bc6\u7801\u5b66\u57fa\u672c\u5185\u5bb9\u548c\u65b9\u6cd5\u63d0\u4f9b\u7ed9 Python \u5f00\u53d1\u8005\u3002 \u5b98\u7f51 hashids\uff1a\u5728 Python \u4e2d\u5b9e\u73b0 hashids \u3002 \u5b98\u7f51 Paramiko\uff1aSSHv2 \u534f\u8bae\u7684 Python (2.6+, 3.3+) \uff0c\u63d0\u4f9b\u5ba2\u6237\u7aef\u548c\u670d\u52a1\u7aef\u7684\u529f\u80fd\u3002 \u5b98\u7f51 Passlib\uff1a\u5b89\u5168\u5bc6\u7801\u5b58\u50a8\uff0f\u54c8\u5e0c\u5e93\uff0c \u5b98\u7f51 PyCrypto\uff1aPython \u5bc6\u7801\u5b66\u5de5\u5177\u7bb1\u3002 \u5b98\u7f51 PyNacl\uff1a\u7f51\u7edc\u548c\u5bc6\u7801\u5b66(NaCl) \u5e93\u7684 Python \u7ed1\u5b9a\u3002 \u5b98\u7f51", + "title": "\u5bc6\u7801\u5b66" + }, + { + "location": "/#_46", + "text": "\u7528\u6765\u521b\u5efa\u56fe\u5f62\u7528\u6237\u754c\u9762\u7a0b\u5e8f\u7684\u5e93\u3002 curses\uff1a\u5185\u5efa\u7684 ncurses \u5c01\u88c5\uff0c\u7528\u6765\u521b\u5efa\u7ec8\u7aef\u56fe\u5f62\u7528\u6237\u754c\u9762\u3002 \u5b98\u7f51 enaml\uff1a\u4f7f\u7528\u7c7b\u4f3c QML \u7684 Declaratic \u8bed\u6cd5\u6765\u521b\u5efa\u7f8e\u89c2\u7684\u7528\u6237\u754c\u9762\u3002 \u5b98\u7f51 kivy \uff1a\u4e00\u4e2a\u7528\u6765\u521b\u5efa\u81ea\u7136\u7528\u6237\u4ea4\u4e92\uff08NUI\uff09\u5e94\u7528\u7a0b\u5e8f\u7684\u5e93\uff0c\u53ef\u4ee5\u8fd0\u884c\u5728 Windows, Linux, Mac OS X, Android \u4ee5\u53ca iOS \u5e73\u53f0\u4e0a\u3002 \u5b98\u7f51 pyglet\uff1a\u4e00\u4e2a Python \u7684\u8de8\u5e73\u53f0\u7a97\u53e3\u53ca\u591a\u5a92\u4f53\u5e93\u3002 \u5b98\u7f51 PyQt\uff1a\u8de8\u5e73\u53f0\u7528\u6237\u754c\u9762\u6846\u67b6 Qt \u7684 Python \u7ed1\u5b9a \uff0c\u652f\u6301 Qt v4 \u548c Qt v5\u3002 \u5b98\u7f51 PySide\uff1a\u8de8\u5e73\u53f0\u7528\u6237\u754c\u9762\u6846\u67b6 Qt \u7684 Python \u7ed1\u5b9a \uff0c\u652f\u6301 Qt v4\u3002 \u5b98\u7f51 Tkinter\uff1aTkinter \u662f Python GUI \u7684\u4e00\u4e2a\u4e8b\u5b9e\u6807\u51c6\u5e93\u3002 \u5b98\u7f51 Toga\uff1a\u4e00\u4e2a Python \u539f\u751f\u7684, \u64cd\u4f5c\u7cfb\u7edf\u539f\u751f\u7684 GUI \u5de5\u5177\u5305\u3002 \u5b98\u7f51 urwid\uff1a\u4e00\u4e2a\u7528\u6765\u521b\u5efa\u7ec8\u7aef GUI \u5e94\u7528\u7684\u5e93\uff0c\u652f\u6301\u7ec4\u4ef6\uff0c\u4e8b\u4ef6\u548c\u4e30\u5bcc\u7684\u8272\u5f69\u7b49\u3002 \u5b98\u7f51 wxPython\uff1awxPython \u662f wxWidgets C++ \u7c7b\u5e93\u548c Python \u8bed\u8a00\u6df7\u5408\u7684\u4ea7\u7269\u3002 \u5b98\u7f51 PyGObject\uff1aGLib/GObject/GIO/GTK+ (GTK+3) \u7684 Python \u7ed1\u5b9a\u3002 \u5b98\u7f51 Flexx\uff1aFlexx \u662f\u4e00\u4e2a\u7eaf Python \u8bed\u8a00\u7f16\u5199\u7684\u7528\u6765\u521b\u5efa GUI \u7a0b\u5e8f\u7684\u5de5\u5177\u96c6\uff0c\u5b83\u4f7f\u7528 web \u6280\u672f\u8fdb\u884c\u754c\u9762\u7684\u5c55\u793a\u3002 \u5b98\u7f51", + "title": "\u56fe\u5f62\u7528\u6237\u754c\u9762" + }, + { + "location": "/#_47", + "text": "\u8d85\u8d5e\u7684\u6e38\u620f\u5f00\u53d1\u5e93\u3002 Cocos2d\uff1acocos2d \u662f\u4e00\u4e2a\u7528\u6765\u5f00\u53d1 2D \u6e38\u620f\uff0c \u793a\u4f8b\u548c\u5176\u4ed6\u56fe\u5f62/\u4ea4\u4e92\u5e94\u7528\u7684\u6846\u67b6\u3002\u57fa\u4e8e pyglet\u3002 \u5b98\u7f51 Panda3D\uff1a\u7531\u8fea\u58eb\u5c3c\u5f00\u53d1\u7684 3D \u6e38\u620f\u5f15\u64ce\uff0c\u5e76\u7531\u5361\u5185\u57fa\u6885\u9647\u5a31\u4e50\u6280\u672f\u4e2d\u5fc3\u8d1f\u8d23\u7ef4\u62a4\u3002\u4f7f\u7528 C++ \u7f16\u5199, \u9488\u5bf9 Python \u8fdb\u884c\u4e86\u5b8c\u5168\u7684\u5c01\u88c5\u3002 \u5b98\u7f51 Pygame\uff1aPygame \u662f\u4e00\u7ec4 Python \u6a21\u5757\uff0c\u7528\u6765\u7f16\u5199\u6e38\u620f\u3002 \u5b98\u7f51 PyOgre\uff1aOgre 3D \u6e32\u67d3\u5f15\u64ce\u7684 Python \u7ed1\u5b9a\uff0c\u53ef\u4ee5\u7528\u6765\u5f00\u53d1\u6e38\u620f\u548c\u4eff\u771f\u7a0b\u5e8f\u7b49\u4efb\u4f55 3D \u5e94\u7528\u3002 \u5b98\u7f51 PyOpenGL\uff1aOpenGL \u7684 Python \u7ed1\u5b9a\u53ca\u5176\u76f8\u5173 APIs\u3002 \u5b98\u7f51 PySDL2\uff1aSDL2 \u5e93\u7684\u5c01\u88c5\uff0c\u57fa\u4e8e ctypes\u3002 \u5b98\u7f51 RenPy\uff1a\u4e00\u4e2a\u89c6\u89c9\u5c0f\u8bf4\uff08visual novel\uff09\u5f15\u64ce\u3002 \u5b98\u7f51", + "title": "\u6e38\u620f\u5f00\u53d1" + }, + { + "location": "/#_48", + "text": "\u7528\u6765\u751f\u6210\u548c\u64cd\u4f5c\u65e5\u5fd7\u7684\u5e93\u3002 logging\uff1a(Python \u6807\u51c6\u5e93) \u4e3a Python \u63d0\u4f9b\u65e5\u5fd7\u529f\u80fd\u3002 \u5b98\u7f51 logbook\uff1aLogging \u5e93\u7684\u66ff\u4ee3\u54c1\u3002 \u5b98\u7f51 Eliot\uff1a\u4e3a\u590d\u6742\u7684\u548c\u5206\u5e03\u5f0f\u7cfb\u7edf\u521b\u5efa\u65e5\u5fd7\u3002 \u5b98\u7f51 Raven\uff1aSentry \u7684 Python \u5ba2\u6237\u7aef\u3002 \u5b98\u7f51 Sentry\uff1a\u5b9e\u65f6\u8bb0\u5f55\u548c\u6536\u96c6\u65e5\u5fd7\u7684\u670d\u52a1\u5668\u3002 \u5b98\u7f51", + "title": "\u65e5\u5fd7" + }, + { + "location": "/#_49", + "text": "\u8fdb\u884c\u4ee3\u7801\u5e93\u6d4b\u8bd5\u548c\u751f\u6210\u6d4b\u8bd5\u6570\u636e\u7684\u5e93\u3002 \u6d4b\u8bd5\u6846\u67b6 unittest\uff1a(Python \u6807\u51c6\u5e93) \u5355\u5143\u6d4b\u8bd5\u6846\u67b6\u3002 \u5b98\u7f51 nose\uff1anose \u6269\u5c55\u4e86 unittest \u7684\u529f\u80fd\u3002 \u5b98\u7f51 contexts\uff1a\u4e00\u4e2a Python 3.3+ \u7684 BDD \u6846\u67b6\u3002\u53d7\u5230 C# \u2013 Machine.Specifications \u7684\u542f\u53d1\u3002 \u5b98\u7f51 hypothesis\uff1aHypothesis \u662f\u4e00\u4e2a\u57fa\u4e8e\u5148\u8fdb\u7684 Quickcheck \u98ce\u683c\u7279\u6027\u7684\u6d4b\u8bd5\u5e93\u3002 \u5b98\u7f51 mamba\uff1aPython \u7684\u7ec8\u6781\u6d4b\u8bd5\u5de5\u5177\uff0c \u62e5\u62a4 BDD\u3002 \u5b98\u7f51 PyAutoGUI\uff1aPyAutoGUI \u662f\u4e00\u4e2a\u4eba\u6027\u5316\u7684\u8de8\u5e73\u53f0 GUI \u81ea\u52a8\u6d4b\u8bd5\u6a21\u5757\u3002 \u5b98\u7f51 pyshould\uff1aShould \u98ce\u683c\u7684\u65ad\u8a00\uff0c\u57fa\u4e8e PyHamcrest \u3002 \u5b98\u7f51 pytest\uff1a\u4e00\u4e2a\u6210\u719f\u7684\u5168\u529f\u80fd Python \u6d4b\u8bd5\u5de5\u5177\u3002 \u5b98\u7f51 green\uff1a\u5e72\u51c0\uff0c\u591a\u5f69\u7684\u6d4b\u8bd5\u5de5\u5177\u3002 \u5b98\u7f51 pyvows\uff1aBDD \u98ce\u683c\u7684\u6d4b\u8bd5\u5de5\u5177\uff0c\u53d7 Vows.js \u7684\u542f\u53d1\u3002 \u5b98\u7f51 Robot Framework\uff1a\u4e00\u4e2a\u901a\u7528\u7684\u81ea\u52a8\u5316\u6d4b\u8bd5\u6846\u67b6\u3002 \u5b98\u7f51 Web \u6d4b\u8bd5 Selenium\uff1a Selenium WebDriver \u7684 Python \u7ed1\u5b9a\u3002 \u5b98\u7f51 locust\uff1a\u4f7f\u7528 Python \u7f16\u5199\u7684\uff0c\u53ef\u6269\u5c55\u7684\u7528\u6237\u52a0\u8f7d\u6d4b\u8bd5\u5de5\u5177\u3002 \u5b98\u7f51 sixpack\uff1a\u4e00\u4e2a\u548c\u8bed\u8a00\u65e0\u5173\u7684 A/B \u6d4b\u8bd5\u6846\u67b6\u3002 \u5b98\u7f51 splinter\uff1a\u5f00\u6e90\u7684 web \u5e94\u7528\u6d4b\u8bd5\u5de5\u5177\u3002 \u5b98\u7f51 Mock \u6d4b\u8bd5 mock\uff1a(Python \u6807\u51c6\u5e93) \u4e00\u4e2a\u7528\u4e8e\u4f2a\u9020\u6d4b\u8bd5\u7684\u5e93\u3002 \u5b98\u7f51 doublex\uff1aPython \u7684\u4e00\u4e2a\u529f\u80fd\u5f3a\u5927\u7684 doubles \u00a0\u6d4b\u8bd5\u6846\u67b6\u3002 \u5b98\u7f51 freezegun\uff1a\u901a\u8fc7\u4f2a\u9020\u65e5\u671f\u6a21\u5757\u6765\u751f\u6210\u4e0d\u540c\u7684\u65f6\u95f4\u3002 \u5b98\u7f51 httmock\uff1a\u9488\u5bf9 Python 2.6+ \u548c 3.2+ \u751f\u6210 \u4f2a\u9020\u8bf7\u6c42\u7684\u5e93\u3002 \u5b98\u7f51 httpretty\uff1aPython \u7684 HTTP \u8bf7\u6c42 mock \u5de5\u5177\u3002 \u5b98\u7f51 responses\uff1a\u4f2a\u9020 Python \u4e2d\u7684 requests \u5e93\u7684\u4e00\u4e2a\u901a\u7528\u5e93\u3002 \u5b98\u7f51 VCR.py\uff1a\u5728\u4f60\u7684\u6d4b\u8bd5\u4e2d\u8bb0\u5f55\u548c\u91cd\u653e HTTP \u4ea4\u4e92\u3002 \u5b98\u7f51 \u5bf9\u8c61\u5de5\u5382 factoryboy\uff1a\u4e00\u4e2a Python \u7528\u7684\u6d4b\u8bd5\u56fa\u4ef6 (test fixtures) \u66ff\u4ee3\u5e93\u3002 \u5b98\u7f51 mixer\uff1a\u53e6\u5916\u4e00\u4e2a\u6d4b\u8bd5\u56fa\u4ef6 (test fixtures) \u66ff\u4ee3\u5e93\uff0c\u652f\u6301 Django, Flask, SQLAlchemy, Peewee \u7b49\u3002 \u5b98\u7f51 modelmommy\uff1a\u4e3a Django \u6d4b\u8bd5\u521b\u5efa\u968f\u673a\u56fa\u4ef6\u3002 \u5b98\u7f51 \u4ee3\u7801\u8986\u76d6\u7387 coverage\uff1a\u4ee3\u7801\u8986\u76d6\u7387\u6d4b\u91cf\u3002 \u5b98\u7f51 Codecov\uff1a\u4e00\u4e2a\u4ee3\u7801\u8986\u76d6\u7387\u6d4b\u8bd5\u5de5\u5177\uff0c\u4e3a\u5f00\u6e90\u9879\u76ee\u63d0\u4f9b\u514d\u8d39\u4ee3\u7801\u8986\u76d6\u7387\u6d4b\u8bd5\u670d\u52a1\u3002 \u5b98\u7f51 \u4f2a\u6570\u636e faker\uff1a\u4e00\u4e2a Python \u5e93\uff0c\u7528\u6765\u751f\u6210\u4f2a\u6570\u636e\u3002 \u5b98\u7f51 fake2db\uff1a\u4f2a\u6570\u636e\u5e93\u751f\u6210\u5668\u3002 \u5b98\u7f51 radar\uff1a\u751f\u6210\u968f\u673a\u7684\u65e5\u671f/\u65f6\u95f4\u3002 \u5b98\u7f51 \u9519\u8bef\u5904\u7406 FuckIt.py\uff1aFuckIt.py \u4f7f\u7528\u6700\u5148\u8fdb\u7684\u6280\u672f\u6765\u4fdd\u8bc1\u4f60\u7684 Python \u4ee3\u7801\u65e0\u8bba\u5bf9\u9519\u90fd\u80fd\u7ee7\u7eed\u8fd0\u884c\u3002 \u5b98\u7f51", + "title": "\u6d4b\u8bd5" + }, + { + "location": "/#lint", + "text": "\u8fdb\u884c\u4ee3\u7801\u5206\u6790\uff0c\u89e3\u6790\u548c\u64cd\u4f5c\u4ee3\u7801\u5e93\u7684\u5e93\u548c\u5de5\u5177\u3002 \u4ee3\u7801\u5206\u6790 coala\uff1a\u8bed\u8a00\u72ec\u7acb\u548c\u6613\u4e8e\u6269\u5c55\u7684\u4ee3\u7801\u5206\u6790\u5e94\u7528\u7a0b\u5e8f\u3002 \u5b98\u7f51 code2flow\uff1a\u628a\u4f60\u7684 Python \u548c JavaScript \u4ee3\u7801\u8f6c\u6362\u4e3a\u6d41\u7a0b\u56fe\u3002 \u5b98\u7f51 pycallgraph\uff1a\u8fd9\u4e2a\u5e93\u53ef\u4ee5\u628a\u4f60\u7684 Python \u5e94\u7528\u7684\u6d41\u7a0b(\u8c03\u7528\u56fe)\u8fdb\u884c\u53ef\u89c6\u5316\u3002 \u5b98\u7f51 pysonar2\uff1aPython \u7c7b\u578b\u63a8\u65ad\u548c\u68c0\u7d22\u5de5\u5177\u3002 \u5b98\u7f51 Lint \u5de5\u5177 Flake8\uff1a\u6a21\u5757\u5316\u6e90\u7801\u68c0\u67e5\u5de5\u5177: pep8, pyflakes \u4ee5\u53ca co\u3002 \u5b98\u7f51 Pylint\uff1a\u4e00\u4e2a\u5b8c\u5168\u53ef\u5b9a\u5236\u7684\u6e90\u7801\u5206\u6790\u5668\u3002 \u5b98\u7f51 YAPF: Google \u7684 Python \u4ee3\u7801\u683c\u5f0f\u5316\u5de5\u5177\u3002 \u5b98\u7f51 pylama\uff1aPython \u548c JavaScript \u7684\u4ee3\u7801\u5ba1\u67e5\u5de5\u5177\u3002 \u5b98\u7f51 \u4ee3\u7801\u683c\u5f0f\u5316 autopep8\uff1a\u81ea\u52a8\u683c\u5f0f\u5316 Python \u4ee3\u7801\uff0c\u4ee5\u4f7f\u5176\u7b26\u5408 PEP8 \u89c4\u8303\u3002 \u5b98\u7f51 black\uff1a\u4e00\u4e2a\u575a\u5b9a\u7684 Python \u4ee3\u7801\u683c\u5f0f\u5316\u5de5\u5177\u3002 \u5b98\u7f51", + "title": "\u4ee3\u7801\u5206\u6790\u548c Lint \u5de5\u5177" + }, + { + "location": "/#_50", + "text": "\u7528\u6765\u8fdb\u884c\u4ee3\u7801\u8c03\u8bd5\u7684\u5e93\u3002 \u8c03\u8bd5\u5668 ipdb\uff1aIPython \u542f\u7528\u7684 pdb \u3002 \u5b98\u7f51 pudb\uff1a\u5168\u5c4f\uff0c\u57fa\u4e8e\u63a7\u5236\u53f0\u7684 Python \u8c03\u8bd5\u5668\u3002 \u5b98\u7f51 pyringe\uff1a\u53ef\u4ee5\u5728 Python \u8fdb\u7a0b\u4e2d\u9644\u52a0\u548c\u6ce8\u5165\u4ee3\u7801\u7684\u8c03\u8bd5\u5668\u3002 \u5b98\u7f51 wdb\uff1a\u4e00\u4e2a\u5947\u5f02\u7684 web \u8c03\u8bd5\u5668\uff0c\u901a\u8fc7 WebSockets \u5de5\u4f5c\u3002 \u5b98\u7f51 winpdb\uff1a\u4e00\u4e2a\u5177\u6709\u56fe\u5f62\u7528\u6237\u754c\u9762\u7684 Python \u8c03\u8bd5\u5668\uff0c\u53ef\u4ee5\u8fdb\u884c\u8fdc\u7a0b\u8c03\u8bd5\uff0c\u57fa\u4e8e rpdb2\u3002 \u5b98\u7f51 django-debug-toolbar\uff1a\u4e3a Django \u663e\u793a\u5404\u79cd\u8c03\u8bd5\u4fe1\u606f\u3002 \u5b98\u7f51 django-devserver\uff1a\u4e00\u4e2a Django \u8fd0\u884c\u670d\u52a1\u5668\u7684\u66ff\u4ee3\u54c1\u3002 \u5b98\u7f51 flask-debugtoolbar\uff1adjango-debug-toolbar \u7684 flask \u7248\u3002 \u5b98\u7f51 \u6027\u80fd\u5206\u6790\u5668 lineprofiler\uff1a\u9010\u884c\u6027\u80fd\u5206\u6790\u3002 \u5b98\u7f51 Memory Profiler \uff1a\u76d1\u63a7 Python \u4ee3\u7801\u7684\u5185\u5b58\u4f7f\u7528\u3002 \u5b98\u7f51 \u3001 \u5185\u5b58 profiling\uff1a\u4e00\u4e2a\u4ea4\u4e92\u5f0f Python \u6027\u80fd\u5206\u6790\u5de5\u5177\u3002 \u5b98\u7f51 \u5176\u4ed6 pyelftools\uff1a\u89e3\u6790\u548c\u5206\u6790 ELF \u6587\u4ef6\u4ee5\u53ca DWARF \u8c03\u8bd5\u4fe1\u606f\u3002 \u5b98\u7f51 python-statsd\uff1a statsd \u670d\u52a1\u5668\u7684 Python \u5ba2\u6237\u7aef\u3002 \u5b98\u7f51", + "title": "\u8c03\u8bd5\u5de5\u5177" + }, + { + "location": "/#_51", + "text": "\u7528\u6765\u8fdb\u884c\u79d1\u5b66\u8ba1\u7b97\u548c\u6570\u636e\u5206\u6790\u7684\u5e93\u3002 astropy\uff1a\u4e00\u4e2a\u5929\u6587\u5b66 Python \u5e93\u3002 \u5b98\u7f51 bcbio-nextgen \uff1a\u8fd9\u4e2a\u5de5\u5177\u7bb1\u4e3a\u5168\u81ea\u52a8\u9ad8\u901a\u91cf\u6d4b\u5e8f\u5206\u6790\u63d0\u4f9b\u7b26\u5408\u6700\u4f73\u5b9e\u8df5\u7684\u5904\u7406\u6d41\u7a0b\u3002 \u5b98\u7f51 bccb\uff1a\u751f\u7269\u5206\u6790\u76f8\u5173\u4ee3\u7801\u96c6\u5408\u3002 \u5b98\u7f51 Biopython\uff1aBiopython \u662f\u4e00\u7ec4\u53ef\u4ee5\u514d\u8d39\u4f7f\u7528\u7684\u7528\u6765\u8fdb\u884c\u751f\u7269\u8ba1\u7b97\u7684\u5de5\u5177\u3002 \u5b98\u7f51 blaze \uff1aNumPy \u548c Pandas \u7684\u5927\u6570\u636e\u63a5\u53e3\u3002 \u5b98\u7f51 cclib \uff1a\u4e00\u4e2a\u7528\u6765\u89e3\u6790\u548c\u89e3\u91ca\u8ba1\u7b97\u5316\u5b66\u8f6f\u4ef6\u5305\u8f93\u51fa\u7ed3\u679c\u7684\u5e93\u3002 \u5b98\u7f51 NetworkX\uff1a\u4e00\u4e2a\u4e3a\u590d\u6742\u7f51\u7edc\u8bbe\u8ba1\u7684\u9ad8\u6027\u80fd\u8f6f\u4ef6\u3002 \u5b98\u7f51 Neupy\uff1a\u6267\u884c\u548c\u6d4b\u8bd5\u5404\u79cd\u4e0d\u540c\u7684\u4eba\u5de5\u795e\u7ecf\u7f51\u7edc\u7b97\u6cd5\u3002 \u5b98\u7f51 Numba\uff1aPython JIT (just in time) \u7f16\u8bd1\u5668\uff0c\u9488\u5bf9\u79d1\u5b66\u7528\u7684 Python \uff0c\u7531 Cython \u548c NumPy \u7684\u5f00\u53d1\u8005\u5f00\u53d1\u3002 \u5b98\u7f51 NumPy \uff1a\u4f7f\u7528 Python \u8fdb\u884c\u79d1\u5b66\u8ba1\u7b97\u7684\u57fa\u7840\u5305\u3002 \u5b98\u7f51 Open Babel\uff1a\u4e00\u4e2a\u5316\u5b66\u5de5\u5177\u7bb1\uff0c\u7528\u6765\u63cf\u8ff0\u591a\u79cd\u5316\u5b66\u6570\u636e\u3002 \u5b98\u7f51 Open Mining \uff1a\u4f7f\u7528 Python \u6316\u6398\u5546\u4e1a\u60c5\u62a5 (BI) (Pandas web \u63a5\u53e3)\u3002 \u5b98\u7f51 orange \uff1a\u901a\u8fc7\u53ef\u89c6\u5316\u7f16\u7a0b\u6216 Python \u811a\u672c\u8fdb\u884c\u6570\u636e\u6316\u6398\uff0c\u6570\u636e\u53ef\u89c6\u5316\uff0c\u5206\u6790\u548c\u673a\u5668\u5b66\u4e60\u3002 \u5b98\u7f51 Pandas\uff1a\u63d0\u4f9b\u9ad8\u6027\u80fd\uff0c\u6613\u7528\u7684\u6570\u636e\u7ed3\u6784\u548c\u6570\u636e\u5206\u6790\u5de5\u5177\u3002 \u5b98\u7f51 PyDy\uff1aPyDy \u662f Python Dynamics \u7684\u7f29\u5199\uff0c\u7528\u6765\u4e3a\u52a8\u529b\u5b66\u8fd0\u52a8\u5efa\u6a21\u5de5\u4f5c\u6d41\u7a0b\u63d0\u4f9b\u5e2e\u52a9\uff0c \u57fa\u4e8e NumPy, SciPy, IPython \u548c matplotlib\u3002 \u5b98\u7f51 PyMC \uff1a\u9a6c\u5c14\u79d1\u592b\u94fe\u8499\u7279\u5361\u6d1b\u91c7\u6837\u5de5\u5177\u3002 \u5b98\u7f51 RDKit\uff1a\u5316\u5b66\u4fe1\u606f\u5b66\u548c\u673a\u5668\u5b66\u4e60\u8f6f\u4ef6\u3002 \u5b98\u7f51 SciPy \uff1a\u7531\u4e00\u4e9b\u57fa\u4e8e Python \uff0c\u7528\u4e8e\u6570\u5b66\uff0c\u79d1\u5b66\u548c\u5de5\u7a0b\u7684\u5f00\u6e90\u8f6f\u4ef6\u6784\u6210\u7684\u751f\u6001\u7cfb\u7edf\u3002 \u5b98\u7f51 statsmodels \uff1a\u7edf\u8ba1\u5efa\u6a21\u548c\u8ba1\u91cf\u7ecf\u6d4e\u5b66\u3002 \u5b98\u7f51 SymPy\uff1a\u4e00\u4e2a\u7528\u4e8e\u7b26\u53f7\u6570\u5b66\u7684 Python \u5e93\u3002 \u5b98\u7f51 zipline\uff1a\u4e00\u4e2a Python \u7b97\u6cd5\u4ea4\u6613\u5e93\u3002 \u5b98\u7f51 Bayesian-belief-networks \uff1a\u4f18\u96c5\u7684\u8d1d\u53f6\u65af\u4fe1\u5ff5\u7f51\u7edc\u6846\u67b6\u3002 \u5b98\u7f51", + "title": "\u79d1\u5b66\u8ba1\u7b97\u548c\u6570\u636e\u5206\u6790" + }, + { + "location": "/#_52", + "text": "\u8fdb\u884c\u6570\u636e\u53ef\u89c6\u5316\u7684\u5e93\u3002 \u53c2\u89c1: awesome-javascript \u3002 matplotlib\uff1a\u4e00\u4e2a Python 2D \u7ed8\u56fe\u5e93\u3002 \u5b98\u7f51 bokeh\uff1a\u7528 Python \u8fdb\u884c\u4ea4\u4e92\u5f0f web \u7ed8\u56fe\u3002 \u5b98\u7f51 ggplot\uff1aggplot2 \u7ed9 R \u63d0\u4f9b\u7684 API \u7684 Python \u7248\u672c\u3002 \u5b98\u7f51 plotly\uff1a\u534f\u540c Python \u548c matplotlib \u5de5\u4f5c\u7684 web \u7ed8\u56fe\u5e93\u3002 \u5b98\u7f51 pyecharts\uff1a\u57fa\u4e8e\u767e\u5ea6 Echarts \u7684\u6570\u636e\u53ef\u89c6\u5316\u5e93\u3002 \u5b98\u7f51 pygal\uff1a\u4e00\u4e2a Python SVG \u56fe\u8868\u521b\u5efa\u5de5\u5177\u3002 \u5b98\u7f51 pygraphviz\uff1aGraphviz \u7684 Python \u63a5\u53e3\u3002 \u5b98\u7f51 PyQtGraph\uff1a\u4ea4\u4e92\u5f0f\u5b9e\u65f6 2D/3D/ \u56fe\u50cf\u7ed8\u5236\u53ca\u79d1\u5b66/\u5de5\u7a0b\u5b66\u7ec4\u4ef6\u3002 \u5b98\u7f51 SnakeViz\uff1a\u4e00\u4e2a\u57fa\u4e8e\u6d4f\u89c8\u5668\u7684 Python's cProfile \u6a21\u5757\u8f93\u51fa\u7ed3\u679c\u67e5\u770b\u5de5\u5177\u3002 \u5b98\u7f51 vincent\uff1a\u628a Python \u8f6c\u6362\u4e3a Vega \u8bed\u6cd5\u7684\u8f6c\u6362\u5de5\u5177\u3002 \u5b98\u7f51 VisPy\uff1a\u57fa\u4e8e OpenGL \u7684\u9ad8\u6027\u80fd\u79d1\u5b66\u53ef\u89c6\u5316\u5de5\u5177\u3002 \u5b98\u7f51", + "title": "\u6570\u636e\u53ef\u89c6\u5316" + }, + { + "location": "/#_53", + "text": "\u8ba1\u7b97\u673a\u89c6\u89c9\u5e93\u3002 OpenCV\uff1a\u5f00\u6e90\u8ba1\u7b97\u673a\u89c6\u89c9\u5e93\u3002 \u5b98\u7f51 pyocr\uff1aTesseract \u548c Cuneiform \u7684\u5305\u88c5\u5e93\u3002 \u5b98\u7f51 pytesseract\uff1a Google Tesseract OCR \u7684\u53e6\u4e00\u5305\u88c5\u5e93\u3002 \u5b98\u7f51 SimpleCV \uff1a\u4e00\u4e2a\u7528\u6765\u521b\u5efa\u8ba1\u7b97\u673a\u89c6\u89c9\u5e94\u7528\u7684\u5f00\u6e90\u6846\u67b6\u3002 \u5b98\u7f51", + "title": "\u8ba1\u7b97\u673a\u89c6\u89c9" + }, + { + "location": "/#_54", + "text": "\u673a\u5668\u5b66\u4e60\u5e93\u3002 \u53c2\u89c1: awesome-machine-learning . Caffe: \u4e00\u4e2a Caffe \u7684 python \u63a5\u53e3\u3002 \u5b98\u7f51 Caffe2 \uff1a\u4e00\u4e2a\u8f7b\u91cf\u7ea7\u7684\uff0c\u6a21\u5757\u5316\u7684\uff0c\u53ef\u6269\u5c55\u7684\u6df1\u5ea6\u5b66\u4e60\u6846\u67b6\u3002 \u5b98\u7f51 Crab\uff1a\u7075\u6d3b\u3001\u5feb\u901f\u7684\u63a8\u8350\u5f15\u64ce\u3002 \u5b98\u7f51 gensim\uff1a\u4eba\u6027\u5316\u7684\u8bdd\u9898\u5efa\u6a21\u5e93\u3002 \u5b98\u7f51 hebel\uff1aGPU \u52a0\u901f\u7684\u6df1\u5ea6\u5b66\u4e60\u5e93\u3002 \u5b98\u7f51 keras : \u4ee5 tensorflow/theano/CNTK \u4e3a\u540e\u7aef\u7684\u6df1\u5ea6\u5b66\u4e60\u5c01\u88c5\u5e93\uff0c\u5feb\u901f\u4e0a\u624b\u795e\u7ecf\u7f51\u7edc\u3002 \u5b98\u7f51 MXNet \uff1a\u4e00\u4e2a\u9ad8\u6548\u548c\u7075\u6d3b\u7684\u6df1\u5ea6\u5b66\u4e60\u6846\u67b6\u3002 \u5b98\u7f51 NuPIC\uff1a\u667a\u80fd\u8ba1\u7b97 Numenta \u5e73\u53f0\u3002 \u5b98\u7f51 pattern\uff1aPython \u7f51\u7edc\u6316\u6398\u6a21\u5757\u3002 \u5b98\u7f51 PyBrain \uff1a\u53e6\u4e00\u4e2a Python \u673a\u5668\u5b66\u4e60\u5e93\u3002 \u5b98\u7f51 pydeep\uff1aPython \u6df1\u5ea6\u5b66\u4e60\u5e93\u3002 \u5b98\u7f51 Pylearn2 \uff1a\u4e00\u4e2a\u57fa\u4e8e Theano \u7684\u673a\u5668\u5b66\u4e60\u5e93\u3002 \u5b98\u7f51 python-recsys \uff1a\u4e00\u4e2a\u7528\u6765\u5b9e\u73b0\u63a8\u8350\u7cfb\u7edf\u7684 Python \u5e93\u3002 \u5b98\u7f51 Pytorch \uff1a\u4e00\u4e2a\u5177\u6709\u5f20\u91cf\u548c\u52a8\u6001\u795e\u7ecf\u7f51\u7edc\uff0c\u5e76\u6709\u5f3a\u5927 GPU \u52a0\u901f\u80fd\u529b\u7684\u6df1\u5ea6\u5b66\u4e60\u6846\u67b6\u3002 \u5b98\u7f51 scikit-learn\uff1a\u57fa\u4e8e SciPy \u6784\u5efa\u7684\u673a\u5668\u5b66\u4e60 Python \u6a21\u5757\u3002 \u5b98\u7f51 skflow\uff1a\u4e00\u4e2a TensorFlow \u7684\u7b80\u5316\u63a5\u53e3(\u6a21\u4eff scikit-learn)\u3002 \u5b98\u7f51 TensorFlow \uff1a\u8c37\u6b4c\u5f00\u6e90\u7684\u6700\u53d7\u6b22\u8fce\u7684\u6df1\u5ea6\u5b66\u4e60\u6846\u67b6\u3002 \u5b98\u7f51 Theano\uff1a\u4e00\u4e2a\u5feb\u901f\u6570\u503c\u8ba1\u7b97\u5e93\u3002 \u5b98\u7f51 vowpalporpoise\uff1a\u8f7b\u91cf\u7ea7 Vowpal Wabbit \u7684 Python \u5c01\u88c5\u3002 \u5b98\u7f51", + "title": "\u673a\u5668\u5b66\u4e60" + }, + { + "location": "/#mapreduce", + "text": "MapReduce \u6846\u67b6\u548c\u5e93\u3002 dpark \uff1aSpark \u7684 Python \u514b\u9686\u7248\uff0c\u4e00\u4e2a\u7c7b\u4f3c MapReduce \u7684\u6846\u67b6\u3002 \u5b98\u7f51 dumbo\uff1a\u8fd9\u4e2a Python \u6a21\u5757\u53ef\u4ee5\u8ba9\u4eba\u8f7b\u677e\u7684\u7f16\u5199\u548c\u8fd0\u884c Hadoop \u7a0b\u5e8f\u3002 \u5b98\u7f51 luigi\uff1a\u8fd9\u4e2a\u6a21\u5757\u5e2e\u4f60\u6784\u5efa\u6279\u5904\u7406\u4f5c\u4e1a\u7684\u590d\u6742\u6d41\u6c34\u7ebf\u3002 \u5b98\u7f51 mrjob\uff1a\u5728 Hadoop \u6216 Amazon Web Services \u4e0a\u8fd0\u884c MapReduce \u4efb\u52a1\u3002 \u5b98\u7f51 PySpark\uff1aSpark \u7684 Python API \u3002 \u5b98\u7f51 streamparse\uff1a\u8fd0\u884c\u9488\u5bf9\u4e8b\u5b9e\u6570\u636e\u6d41\u7684 Python \u4ee3\u7801\u3002\u96c6\u6210\u4e86 Apache Storm \u3002 \u5b98\u7f51", + "title": "MapReduce" + }, + { + "location": "/#_55", + "text": "\u4f7f\u7528 Python \u8fdb\u884c\u51fd\u6570\u5f0f\u7f16\u7a0b\u3002 CyToolz\uff1aToolz \u7684 Cython \u5b9e\u73b0 : \u9ad8\u6027\u80fd\u51fd\u6570\u5f0f\u5de5\u5177\u3002 \u5b98\u7f51 fn.py\uff1a\u5728 Python \u4e2d\u8fdb\u884c\u51fd\u6570\u5f0f\u7f16\u7a0b : \u5b9e\u73b0\u4e86\u4e00\u4e9b\u4eab\u53d7\u51fd\u6570\u5f0f\u7f16\u7a0b\u7f3a\u5931\u7684\u529f\u80fd\u3002 \u5b98\u7f51 funcy\uff1a\u70ab\u9177\u53c8\u5b9e\u7528\u7684\u51fd\u6570\u5f0f\u5de5\u5177\u3002 \u5b98\u7f51 Toolz\uff1a\u4e00\u7ec4\u7528\u4e8e\u8fed\u4ee3\u5668\uff0c\u51fd\u6570\u548c\u5b57\u5178\u7684\u51fd\u6570\u5f0f\u7f16\u7a0b\u5de5\u5177\u3002 \u5b98\u7f51", + "title": "\u51fd\u6570\u5f0f\u7f16\u7a0b" + }, + { + "location": "/#api", + "text": "\u7528\u6765\u8bbf\u95ee\u7b2c\u4e09\u65b9 API \u7684\u5e93\u3002 \u53c2\u89c1\uff1a List of Python API Wrappers and Libraries \u3002 apache-libcloud\uff1a\u4e00\u4e2a\u4e3a\u5404\u79cd\u4e91\u8bbe\u8ba1\u7684 Python \u5e93\u3002 \u5b98\u7f51 boto\uff1aAmazon Web Services \u7684 Python \u63a5\u53e3\u3002 \u5b98\u7f51 django-wordpress\uff1aWordPress models and views for Django. \u5b98\u7f51 facebook-sdk\uff1aFacebook \u5e73\u53f0\u7684 Python SDK. \u5b98\u7f51 facepy\uff1aFacepy \u8ba9\u548c Facebook's Graph API \u7684\u4ea4\u4e92\u53d8\u5f97\u66f4\u5bb9\u6613\u3002 \u5b98\u7f51 gmail\uff1aGmail \u7684 Python \u63a5\u53e3\u3002 \u5b98\u7f51 google-api-python-client\uff1aPython \u7528\u7684 Google APIs \u5ba2\u6237\u7aef\u5e93\u3002 \u5b98\u7f51 gspread\uff1aGoogle \u7535\u5b50\u8868\u683c\u7684 Python API. \u5b98\u7f51 twython\uff1aTwitter API \u7684\u5c01\u88c5\u3002 \u5b98\u7f51", + "title": "\u7b2c\u4e09\u65b9 API" + }, + { + "location": "/#devops", + "text": "\u7528\u4e8e DevOps \u7684\u8f6f\u4ef6\u548c\u5e93\u3002 Ansible\uff1a\u4e00\u4e2a\u975e\u5e38\u7b80\u5355\u7684 IT \u81ea\u52a8\u5316\u5e73\u53f0\u3002 \u5b98\u7f51 SaltStack\uff1a\u57fa\u7840\u8bbe\u65bd\u81ea\u52a8\u5316\u548c\u7ba1\u7406\u7cfb\u7edf\u3002 \u5b98\u7f51 OpenStack\uff1a\u7528\u4e8e\u6784\u5efa\u79c1\u6709\u548c\u516c\u6709\u4e91\u7684\u5f00\u6e90\u8f6f\u4ef6\u3002 \u5b98\u7f51 Docker Compose\uff1a\u5feb\u901f\uff0c\u5206\u79bb\u7684\u5f00\u53d1\u73af\u5883\uff0c\u4f7f\u7528 Docker\u3002 \u5b98\u7f51 Fabric\uff1a\u4e00\u4e2a\u7b80\u5355\u7684\uff0cPython \u98ce\u683c\u7684\u5de5\u5177\uff0c\u7528\u6765\u8fdb\u884c\u8fdc\u7a0b\u6267\u884c\u548c\u90e8\u7f72\u3002 \u5b98\u7f51 cuisine\uff1a\u4e3a Fabric \u63d0\u4f9b\u4e00\u7cfb\u5217\u9ad8\u7ea7\u51fd\u6570\u3002 \u5b98\u7f51 Fabtools\uff1a\u4e00\u4e2a\u7528\u6765\u7f16\u5199\u8d85\u8d5e\u7684 Fabric \u6587\u4ef6\u7684\u5de5\u5177\u3002 \u5b98\u7f51 gitapi\uff1aGit \u7684\u7eaf Python API\u3002 \u5b98\u7f51 hgapi\uff1aMercurial \u7684\u7eaf Python API\u3002 \u5b98\u7f51 honcho\uff1a Foreman \u7684 Python \u514b\u9686\u7248\uff0c\u7528\u6765\u7ba1\u7406\u57fa\u4e8e Procfile \u7684\u5e94\u7528\u3002 \u5b98\u7f51 pexpect\uff1aControlling interactive programs in a pseudo-terminal like \u5728\u4e00\u4e2a\u4f2a\u7ec8\u7aef\u4e2d\u63a7\u5236\u4ea4\u4e92\u7a0b\u5e8f\uff0c\u5c31\u50cf GNU expect \u4e00\u6837\u3002 \u5b98\u7f51 psutil\uff1a\u4e00\u4e2a\u8de8\u5e73\u53f0\u8fdb\u7a0b\u548c\u7cfb\u7edf\u5de5\u5177\u6a21\u5757\u3002 \u5b98\u7f51 supervisor\uff1aUNIX \u7684\u8fdb\u7a0b\u63a7\u5236\u7cfb\u7edf\u3002 \u5b98\u7f51", + "title": "DevOps \u5de5\u5177" + }, + { + "location": "/#_56", + "text": "\u4efb\u52a1\u8c03\u5ea6\u5e93\u3002 APScheduler\uff1a\u8f7b\u5de7\u4f46\u5f3a\u5927\u7684\u8fdb\u7a0b\u5185\u4efb\u52a1\u8c03\u5ea6\uff0c\u4f7f\u4f60\u53ef\u4ee5\u8c03\u5ea6\u51fd\u6570\u3002 \u5b98\u7f51 django-schedule\uff1a\u4e00\u4e2a Django \u6392\u7a0b\u5e94\u7528\u3002 \u5b98\u7f51 doit\uff1a\u4e00\u4e2a\u4efb\u52a1\u6267\u884c\u548c\u6784\u5efa\u5de5\u5177\u3002 \u5b98\u7f51 gunnery\uff1a\u5206\u5e03\u5f0f\u7cfb\u7edf\u4f7f\u7528\u7684\u591a\u7528\u9014\u4efb\u52a1\u6267\u884c\u5de5\u5177 \uff0c\u5177\u6709 web \u4ea4\u4e92\u754c\u9762\u3002 \u5b98\u7f51 Joblib\uff1a\u4e00\u7ec4\u4e3a Python \u63d0\u4f9b\u8f7b\u91cf\u7ea7\u4f5c\u4e1a\u6d41\u6c34\u7ebf\u7684\u5de5\u5177\u3002 \u5b98\u7f51 Plan\uff1a\u5982\u6709\u795e\u52a9\u5730\u7f16\u5199 crontab \u6587\u4ef6\u3002 \u5b98\u7f51 schedule\uff1a\u4eba\u6027\u5316\u7684 Python \u4efb\u52a1\u8c03\u5ea6\u5e93\u3002 \u5b98\u7f51 Spiff\uff1a\u4f7f\u7528\u7eaf Python \u5b9e\u73b0\u7684\u5f3a\u5927\u7684\u5de5\u4f5c\u6d41\u5f15\u64ce\u3002 \u5b98\u7f51 TaskFlow\uff1a\u4e00\u4e2a\u53ef\u4ee5\u8ba9\u4f60\u65b9\u4fbf\u6267\u884c\u4efb\u52a1\u7684 Python \u5e93\uff0c\u4e00\u81f4\u5e76\u4e14\u53ef\u9760\u3002 \u5b98\u7f51 \n*\u00a0 AirFlow\uff1aAirflow \u662fAirbnb\u516c\u53f8\u5f00\u6e90\u7684\uff0c\u662f\u4e00\u4e2a\u5de5\u4f5c\u6d41\u5206\u914d\u7ba1\u7406\u7cfb\u7edf\uff0c\u901a\u8fc7\u6709\u5411\u975e\u5faa\u73af\u56fe\u7684\u65b9\u5f0f\u7ba1\u7406\u4efb\u52a1\u6d41\u7a0b\uff0c\u8bbe\u7f6e\u4efb\u52a1\u4f9d\u8d56\u5173\u7cfb\u548c\u65f6\u95f4\u8c03\u5ea6\u3002 \u5b98\u65b9", + "title": "\u4efb\u52a1\u8c03\u5ea6" + }, + { + "location": "/#_57", + "text": "\u4f7f\u7528\u5916\u6765\u51fd\u6570\u63a5\u53e3\u7684\u5e93\u3002 cffi\uff1a\u7528\u6765\u8c03\u7528 C \u4ee3\u7801\u7684\u5916\u6765\u51fd\u6570\u63a5\u53e3\u3002 \u5b98\u7f51 ctypes \uff1a(Python \u6807\u51c6\u5e93) \u7528\u6765\u8c03\u7528 C \u4ee3\u7801\u7684\u5916\u6765\u51fd\u6570\u63a5\u53e3\u3002 \u5b98\u7f51 PyCUDA\uff1aNvidia CUDA API \u7684\u5c01\u88c5\u3002 \u5b98\u7f51 SWIG\uff1a\u7b80\u5316\u7684\u5c01\u88c5\u548c\u63a5\u53e3\u751f\u6210\u5668\u3002 \u5b98\u7f51", + "title": "\u5916\u6765\u51fd\u6570\u63a5\u53e3" + }, + { + "location": "/#_58", + "text": "\u8ba9 Python \u66f4\u5feb\u7684\u5e93\u3002 Cython\uff1a\u4f18\u5316\u7684 Python \u9759\u6001\u7f16\u8bd1\u5668\u3002\u4f7f\u7528\u7c7b\u578b\u6df7\u5408\u4f7f Python \u7f16\u8bd1\u6210 C \u6216 C++ \u6a21\u5757\u6765\u83b7\u5f97\u6027\u80fd\u7684\u6781\u5927\u63d0\u5347\u3002 \u5b98\u7f51 PeachPy\uff1a\u5d4c\u5165 Python \u7684 x86-64 \u6c47\u7f16\u5668\u3002\u53ef\u4ee5\u88ab\u7528\u4f5c Python \u5185\u8054\u7684\u6c47\u7f16\u5668\u6216\u8005\u662f\u72ec\u7acb\u7684\u6c47\u7f16\u5668\uff0c\u7528\u4e8e Windows, Linux, OS X, Native Client \u6216\u8005 Go \u3002 \u5b98\u7f51 PyPy\uff1a\u4f7f\u7528 Python \u5b9e\u73b0\u7684 Python\u3002\u89e3\u91ca\u5668\u4f7f\u7528\u9ed1\u9b54\u6cd5\u52a0\u5feb Python \u8fd0\u884c\u901f\u5ea6\u4e14\u4e0d\u9700\u8981\u52a0\u5165\u989d\u5916\u7684\u7c7b\u578b\u4fe1\u606f\u3002 \u5b98\u7f51 Pyston \uff1a\u4f7f\u7528 LLVM \u548c\u73b0\u4ee3 JIT \u6280\u672f\u6784\u5efa\u7684 Python \u5b9e\u73b0\uff0c\u76ee\u6807\u662f\u4e3a\u4e86\u83b7\u5f97\u5f88\u597d\u7684\u6027\u80fd\u3002 \u5b98\u7f51 Stackless Python\uff1a\u4e00\u4e2a\u5f3a\u5316\u7248\u7684 Python\u3002 \u5b98\u7f51", + "title": "\u9ad8\u6027\u80fd" + }, + { + "location": "/#windows", + "text": "\u5728 Windows \u5e73\u53f0\u4e0a\u8fdb\u884c Python \u7f16\u7a0b\u3002 Python(x,y)\uff1a\u9762\u5411\u79d1\u5b66\u5e94\u7528\u7684 Python \u53d1\u884c\u7248\uff0c\u57fa\u4e8e Qt \u548c Spyder\u3002 \u5b98\u7f51 pythonlibs\uff1a\u975e\u5b98\u65b9\u7684 Windows \u5e73\u53f0 Python \u6269\u5c55\u4e8c\u8fdb\u5236\u5305\u3002 \u5b98\u7f51 PythonNet\uff1aPython \u4e0e .NET \u516c\u5171\u8bed\u8a00\u8fd0\u884c\u5e93 (CLR)\u7684\u96c6\u6210\u3002 \u5b98\u7f51 PyWin32\uff1a\u9488\u5bf9 Windows \u7684 Python \u6269\u5c55\u3002 \u5b98\u7f51 WinPython\uff1aWindows 7/8 \u7cfb\u7edf\u4e0b\u4fbf\u643a\u5f0f\u5f00\u53d1\u73af\u5883\u3002 \u5b98\u7f51", + "title": "\u5fae\u8f6f\u7684 Windows \u5e73\u53f0" + }, + { + "location": "/#sdn", + "text": "\u7528\u6765\u8fdb\u884c\u7f51\u7edc\u53ef\u89c6\u5316\u548c SDN(\u8f6f\u4ef6\u5b9a\u4e49\u7f51\u7edc)\u7684\u5de5\u5177\u548c\u5e93\u3002 Mininet\uff1a\u4e00\u6b3e\u6d41\u884c\u7684\u7f51\u7edc\u6a21\u62df\u5668\u4ee5\u53ca\u7528 Python \u7f16\u5199\u7684 API\u3002 \u5b98\u7f51 POX\uff1a\u4e00\u4e2a\u9488\u5bf9\u57fa\u4e8e Python \u7684\u8f6f\u4ef6\u5b9a\u4e49\u7f51\u7edc\u5e94\u7528\uff08\u4f8b\u5982 OpenFlow SDN \u63a7\u5236\u5668\uff09\u7684\u5f00\u6e90\u5f00\u53d1\u5e73\u53f0\u3002 \u5b98\u7f51 Pyretic\uff1a\u706b\u70ed\u7684 SDN \u7f16\u7a0b\u8bed\u8a00\u4e2d\u7684\u4e00\u5458\uff0c\u4e3a\u7f51\u7edc\u4ea4\u6362\u673a\u548c\u6a21\u62df\u5668\u63d0\u4f9b\u5f3a\u5927\u7684\u62bd\u8c61\u80fd\u529b\u3002 \u5b98\u7f51 SDX Platform\uff1a\u57fa\u4e8e SDN \u7684 IXP \u5b9e\u73b0\uff0c\u5f71\u54cd\u4e86 Mininet, POX \u548c Pyretic\u3002 \u5b98\u7f51 NRU\uff1a\u4e00\u4e2a\u57fa\u4e8e\u7ec4\u4ef6\u7684\u8f6f\u4ef6\u5b9a\u4e49\u7f51\u7edc\u6846\u67b6\u3002 \u5b98\u7f51", + "title": "\u7f51\u7edc\u53ef\u89c6\u5316\u548c SDN" + }, + { + "location": "/#_59", + "text": "\u7528\u6765\u5bf9\u786c\u4ef6\u8fdb\u884c\u7f16\u7a0b\u7684\u5e93\u3002 ino\uff1a\u64cd\u4f5c Arduino \u7684\u547d\u4ee4\u884c\u5de5\u5177\u3002 \u5b98\u7f51 Pyro\uff1aPython \u673a\u5668\u4eba\u7f16\u7a0b\u5e93\u3002 \u5b98\u7f51 PyUserInput\uff1a\u8de8\u5e73\u53f0\u7684\uff0c\u63a7\u5236\u9f20\u6807\u548c\u952e\u76d8\u7684\u6a21\u5757\u3002 \u5b98\u7f51 scapy\uff1a\u4e00\u4e2a\u975e\u5e38\u68d2\u7684\u64cd\u4f5c\u6570\u636e\u5305\u7684\u5e93\u3002 \u5b98\u7f51 wifi\uff1a\u4e00\u4e2a Python \u5e93\u548c\u547d\u4ee4\u884c\u5de5\u5177\u7528\u6765\u5728 Linux \u5e73\u53f0\u4e0a\u64cd\u4f5c WiFi\u3002 \u5b98\u7f51 Pingo\uff1aPingo \u4e3a\u7c7b\u4f3c Raspberry Pi\uff0cpcDuino\uff0c Intel Galileo \u7b49\u8bbe\u5907\u63d0\u4f9b\u7edf\u4e00\u7684 API \u7528\u4ee5\u7f16\u7a0b\u3002 \u5b98\u7f51", + "title": "\u786c\u4ef6" + }, + { + "location": "/#_60", + "text": "\u5e2e\u52a9\u4ece Python 2 \u5411 Python 3 \u8fc1\u79fb\u7684\u5e93\u3002 Python-Future\uff1a\u8fd9\u5c31\u662f Python 2 \u548c Python 3 \u4e4b\u95f4\u4e22\u5931\u7684\u90a3\u4e2a\u517c\u5bb9\u6027\u5c42\u3002 \u5b98\u7f51 Python-Modernize\uff1a\u4f7f Python \u4ee3\u7801\u66f4\u52a0\u73b0\u4ee3\u5316\u4ee5\u4fbf\u6700\u7ec8\u8fc1\u79fb\u5230 Python 3\u3002 \u5b98\u7f51 Six\uff1aPython 2 \u548c 3 \u7684\u517c\u5bb9\u6027\u5de5\u5177\u3002 \u5b98\u7f51", + "title": "\u517c\u5bb9\u6027" + }, + { + "location": "/#_61", + "text": "\u4e0d\u5c5e\u4e8e\u4e0a\u9762\u4efb\u4f55\u4e00\u4e2a\u7c7b\u522b\uff0c\u4f46\u662f\u975e\u5e38\u6709\u7528\u7684\u5e93\u3002 blinker\uff1a\u4e00\u4e2a\u5feb\u901f\u7684 Python \u8fdb\u7a0b\u5185\u4fe1\u53f7/\u4e8b\u4ef6\u5206\u53d1\u7cfb\u7edf\u3002 \u5b98\u7f51 itsdangerous\uff1a\u4e00\u7cfb\u5217\u8f85\u52a9\u5de5\u5177\u7528\u6765\u5c06\u53ef\u4fe1\u7684\u6570\u636e\u4f20\u5165\u4e0d\u53ef\u4fe1\u7684\u73af\u5883\u3002 \u5b98\u7f51 pluginbase\uff1a\u4e00\u4e2a\u7b80\u5355\u4f46\u662f\u975e\u5e38\u7075\u6d3b\u7684 Python \u63d2\u4ef6\u7cfb\u7edf\u3002 \u5b98\u7f51 Pychievements\uff1a\u4e00\u4e2a\u7528\u6765\u521b\u5efa\u548c\u8ffd\u8e2a\u6210\u5c31\u7684 Python \u6846\u67b6\u3002 \u5b98\u7f51 Tryton \uff1a\u4e00\u4e2a\u901a\u7528\u5546\u52a1\u6846\u67b6\u3002 \u5b98\u7f51", + "title": "\u6742\u9879" + }, + { + "location": "/#_62", + "text": "Python \u5b9e\u73b0\u7684\u7b97\u6cd5\u548c\u8bbe\u8ba1\u6a21\u5f0f\u3002 algorithms \uff1a\u4e00\u4e2a Python \u7b97\u6cd5\u6a21\u5757\u3002 \u5b98\u7f51 python-patterns\uff1aPython \u8bbe\u8ba1\u6a21\u5f0f\u7684\u96c6\u5408\u3002 \u5b98\u7f51 sortedcontainers\uff1a\u5feb\u901f\uff0c\u7eaf Python \u5b9e\u73b0\u7684 SortedList\uff0cSortedDict \u548c SortedSet \u7c7b\u578b\u3002 \u5b98\u7f51", + "title": "\u7b97\u6cd5\u548c\u8bbe\u8ba1\u6a21\u5f0f" + }, + { + "location": "/#_63", + "text": "\u7f16\u8f91\u5668\u548c IDE \u7684\u63d2\u4ef6 Emacs Elpy\uff1aEmacs Python \u5f00\u53d1\u73af\u5883\u3002 \u5b98\u7f51 Sublime Text SublimeJEDI\uff1a\u4e00\u4e2a Sublime Text \u63d2\u4ef6\uff0c\u7528\u6765\u4f7f\u7528\u8d85\u8d5e\u7684\u81ea\u52a8\u8865\u5168\u5e93 Jedi\u3002 \u5b98\u7f51 Anaconda\uff1aAnaconda \u628a\u4f60\u7684 Sublime Text 3 \u53d8\u6210\u4e00\u4e2a\u529f\u80fd\u9f50\u5168\u7684 Python IDE\u3002 \u5b98\u7f51 Vim YouCompleteMe \uff1a\u5f15\u5165\u57fa\u4e8e Jedi \u7684 Python \u81ea\u52a8\u8865\u5168\u5f15\u64ce\u3002 \u5b98\u7f51 Jedi-vim\uff1a\u7ed1\u5b9a Vim \u548c Jedi \u81ea\u52a8\u8865\u5168\u5e93\u5bf9 Python \u8fdb\u884c\u81ea\u52a8\u8865\u5168\u3002 \u5b98\u7f51 Python-mode\uff1a\u5c06 Vim \u53d8\u6210 Python IDE \u7684\u4e00\u6b3e\u591a\u5408\u4e00\u63d2\u4ef6\u3002 \u5b98\u7f51 Visual Studio PTVS\uff1aVisual Studio \u7684 Python \u5de5\u5177\u3002 \u5b98\u7f51", + "title": "\u7f16\u8f91\u5668\u63d2\u4ef6" + }, + { + "location": "/#_64", + "text": "\u6d41\u884c\u7684 Python \u96c6\u6210\u5f00\u53d1\u73af\u5883\u3002 PyCharm\uff1a\u5546\u4e1a\u5316\u7684 Python IDE \uff0c\u7531 JetBrains \u5f00\u53d1\u3002\u4e5f\u6709\u514d\u8d39\u7684\u793e\u533a\u7248\u63d0\u4f9b\u3002 \u5b98\u7f51 LiClipse\uff1a\u57fa\u4e8e Eclipse \u7684\u514d\u8d39\u591a\u8bed\u8a00 IDE \u3002\u4f7f\u7528 PyDev \u6765\u652f\u6301 Python \u3002 \u5b98\u7f51 Spyder\uff1a\u5f00\u6e90 Python IDE\u3002 \u5b98\u7f51", + "title": "\u96c6\u6210\u5f00\u53d1\u73af\u5883" + }, + { + "location": "/#_65", + "text": "\u7528\u4e8e\u5f00\u53d1\u804a\u5929\u673a\u5668\u4eba\u7684\u5e93 Errbot\uff1a\u6700\u7b80\u5355\u548c\u6700\u6d41\u884c\u7684\u804a\u5929\u673a\u5668\u4eba\u7528\u6765\u5b9e\u73b0\u81ea\u52a8\u804a\u5929\u5de5\u5177\u3002 \u5b98\u7f51", + "title": "\u81ea\u52a8\u804a\u5929\u5de5\u5177" + }, + { + "location": "/#_66", + "text": "\u5728\u7ebf\u5de5\u5177\u548c\u7b80\u5316\u5f00\u53d1\u7684 API \u3002", + "title": "\u670d\u52a1" + }, + { + "location": "/#_67", + "text": "Tushare \uff1a\u4e00\u4e2a\u53ef\u4ee5\u63d0\u4f9b\u514d\u8d39\u80a1\u7968\u3001\u57fa\u91d1\u3001\u671f\u8d27\u3001\u6e2f\u80a1\u7b49\u91d1\u878d\u6570\u636e\u7684 Python \u5f00\u6e90\u6570\u636e\u3002 \u5b98\u7f51 Ta-Lib \uff1a\u91d1\u878d\u6570\u636e\u6280\u672f\u5206\u6790\u5e93\uff0c\u53ef\u4ee5\u4f9d\u636e\u539f\u59cb\u91d1\u878d\u6570\u636e\u8ba1\u7b97\u5404\u79cd\u6280\u672f\u6307\u6807,\u8ba1\u7b97\u6027\u80fd\u6bd4\u8f83\u4f18\u5f02\u3002 \u5b98\u7f51", + "title": "\u91d1\u878d\u6570\u636e" + }, + { + "location": "/#_68", + "text": "\u53c2\u89c1: awesome-CIandCD . Travis CI\uff1a\u4e00\u4e2a\u6d41\u884c\u7684\u5de5\u5177\uff0c\u4e3a\u4f60\u7684\u5f00\u6e90\u548c \u79c1\u4eba \u9879\u76ee\u63d0\u4f9b\u6301\u7eed\u96c6\u6210\u670d\u52a1\u3002(\u4ec5\u652f\u6301 GitHub) \u5b98\u7f51 CircleCI\uff1a\u4e00\u4e2a\u6301\u7eed\u96c6\u6210\u5de5\u5177\uff0c\u53ef\u4ee5\u975e\u5e38\u5feb\u901f\u7684\u8fdb\u884c\u5e76\u884c\u6d4b\u8bd5\u3002 (\u4ec5\u652f\u6301 GitHub) \u5b98\u7f51 Vexor CI\uff1a\u4e00\u4e2a\u4e3a\u79c1\u4eba app \u63d0\u4f9b\u6301\u7eed\u96c6\u6210\u7684\u5de5\u5177\uff0c\u652f\u6301\u6309\u5206\u949f\u4ed8\u8d39\u3002 \u5b98\u7f51 Wercker\uff1a\u57fa\u4e8e Docker \u5e73\u53f0\uff0c\u7528\u6765\u6784\u5efa\u548c\u90e8\u7f72\u5fae\u670d\u52a1\u3002 \u5b98\u7f51", + "title": "\u6301\u7eed\u96c6\u6210" + }, + { + "location": "/#_69", + "text": "Codacy\uff1a\u81ea\u52a8\u5316\u4ee3\u7801\u5ba1\u67e5\uff0c\u66f4\u52a0\u5feb\u901f\u7684\u53d1\u5e03\u9ad8\u8d28\u91cf\u4ee3\u7801\u3002\u5bf9\u4e8e\u5f00\u6e90\u9879\u76ee\u662f\u514d\u8d39\u7684\u3002 \u5b98\u7f51 QuantifiedCode\uff1a\u4e00\u4e2a\u6570\u636e\u9a71\u52a8\u3001\u81ea\u52a8\u3001\u6301\u7eed\u7684\u4ee3\u7801\u5ba1\u67e5\u5de5\u5177\u3002 \u5b98\u7f51", + "title": "\u4ee3\u7801\u8d28\u91cf" + }, + { + "location": "/#_70", + "text": "\u5728\u8fd9\u91cc\u53ef\u4ee5\u627e\u5230\u65b0\u7684 Python \u5e93\u3002", + "title": "\u8d44\u6e90" + }, + { + "location": "/#_71", + "text": "r/Python CoolGithubProjects Django Packages Full Stack Python Python 3 Wall of Superpowers Python Hackers Python ZEEF Trending Python repositories on GitHub today PyPI Ranking", + "title": "\u7f51\u7ad9" + }, + { + "location": "/#_72", + "text": "Import Python Newsletter Pycoder's Weekly Python Weekly", + "title": "\u5468\u520a" + }, + { + "location": "/#twitter", + "text": "@codetengu @getpy @planetpython @pycoders @pypi @pythontrending @PythonWeekly", + "title": "Twitter" + }, + { + "location": "/#_73", + "text": "Scipy-lecture-notes \uff1a\u5982\u4f55\u7528 Python \u6765\u505a\u5b66\u672f\uff1f \u5b98\u7f51 SScientific-python-lectures \uff1aPython \u79d1\u5b66\u8ba1\u7b97\u7684\u8d44\u6599\u3002 \u5b98\u7f51 Mario-Level-1 \uff1a\u7528 Python \u548c Pygame \u5199\u7684\u8d85\u7ea7\u9a6c\u91cc\u5965\u7b2c\u4e00\u5173\u3002 \u5b98\u7f51 Python Koans \uff1aPython \u7684\u4ea4\u4e92\u5f0f\u5b66\u4e60\u5de5\u5177\u3002 \u5b98\u7f51 Minecraft \uff1a\u7528 python \u5199\u7684 Minecraft \u6e38\u620f\u3002 \u5b98\u7f51 pycrumbs \uff1aPython \u8d44\u6e90\u5927\u5168\u3002 \u5b98\u7f51 python-patterns \uff1a\u4f7f\u7528 python \u5b9e\u73b0\u8bbe\u8ba1\u6a21\u5f0f\u3002 \u5b98\u7f51 Projects \uff1aPython \u9879\u76ee\u5927\u96c6\u5408\u3002 \u5b98\u7f51 The Hitchhiker\u2019s Guide to Python \uff1a\u65c5\u884c\u8005\u7684 Python \u5b66\u4e60\u6307\u5357\u3002 \u5b98\u7f51 Code Like a Pythonista: Idiomatic Python \uff1a\u5982\u4f55\u50cf Python \u9ad8\u624b(Pythonista)\u4e00\u6837\u7f16\u7a0b\u3002 \u5b98\u7f51", + "title": "\u5b66\u4e60\u6307\u5357" + } + ] +} \ No newline at end of file diff --git a/mkdocs_theme.yml b/mkdocs_theme.yml new file mode 100644 index 0000000..6eb76f3 --- /dev/null +++ b/mkdocs_theme.yml @@ -0,0 +1,19 @@ +# Copyright (c) 2016-2017 Martin Donath +# Permission is hereby granted, free of charge, to any person obtaining a copy +# of this software and associated documentation files (the "Software"), to +# deal in the Software without restriction, including without limitation the +# rights to use, copy, modify, merge, publish, distribute, sublicense, and/or +# sell copies of the Software, and to permit persons to whom the Software is +# furnished to do so, subject to the following conditions: +# The above copyright notice and this permission notice shall be included in +# all copies or substantial portions of the Software. +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +# FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. IN NO EVENT SHALL THE +# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +# FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS +# IN THE SOFTWARE. +# Static pages to build +static_templates: + - 404.html diff --git a/sitemap.xml b/sitemap.xml new file mode 100644 index 0000000..5c09600 --- /dev/null +++ b/sitemap.xml @@ -0,0 +1,12 @@ + + + + + + https://github.com/jobbole/awesome-python-cn// + 2018-05-30 + daily + + + + \ No newline at end of file