前言
之前重写了视频字符画处理的代码,然后这两天又在研究命令行和网络。读了一点开源工具的代码,越来越觉得有必要针对性地学习一下一些重要的基础库。
这里呢就列个小清单,把我认为有必要学习的库写一下。(前天也写了两篇关于 Python 模块的代码,不过基本算是我的需求,不算必要。这里写的是必须要会的,不冲突。)
系统
-
用于访问一些由 Python Interpreter 维护的变量,一般都和系统、流、命令行参数之类的相关。
-
用于使用一些操作系统相关的函数。(相关:比如 os.fork 在 windows 上就用不了)
-
系统调用函数,目的在于取代 os.system 和 os.spwan* 的库,并提供更强大的功能。
pyinvoke:
3rd
是 fabric2 的本地方法调用模块,比 subprocess 更强大。
文件路径
-
该模块使用类来表示系统路径,而且是操作系统无关的。终于不需要去管 Windows 和 Linux 下分隔符的差别了。
更方便的是,路径之间的组合可以直接通过“计算”实现。 -
glob 是指 linux shell 用来匹配文件路径的一种简化正则表达式。这个库也是同样的功能,会返回匹配到的所有路径名,顺序任意。
字符串处理
-
正则,不解释
-
提供了一个 str 流对象,可读可写。API 等同于 open() 返回的流对象。类似 Java 的 StringBuffer BytesBuffer
网络库
依赖管理、环境隔离
-
环境管理和依赖管理的终极解决方案
-
依赖管理工具,
install
uninstall
list
都不会用还敢叫 Python 程序员? -
项目打包工具
Python 的依赖管理工具,曾经很混乱。不过现在算是越做越好了。更多的信息参见Python Packaging User Guide
迭代器、数据结构、高阶函数
这几个模块都和可迭代对象(列表、集合等)有关,熟悉了应该可以大大改善 Python 使用姿势。
日志
测试
-
官方测试框架,和 Junit 师出同门。缺点是繁琐。
pytest:
3rd
看到很多热门开源项目都用的 pytest,有时间得学一下。(包括 pipenv pip virtualenv 等)
mock:
3rd
使用最多的替换掉网络请求的方式,几乎所有场景下都可以用。所有网络请求和 rpc 调用等都可以用 mock.patch 来模拟返回值。
就像用Java的Mockito一样。
序列化
-
一个对数据进行 object 和 bytes 之间的转化的模块。如果你只需要使用 Python 读取这些数据,用 pickle 会是个很好的选择。
-
和 pickle 很类似,不过它做的是 object 和 json 之间的转化。
这个模块在网络开发中用得很多。
并发并行
-
多进程,由于 GIL 的存在,计算密集型工作用多线程基本没用,这时就需要这个库,或者用 C API.
另外因为多进程不共享数据,因此需要使用 Queue 或者 Pipe 通信。 -
API 和 multiprocessing 非常类似,但是要搞清楚关键区别:一个是进程一个是线程。
multiprocessing.dummy
API 完全等同于 multiprocessing, 但是它实际上是一个 threading 库的封装。(也就是说是多线程的)
那为啥要标重点呢?如果一个功能你不确定用多进程还是多线程,那就用 multiprocessing 的 API 写,然后用 dummy 的多线程和原生的多进程比较,哪个快就用哪个。这样需要改的只是一个导包语句。
异步I/O
-
一个利用协程(Coroutines)编写单线程并发程序的标准库,使用
async
和await
协程可相当于轻量级线程,几乎可以完全替换掉 Python 的多线程。虽然暂时还是雷声大雨点小,很值得一学。
其他
1. 爬虫
现在 Python 爬虫这么火,感觉也算是必备的了。
- Selenium + PhantomJS 模拟浏览器的访问行为,可以绕过许多复杂的反爬虫机制。缺点是开销大,不适合大量抓取。
- BeautifulSoup html 解析器
其他标准库
- random
- time