RDKit 是开源化学信息学库,BSD 许可,2006 年由 Greg Landrum 开源,如今几乎是所有 AI 制药流程的地基:你用的 DeepChem、Chemprop、Datamol、REINVENT 底下都是 RDKit 在读分子、算指纹、做标准化。学会它,等于拿到化学信息学的通用语言。
安装
pip install rdkit # 官方 wheel,最省事
conda install -c conda-forge rdkit # 需要与 conda 生态混用时
python -c "from rdkit import Chem; print(Chem.__doc__ is not None)"
纯 pip install rdkit 的 wheel 已包含编译好的 C++ 后端,不再需要历史上那套 rdkit-pypi 折腾。若要用 rdkit.Chem.Draw 出图,另需 Pillow;要在 Jupyter 里画分子,加 from rdkit.Chem.Draw import IPythonConsole。
五个最常用的能力块
| 能力 | 入口 | 典型用途 |
|---|---|---|
| 读写 | Chem.MolFromSmiles / SDMolSupplier / MolToSmiles |
SMILES、SDF、MOL2、PDB 互转 |
| 指纹 | rdFingerprintGenerator |
相似性检索、聚类、ML 特征 |
| 描述符 | Descriptors / rdMolDescriptors |
MW、LogP、TPSA、HBD/HBA |
| 子结构 | Chem.MolFromSmarts + HasSubstructMatch |
PAINS / Brenk 过滤、骨架匹配 |
| 构象 | AllChem.EmbedMultipleConfs |
对接、3D 描述符、形状比较 |
能直接跑的骨架
from rdkit import Chem
from rdkit.Chem import Descriptors, rdFingerprintGenerator, DataStructs
smis = ["CC(=O)Oc1ccccc1C(=O)O", "CN1C=NC2=C1C(=O)N(C)C(=O)N2C", "bad_smiles"]
mols = [Chem.MolFromSmiles(s) for s in smis]
mols = [m for m in mols if m is not None] # 解析失败返回 None,必须过滤
gen = rdFingerprintGenerator.GetMorganGenerator(radius=2, fpSize=2048)
fps = [gen.GetFingerprint(m) for m in mols]
print(DataStructs.TanimotoSimilarity(fps[0], fps[1]))
for m in mols:
print(Chem.MolToSmiles(m), round(Descriptors.MolWt(m), 1),
round(Descriptors.MolLogP(m), 2), round(Descriptors.TPSA(m), 1))
注意 radius=2 的 Morgan 指纹对应文献里的 ECFP4(直径 = 2×半径),这个换算几乎是新手必踩的一个坑。新代码请用 rdFingerprintGenerator,老接口 AllChem.GetMorganFingerprintAsBitVect 已被官方标记为 deprecated。
四个真实会咬人的坑
- 解析失败静默返回 None:
MolFromSmiles遇到非法 SMILES 不抛异常而是返回None,不过滤会在下游炸得莫名其妙。批量处理时先统计失败率。 - 不标准化就比不了:同一化合物的盐型、互变异构、电荷写法不同,指纹就不同。用
rdkit.Chem.MolStandardize.rdMolStandardize的Cleanup/FragmentParent/Uncharger先归一,再算相似性或喂模型。 - 构象生成带随机性:
EmbedMultipleConfs默认随机种子,同一分子两次跑出的坐标不同。做可复现实验必须显式传randomSeed=0xf00d。 - LogP 是计算值不是实测值:
Descriptors.MolLogP是 Crippen 方法的估算,与实测 LogD 常有 1 个 log 单位以上偏差,只适合排序和粗筛,不能当实验数据用。
工程化建议
- 大库处理用
MultithreadedSDMolSupplier,或把标准化写成纯函数配multiprocessing;RDKit 的 Mol 对象可以 pickle。 - 把「标准化 → 去重 → 指纹」固化成一个内部函数库并锁死 RDKit 版本号:不同版本的标准化行为有过变化,会让历史模型的特征对不上。
- 指纹入库存 bit 串或稀疏索引,不要每次重算;相似性检索量大时上 chemfp 或数据库侧的化学扩展。
上手提示
- 先过一遍官方 Getting Started 建立 Mol / Atom / Bond 的对象模型概念,再用 Cookbook 按任务查代码,比通读文档快得多;
- 把「解析 → 标准化 → 指纹 → 描述符」写成自己的一个模块,之后所有项目复用;
- 记住 ECFP4 =
radius=2,构象生成要固定随机种子,LogP 只是估算值; - RDKit 用熟,化学信息学的一半就通了——后面的框架都只是它的封装。
延伸资源
- 官方站点
rdkit.org,文档rdkit.org/docs,Cookbook 见 013《RDKit Cookbook》; - 概念背景:033《InChI 与 InChIKey》、036《Morgan Fingerprint 入门》、039《Tanimoto 相似性》;
- 更现代的封装层见 218《Datamol》、219《Molfeat》;整体工具栈见 055《化学信息学工具栈》。