diff --git a/libs/cpp.wiki b/libs/cpp.wiki index 8ad9411..723d5c9 100644 --- a/libs/cpp.wiki +++ b/libs/cpp.wiki @@ -753,6 +753,35 @@ vector v; for_each(v.begin(), v.end(), cout << boost::lambda::_1 << "\n"); +

simple_match

+ +Home:[https://github.com/jbandela/simple_match] + +这个库是为了提供类似 Rust 语言中的 match 语法。 + +(不懂 Rust 的同学,可以把 match 语法视作增强版的 switch/case) + +代码示例 + +#include +#include +using namespace simple_match; +using namespace simple_match::placeholders; + +int x = 0; +while (true) +{ + std::cin >> x; + match(x, + 1, []() { std::cout << "one\n"; }, + 2, []() { std::cout << "two\n"; }, + _x < 10, [](auto&& n) { std::cout << n << " is less than 10\n"; }, + 10 < _x < 20, [](auto&& n) { std::cout << n << " is between 10 and 20 exclusive\n"; }, + _, []() { std::cout << "NOT match\n"; } + ); +} + + == 3.4 元编程(Metaprogramming) == (不知道何为“元编程”,可以先看[https://zh.wikipedia.org/wiki/%E5%85%83%E7%BC%96%E7%A8%8B 维基百科]) @@ -1301,6 +1330,18 @@ Home:[http://wxmathplot.sourceforge.net/] 看名称就知道它是跟 wxWidgets 搭配的。效果图参见“[http://wxmathplot.sourceforge.net/screenshot.shtml 这里]” +== 6.3 文本编辑 == + +

Scintilla

+ +Home:[https://scintilla.org/] + +Links:[https://en.wikipedia.org/wiki/Scintilla_(software) Wikipedia] + +功能【超强】的文本编辑组件,支持:词法高亮、代码折叠、自动补全、动态提示......(基本上你能想到的,它都已经有了) + +不光功能齐全,还支持各种主流的操作系统平台。很多编辑器/IDE 用到它。 + ---- = 7 文本用户界面(TUI) = @@ -1388,6 +1429,57 @@ Boost 前面已经介绍过。这是 Boost 的其中一个子库,提供了“ 它的功能很丰富,但是比较重型。 +

docopt

+ +Home:[https://github.com/docopt/docopt.cpp] + +这是一个很有创意的库,提供了一种【全新】的方式来处理命令行参数。 + +你只需定义好命令行的帮助文本(usage),该库会根据 usage 文本自动分析出命令行参数的定义。 + +也就是说:用了这个库,就无需再写一大堆 parse 命令行参数的代码 :) + +代码示例 + +#include +#include + +static const char USAGE[] = +R"(Naval Fate. + + Usage: + naval_fate ship new ... + naval_fate ship move [--speed=] + naval_fate ship shoot + naval_fate mine (set|remove) [--moored | --drifting] + naval_fate (-h | --help) + naval_fate --version + + Options: + -h --help Show this screen. + --version Show version. + --speed= Speed in knots [default: 10]. + --moored Moored (anchored) mine. + --drifting Drifting mine. +)"; + +int main(int argc, const char* argv[]) +{ + std::map args + = docopt::docopt(USAGE, + { argv + 1, argv + argc }, + true, // 是否显示帮助 + "Naval Fate 2.0"); // 版本号 + + for(auto const& arg : args) + { + std::cout << arg.first << arg.second << std::endl; + } + +return 0; +} + + == 7.2 文本终端 ==

ncurses

@@ -2517,6 +2609,28 @@ Docs:[http://pocoproject.org/docs/package-Net.HTTPClient.html] POCO 前面已经介绍过。它提供了 HTTP Client 的封装类。 +

cpr

+ +Home:[https://github.com/whoshuu/cpr] + +类似 Python 的 [http://docs.python-requests.org/ Requests 库],以【优雅的语法】实现 HTTP 请求。 + +代码示例——HTTP GET + +#include + +int main() +{ + auto r = cpr::Get(cpr::Url{"https://api.github.com/repos/whoshuu/cpr/contributors"}, + cpr::Authentication{"user", "pass"}, + cpr::Parameters{{"anon", "true"}, {"key", "value"}}); + r.status_code; // 200 + r.header["content-type"]; // application/json; charset=utf-8 + r.text; // JSON text string + return 0; +} + + == 10.3 浏览器引擎 ==

WebKit

@@ -2971,6 +3085,18 @@ Home:[http://podofo.sourceforge.net/] 它既支持 PDF 文件的生成,也支持 PDF 内容的提取。它同时还提供[http://podofo.sourceforge.net/tools.html 一堆命令行的小工具],用来操作 PDF 文件。 +

Poppler

+ +Home:[https://poppler.freedesktop.org/] + +Links:[https://en.wikipedia.org/wiki/Poppler_%28software%29 Wikipedia] + +派生自 Xpdf 3.0 的开源库,用于渲染 PDF 的内容。很多开源的 PDF 阅读软件用到它。 + +在开源界,它第一个【完整】实现了 ISO 32000-1(PDF 的 ISO 标准)。 + +它内置了若干命令行工具(poppler-utils),可以用来进行 PDF 的内容提取和格式转换。 +

LibHaru

Home:[http://libharu.org/] @@ -3524,6 +3650,133 @@ BOOST_PYTHON_MODULE(hello_ext) // print(hello_ext.greet()) +

Cython

+ +Home:[http://cython.org/] + +Links:[https://en.wikipedia.org/wiki/Cython Wikipedia] + +Cython 提供了一种机制(编译器)编译 Python 代码为【原生代码】。编译后的原生代码是个 Python 的 module(扩展名是 pyd 或 so),可以在常规的 Python 环境中用 import 语句加载。如此一来,既得到了类似 C/C++ 的高性能,又保留了 Python 语法的简介性。 + +另外,它也提供了把 C/C++ 代码编译为 Python 模块的机制。 + +=== 17.2.2 整合 JavaScript 语言 === + +

V8

+ +Home:[https://github.com/v8/v8] + +Links:[https://en.wikipedia.org/wiki/Chrome_V8 Wikipedia] + +这就是大名鼎鼎的 V8 引擎,Google 公司开发,C++ 编写,被用于 Chrome 浏览器。 + +既然用于 Chrome 浏览器,显然【完整地】支持了 JS 语言的规范(ECMA-262)。 + +它既可以独立运行,也可以嵌入到 C++ 程序中。 + +代码示例——Hello world + +#include +#include +#include +#include +#include + +int main(int argc, char* argv[]) +{ + // Initialize V8. + v8::V8::InitializeICUDefaultLocation(argv[0]); + v8::V8::InitializeExternalStartupData(argv[0]); + std::unique_ptr platform = v8::platform::NewDefaultPlatform(); + v8::V8::InitializePlatform(platform.get()); + v8::V8::Initialize(); + + // Create a new Isolate and make it the current one. + v8::Isolate::CreateParams create_params; + create_params.array_buffer_allocator = v8::ArrayBuffer::Allocator::NewDefaultAllocator(); + v8::Isolate* isolate = v8::Isolate::New(create_params); + + { + v8::Isolate::Scope isolate_scope(isolate); + // Create a stack-allocated handle scope. + v8::HandleScope handle_scope(isolate); + // Create a new context. + v8::Local context = v8::Context::New(isolate); + // Enter the context for compiling and running the hello world script. + v8::Context::Scope context_scope(context); + // Create a string containing the JavaScript source code. + v8::Local source = + v8::String::NewFromUtf8(isolate, "'Hello World!'", + v8::NewStringType::kNormal).ToLocalChecked(); + // Compile the source code. + v8::Local script = v8::Script::Compile(context, source).ToLocalChecked(); + // Run the script to get the result. + v8::Local result = script->Run(context).ToLocalChecked(); + // Convert the result to an UTF8 string and print it. + v8::String::Utf8Value utf8(isolate, result); + printf("%s\n", *utf8); + } + + // Dispose the isolate and tear down V8. + isolate->Dispose(); + v8::V8::Dispose(); + v8::V8::ShutdownPlatform(); + delete create_params.array_buffer_allocator; + return 0; +} + + +

nbind

+ +Home:[https://github.com/charto/nbind] + +把 C++ 代码编译为 JS 的 package。编译方式支持“原生二进制”或“asm.js”。 + +编译需要依赖 Node.js,运行环境支持 Node.js 或浏览器。 + +代码示例——C++ 代码 + +#include +#include + +struct Greeter +{ + static void sayHello(std::string name) + { + std::cout << "Hello, " << name << "\n"; + } +}; + +// 建立绑定 +#include + +NBIND_CLASS(Greeter) +{ + method(sayHello); +} + + +代码示例——node.js 环境调用代码 + +var nbind = require("nbind"); +var lib = nbind.init().lib; +lib.Greeter.sayHello("you"); + + +代码示例——浏览器环境调用代码 + + + + + ---- = 18 (其它) = diff --git a/libs/python.wiki b/libs/python.wiki index 8e7a667..5dd27e0 100644 --- a/libs/python.wiki +++ b/libs/python.wiki @@ -322,8 +322,8 @@ if __name__ == "__main__" : 代码示例——启动命令行进程,并获取该进程的标准输出 import subprocess -output = subprocess.check_output(["dir"]) # 获取当前目录的内容 -output = subprocess.check_output(["netstat", "-an"]) # 获取当前网络链接 +output = subprocess.check_output(["dir"]) # 获取当前目录的内容 +output = subprocess.check_output(["netstat", "-an"]) # 获取当前网络链接

multiprocessing

@@ -349,6 +349,35 @@ if __name__ == "__main__" : Process(target=f, args=(lock, num)).start() +

sh

+ +Home:[https://github.com/amoffat/sh] + +这个项目可以用来取代标准库中的 subprocess;同时兼容 Python2 和 Python3。 + +使用它可以写出比 subprocess 更简洁、更优雅的代码。 + +代码示例——获取命令输出 + +from sh import ifconfig +print(ifconfig("wlan0")) + + +代码示例——命令行参数 + +from sh import curl +# 传统风格 +curl("https://program-think.blogspot.com/", "-o", "test.html", "--silent") +# 命名参数风格 +curl("https://program-think.blogspot.com/", o="test.html", silent=True) + + +代码示例——管道 + +from sh import ls, wc +print(wc(ls("/etc", "-1"), "-l")) + + == 3.4 本地进程间通信(IPC) ==

mmap

@@ -366,7 +395,7 @@ map = mmap.mmap(-1, 13) map.write("Hello, world") pid = os.fork() -if pid == 0 : # 子进程 +if pid == 0 : # 子进程 map.seek(0) print(map.readline()) map.close() @@ -378,7 +407,95 @@ if pid == 0 : # 子进程 用于进程信号处理的标准库(主要用于 Linux & UNIX 系统)。 -== 3.5 Linux & Unix 系统相关 == +== 3.5 操作硬件 == + +

keyboard

+ +Home:[https://github.com/boppreh/keyboard] + +顾名思义,这个库让你可以进行各种键盘相关的操作,包括:模拟按键、键盘钩子(hook),按键记录及重放。 + +支持复杂的组合键。纯 python 代码代码,同时支持 Windows 和 Linux。 + +代码示例 + +import keyboard + +# 模拟按键。 +keyboard.press_and_release("shift+s, space") + +# 模拟按键,并执行相应代码。 +keyboard.add_hotkey("page up, page down", lambda: keyboard.write("xxxx")) + +# 等待特定按键,然后继续执行。 +keyboard.wait("esc") + +# 记录按键,直到用户按了 ESC;然后以3倍速重放刚才记录的按键。 +recorded = keyboard.record(until="esc") +keyboard.play(recorded, speed_factor=3) + + +== 3.6 获取系统信息 == + +

sys

+ +【标准库】 + +这个模块可供访问由解释器使用或维护的变量和与解释器进行交互的函数。 + +代码示例 + +sys.argv # 命令行参数 List,第一个元素是程序本身路径 +sys.exit(0) # 退出程序,正常退出时用 0 表示退出码 +sys.version # 获取 Python 解释程序的版本信息 + + +

platform

+ +【标准库】 + +这个模块提供了很多用于获取操作系统的信息的功能。 + +代码示例 + +import platform + +platform.platform() # 获取操作系统名称及版本号,例如:"Windows-7-6.1.7601-SP1" +platform.version() # 获取操作系统版本号,例如:"6.1.7601" +platform.architecture() # 获取操作系统的架构,例如:("32bit", "WindowsPE") + + +

psutil

+ +Home:[https://github.com/giampaolo/psutil] + +psutil(Python system and process utilities)是一个跨平台的进程管理和系统工具库,可以处理”CPU、内存、磁盘、网络、用户“等信息。 + +主要用于系统资源的监控,分析,以及对进程进行一定的管理。 + +代码示例 + +import psutil + +psutil.cpu_count() # 获取 CPU 数量 +psutil.cpu_freq() # 获取 CPU 频率 + +psutil.virtual_memory() # 获取内存信息 +psutil.swap_memory() # 获取交换分区(换页文件)信息 + +psutil.disk_partitions() # 获取分区信息 +psutil.disk_usage('/') # 获取某分区的使用情况 + +psutil.users() # 获取用户信息 + +p = psutil.Process(pid) # 根据给定的 pid 获得进程对象 +p.name() # 进程名 +p.exe() # 可执行程序的全路径 +p.cwd() # 进程的当前目录 +p.cmdline() # 启动进程的命令行参数 + + +== 3.7 Linux & Unix 系统相关 ==

syslog

@@ -386,7 +503,7 @@ if pid == 0 : # 子进程 通过它可以很方便地跟 POSIX 的 syslog 服务进行交互。 -== 3.6 Windows 系统相关 == +== 3.8 Windows 系统相关 ==

PyWin32

@@ -394,7 +511,7 @@ Home:[http://python.net/crew/mhammond/win32/] 这个第三方库封装了 Windows API 及 COM API。通过它可以方便地用 Python 进行 Windows 编程(调用 COM 组件、编写 Windows 服务、等)。 -== 3.7 程序打包 == +== 3.9 程序打包 ==

PyInstaller

@@ -526,8 +643,8 @@ Links:[https://en.wikipedia.org/wiki/CherryPy Wikipedia] import cherrypy -class HelloWorld(object): - def index(self): +class HelloWorld(object) : + def index(self) : return "Hello World!" index.exposed = True @@ -552,8 +669,8 @@ urls = ( "/", "index" ) -class index: - def GET(self): +class index : + def GET(self) : return "Hello, world!" if __name__ == "__main__" : @@ -561,6 +678,35 @@ if __name__ == "__main__" : app.run() +

Flask

+ +Home:[http://flask.pocoo.org/] + +Links:[https://zh.wikipedia.org/wiki/Flask 维基百科] + +轻量级 Web 应用框架。基于 Werkzeug WSGI 工具箱和 Jinja2 模板引擎。 + +代码示例——Hello world + +from flask import Flask +app = Flask(__name__) + +app.route("/") +def hello_world() : + return “Hello World!" + +if __name__ == "__main__" : + app.run() + + +

Tornado

+ +Home:[http://www.tornadoweb.org/] + +Links:[https://zh.wikipedia.org/wiki/Tornado 维基百科] + +同样也是轻量级的 Web 框架,类似 Web.py。提供异步非阻塞 IO 的处理方式使其拥有较为出色的抗负载能力。 + == 4.4 Web前端 & JS整合 ==

Pyjamas & pyjs

@@ -603,15 +749,15 @@ import PyV8 ctxt1 = PyV8.JSContext() ctxt1.enter() -ctxt1.eval("1+2") # 对 JS 表达式求值 +ctxt1.eval("1+2") # 对 JS 表达式求值 -class Global(PyV8.JSClass) : # 定义一个兼容 JS 的类 +class Global(PyV8.JSClass) : # 定义一个兼容 JS 的类 def hello(self) : print("Hello, world") -ctxt2 = PyV8.JSContext(Global()) # 创建一个 JS 上下文,传入 Global 类的对象 +ctxt2 = PyV8.JSContext(Global()) # 创建一个 JS 上下文,传入 Global 类的对象 ctxt2.enter() -ctxt2.eval("hello()") # 调用 hello() 函数 +ctxt2.eval("hello()") # 调用 hello() 函数

PyWebKitGtk

@@ -622,16 +768,88 @@ Home:[https://github.com/jmalonzo/pywebkitgtk] PyWebKitGtk 则提供了对 WebKitGtk 的 Python 封装。 -== 4.6 (其它) == +== 4.6 WebSocket == +(关于 WebSocket 的介绍,可以参见维基百科的“[https://zh.wikipedia.org/wiki/WebSocket 这个链接]”)

pywebsocket

Home:[https://github.com/google/pywebsocket] -这是 Google 提供的 [https://zh.wikipedia.org/wiki/WebSocket WebSocket] 服务端。 +这是 Google 提供的 WebSocket【服务端】。 该项目包含一个可独立运行的 server 以及一个 Apache 扩展模块(mod_pywebsocket)。 +

AutobahnPython

+ +Home:[https://github.com/crossbario/autobahn-python] + +这是 [http://crossbar.io/autobahn Autobahn] 项目的子项目,同时提供了 WebSocket 的“服务端 & 客户端”。 + +它兼容 Python2 和 Python3,另外还兼容 PyPy 和 Jython。 + +网络方面,它可以跟“asyncio 标准库”以及“[https://en.wikipedia.org/wiki/Twisted_%28software%29 Twisted]”整合。 + +除了实现 WebSocket 协议,它还完整实现了 WAMP(Web Application Messaging Protocol)。 + +代码示例——Echo Server + +from autobahn.twisted.websocket import WebSocketServerProtocol + +class MyServerProtocol(WebSocketServerProtocol) : + def onConnect(self, request) : + print("Client connecting: {}".format(request.peer)) + + def onOpen(self) : + print("WebSocket connection open.") + + def onMessage(self, payload, isBinary) : + if isBinary : + print("Binary message received: {} bytes".format(len(payload))) + else: + print("Text message received: {}".format(payload.decode("utf8"))) + self.sendMessage(payload, isBinary) + + def onClose(self, wasClean, code, reason) : + print("WebSocket connection closed: {}".format(reason)) + + +

ws4py

+ +Home:[https://github.com/Lawouach/WebSocket-for-Python] + +此项目同时提供了 WebSocket 的“服务端 & 客户端”;并同时兼容 Python2 和 Python3。 + +其【服务端】可以跟“CherryPy、gevent、wsgiref、asyncio”整合;其【客户端】可以跟“Tornado、gevent”整合。 + +== 4.7 (其它) == + +

selenium

+ +Home:[http://www.seleniumhq.org/] + +selenium 是一个非常优秀的框架,用于爬虫和 Web 自动化测试。 + +代码示例——模拟登录 + +from selenium import webdriver + +driver = webdriver.Chrome() +driver.get("http://192.168.1.1") +driver.find_element_by_xpath('//*[@id="lgPwd"]').send_keys("123456") +driver.find_element_by_xpath('//*[@id="loginSub"]').click() +driver.quit() + + +

scrapy

+ +Home:[https://scrapy.org/] + +Links:[https://en.wikipedia.org/wiki/Scrapy Wikipedia] + +Scrapy 是一个为了爬取网站数据,提取结构性数据而编写的应用框架。 + +可以应用在包括数据挖掘,信息处理或存储历史数据等一系列的程序中。 + ---- = 5 网络 = @@ -650,7 +868,7 @@ Links:[https://en.wikipedia.org/wiki/Scapy Wikipedia] 代码示例 -# 传统的 ping 扫描(网络层) +# 传统的 ping 扫描(网络层) ans,unans = sr(IP(dst="192.168.1.1-254")/ICMP()) # 局域网内的 ARP 扫描(链路层) @@ -718,10 +936,10 @@ body = buffer.getvalue() from ftplib import FTP -ftp = FTP("ftp.debian.org") # 连接服务器(如果不指定端口号,则用默认端口号 21) -ftp.login() # 登录(如果不指定用户名和密码,则用匿名登录) -ftp.cwd("debian") # 切换到 "debian" 目录 -ftp.retrlines("LIST") # 列出当前目录的内容 +ftp = FTP("ftp.debian.org") # 连接服务器(如果不指定端口号,则用默认端口号 21) +ftp.login() # 登录(如果不指定用户名和密码,则用匿名登录) +ftp.cwd("debian") # 切换到 "debian" 目录 +ftp.retrlines("LIST") # 列出当前目录的内容 ftp.quit() @@ -736,9 +954,9 @@ Home:[https://bitbucket.org/dundeemt/pysftp] import pysftp with pysftp.Connection("hostxxx", username="userxxx", password="xxxxxx") as sftp : - with sftp.cd("public") # 服务端当前目录切换到 public - sftp.put("/my/local/filename") # 上传某个本地文件到服务端的 public 目录 - sftp.get_r("myfiles", "/local") # 递归复制某个服务端的目录到本地 + with sftp.cd("public") # 服务端当前目录切换到 public + sftp.put("/my/local/filename") # 上传某个本地文件到服务端的 public 目录 + sftp.get_r("myfiles", "/local") # 递归复制某个服务端的目录到本地 === 5.3.4 电子邮件 === @@ -761,6 +979,22 @@ with pysftp.Connection("hostxxx", username="userxxx", password="xxxxxx") as sftp 封装 POP3(Post Office Protocol v3)协议 +

yagmail

+ +Home:[https://github.com/kootenpv/yagmail] + +一个非常简单易用的用来发送邮件的第三方库。 + +代码示例 + +import yagmail + +yag = yagmail.SMTP("my_gmail_username", "my_gmail_password") +contents = ["This is the body, and here is just text http://somedomain/image.png", + "You can find an audio file attached.', '/local/path/song.mp3"] +yag.send("to@someone.com", "subject", contents) + + === 5.3.5 即时通讯 ===

jabber.py

@@ -775,6 +1009,18 @@ Home:[https://bitbucket.org/jaraco/irc] IRC 是 Internet Relay Chat 的缩写。这是用 Python 封装的第三方库。 +

pyTelegramBotAPI

+ +Home:[https://github.com/eternnoir/pyTelegramBotAPI] + +一个简单、易用的 [https://core.telegram.org/bots TelegramBot] 封装。 + +

Telethon

+ +Home:[https://github.com/LonamiWebs/Telethon] + +纯 Python3 的 [https://telegram.org/ Telegram] 客户端封装。 + === 5.3.6 远程控制 ===

telnetlib

@@ -813,6 +1059,23 @@ Home:[https://github.com/citronneur/rdpy] 纯 Python 实现的 RDP([https://en.wikipedia.org/wiki/Remote_Desktop_Protocol 微软远程桌面协议])和 VNC([https://en.wikipedia.org/wiki/Virtual_Network_Computing Virtual Network Computing])客户端,依赖于 Twisted 库 +

paramiko

+ +Home:[http://www.paramiko.org/] + +paramiko 是用 python 语言写的一个模块,遵循SSH2协议,支持以加密和认证的方式,进行远程服务器的连接。 + +除了 SSH 协议之外,paramiko 还支持SFTP。 + +代码示例 + +import paramiko + +ssh = paramiko.SSHClient() +ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy()) +ssh.connect("IP", port, "username", "password") + + === 5.3.7 (其它) ===

urlparse

@@ -1083,7 +1346,7 @@ sqlite3 从 Python 2.5 版本开始加入到标准库中。通过它,你可以 代码示例——创建一个内存数据库,建表并插入记录 import sqlite3 -conn = sqlite3.connect(":memory:") # ":memory:" 表示这是一个内存数据库 +conn = sqlite3.connect(":memory:") # ":memory:" 表示这是一个内存数据库 cursor = conn.cursor() cursor.execute("CREATE TABLE person (name text, age int)") cursor.execute("INSERT INTO stocks VALUES ('TOM',20)") @@ -1246,14 +1509,14 @@ class Person(Model) : birthday = DateField() is_relative = BooleanField() class Meta : - database = db # This model uses the "test.db". + database = db # This model uses the "test.db". class Pet(Model) : owner = ForeignKeyField(Person, related_name="pets") name = CharField() animal_type = CharField() class Meta : - database = db # This model uses the "test.db". + database = db # This model uses the "test.db". db.connect() db.create_tables([Person, Pet]) @@ -1525,6 +1788,14 @@ Home:[http://code.enthought.com/chaco/] 这是一个商业公司维护的库,主要提供2维图表。效果图在“[http://docs.enthought.com/chaco/user_manual/annotated_examples.html 这里]”。 +

Plotly

+ +Home:[https://plot.ly/] + +plotly 是现代平台的敏捷商业智能和数据科学库。 + +它作为一款开源的绘图库,可以应用于 Python、R、MATLAB、Excel、JavaScript、jupyter 等多种语言。 + ---- = 8 信息安全 = @@ -1567,6 +1838,29 @@ Home:[https://github.com/google/keyczar] 它提供了比较高层的 API, 使用者无需关心太多的细节。 +

passlib

+ +Home:[https://bitbucket.org/ecollins/passlib/] + +passlib 是一个久经考验的非常成熟的跨平台的散列函数库,它所提供的功能包括随机盐密码的生成与验证,两步验证等。 + +代码示例——验证随机盐密码 + +>>> # import the hash algorithm +>>> from passlib.hash import pbkdf2_sha256 + +>>> # generate new salt, and hash a password +>>> hash = pbkdf2_sha256.hash("toomanysecrets") +>>> hash +'$pbkdf2-sha256$29000$N2YMIWQsBWBMae09x1jrPQ$1t8iyB2A.WF/Z5JZv.lfCIhXXN33N23OSgQYThBYRfk' + +>>> # verifying the password +>>> pbkdf2_sha256.verify("toomanysecrets", hash) +True +>>> pbkdf2_sha256.verify("joshua", hash) +False + + == 8.2 访问控制 ==

oauth2client

@@ -1719,6 +2013,16 @@ Home:[http://lxml.de/] 以回调方式解析 HTML/XHTML 文件内容。 +

beautifulsoup

+ +Home:[https://www.crummy.com/software/BeautifulSoup/] + +Links:[https://zh.wikipedia.org/zh-cn/Beautiful_Soup 维基百科] + +Beautiful Soup 可以从 HTML 或 XML 文件中提取数据。 + +它是写”爬虫“的利器,通常与 requests 或 selenium 配合。 + == 9.4 PDF ==

pyfpdf

@@ -2008,7 +2312,7 @@ Links:[https://en.wikipedia.org/wiki/NumPy Wikipedia] [https://zh.wikipedia.or 代码示例 -# 以下是传统 Python 写法,冗长且速度较慢 +# 以下是传统 Python 写法,冗长且速度较慢 a = range(10000000) b = range(10000000) c = []