psycopg2 的导入警告
分类:技术
最近发现如果使用最新的 2.7.4 版本的 psycopg2,import psycopg2
时会出现警告:
UserWarning: The psycopg2 wheel package will be renamed from release 2.8; in order to keep installing from binary please use "pip install psycopg2-binary" instead. For details see: http://initd.org/psycopg/docs/install.html#binary-install-from-pypi
大致就是因为老版本中自带的预编译 wheel 二进制可能会造成崩溃问题,官方决定 psycopg2 从 2.8 版本开始将不再包含预编译二进制,必须通过编译安装。为此还作出了两个调整:
- 2.7.4 ~ 2.8 之间为过渡期,使用 psycopg2 的预编译二进制时会生成警告
- 新增了 psycopg2-binary 包,除了仍旧提供预编译二进制外,与 psycopg2 完全一致(即与老版本行为一致)。
找了一下相关的讨论,感觉比较赞同这个 Issue 中的反对观点:
- 推荐 psycopg2-binary 实际上是个换汤不换药的解决方案,什么问题都没有解决;
- 虽然 psycopg2-binary 的包名没变(还是
import psycopg2
),但一些第三方库可能因此产生依赖问题; - 由于目前 Python 的包管理机制,psycopg2 和 psycopg2-binary 虽然可以共存,但删的时候会同时删掉,很滑稽。
官方在说明中推荐开发用 psycopg2-binary、生产用 psycopg2,我总觉得有些坏味道。(同时也懒 :-P)
如果对此无所谓,可以在导入时自行捕获警告。(如果是通过 SQLAlchemy 间接导入,则在 create_engine
时捕获即可。)
import warnings
with warnings.catch_warnings(record=True):
import psycopg2
个人觉得比较 Sane 的方法可能是在 pip install
时使用 --no-binary <NAME>
来跳过预编译二进制的使用。如果你和我一样用的是 Pipenv,则需要用环境变量来控制 pip 的行为:
$ PIP_NO_BINARY=psycopg2 pipenv install psycopg2
但愿官方能把 psycopg2-binary 取消掉。
以上,默默水了一篇。