Python 的 signal 处理与 print() 的 reentrant call 运行时错误

在前文《为何 Windows 下无法用 Ctrl+C 终止 Python 进程》中,讲解了 Python 信号处理的基本原理。当时为了撰写文章而编写了一些测试代码,在运行某例测试代码时,发生了奇怪的 reentrant call 运行时错误。代码如下:

……

为何 Windows 下无法用 Ctrl+C 终止 Python 进程

在 Windows 命令行中按下 Ctrl+C 或者 Ctrl+Break 可以结束当前正在执行的命令。通常情况下,这个方法同样适用于 Python 的控制台进程。特别地,Python 内置了一个 KeyboardInterrupt 异常专门用于捕获按下 Ctrl+C 而触发的程序退出:

……

一道初中奥数题的蒙特卡洛解法
四只鸭子在一个圆形水池中随机游动。某一时刻,四只鸭子在同一半圆内的概率是多少?

四只鸭子在一个圆形水池中随机游动。某一时刻,四只鸭子在同一半圆内的概率是多少?

这个问题必须隐含一个前提:当水池被分为两半后,任意一只鸭子,要么属于这一边,要么属于另一边,不存在同时属于两边或不属于任何一边的情况。可以把鸭子视作质点,如果鸭子正好落在分割线上,则认为此鸭子属于顺时针方向的一侧。

……

Python 的 MRO 和 C3 线性化

MRO,即 Method Resolution Order、方法解析顺序,是 Python 对象调用父类方法时的遍历顺序。由于 Python 支持多重继承,类的继承关系可视作一个有向无环图,方法解析顺序就相当于拓扑排序——将图中节点线性排列。自 Python 2.3 起,新式类通过 C3 线性化算法来计算 MRO。

之所以被称作 C3,是因为算法符合如下三个特性(Consistent with 3 properties):

……

Python 库资源收集

收集了流行的 Python 库和资源。会不定期更新

使用 Google Authenticator(谷歌身份验证器)

某些简单的业务场景需要一个管理后台,但是系统却没有复杂到需要引入一套用户体系。那么,谷歌身份验证器(Google Authenticator)可以作为管理后台的一种简单的身份认证方式。

Google Authenticator 是一款基于时间(TOTP)与哈希(HOTP)的一次性密码算法的两步验证软件令牌。其原理是通过密钥与时间或者计数器序列计算出一个六到八位的一次性密码。

其中 HOTP 算法需要服务端维护一个额外的计数器,需要客户端和服务端的计数器保持同步才能验证一致。而 TOTP 算法只要保证服务端和客户端的时间同步即可验证一致(默认时间误差窗口是30秒)。

……

Python Web 框架选型

Python Web 框架有如下几种部署方式:

  • WSGI
  • ASGI
  • 独立部署
  • CGI/FastCGI

WSGI是最常见的接口,由PEP333和PEP3333规范定义,获得了最广泛的支持。

WSGI接口的上游是HTTP Server,下游是WSGI应用,而提供WSGI服务的程序被称为WSGI容器。生产环境中常见的WSGI容器有Gunicorn、uWSGI、Apache mod_wsgi等。另外,很多框架本身也提供了WSGI容器,比如:Gevent、Tornado、Twisted。其中,Gunicorn可以通过自定义worker_class搭载其他异步框架来提高性能,比如:Gevent、Tornado、Meinheld等,且容器中运行的也不一定是标准的WSGI应用,比如Gunicorn+Sanic。

……

编译安装 Python 时发生“Missing the OpenSSL lib”错误

使用pyenv在ubuntu18上安装多个python版本。按照文档,先安装编译依赖库:

shellsudo apt-get install -y make build-essential libssl-dev zlib1g-dev libbz2-dev \
libreadline-dev libsqlite3-dev wget curl llvm libncurses5-dev libncursesw5-dev \
xz-utils tk-dev libffi-dev liblzma-dev python-openssl

使用 pyenv install -v x.x.x 命令来安装指定版本的python。在安装3.4及以下版本时会报错:

ERROR: The Python ssl extension was not compiled. Missing the OpenSSL lib?

原因是ubuntu默认安装的libssl-dev版本是1.1,旧版本的python只支持1.0版本。

……

编写兼容 python 2.7 和 3.5+ 的代码

编写新的代码最好不要再兼容 Python 2.6 及以下版本了,坑太多。兼容 2.7 就足够了。同样地,Python 3.5 及以下版本的坑也很多,Python 3 最好从 3.5 开始兼容。

……

Windows 下安装 Scrapy

Scrapy 依赖的某些组件需要编译,所以需要安装 Visual C++ Build Tools(http://landinghub.visualstudio.com/visual-cpp-build-tools)。

另外可以在这里(https://www.lfd.uci.edu/~gohlke/pythonlibs/)找到第三方编译好的扩展包。

之前在别的电脑上安装都是成功的。然而今天在某电脑上按装到 Twisted 组件时就出错了。看错误提示是 Unicode 字符转换失败报错,而且好像和命令行的字符编码有关。尝试了 cmd 和 cmder 都不行。用 chcp 命令切换 charset 也不行。最后用 cygwin64 的命令行给安装成功了。

……