4. Python 环境搭建与生物信息学库

做分子 PDB 结构验证,说白了就是跟一堆数据处理、结构解析、数值计算打交道。Python 本身不带这些功能,得靠生态里的几个核心库撑起来。

我个人习惯,只要涉及科研计算的项目,都先开一个干净的虚拟环境。你想想看,一个项目装 Biopython,另一个项目装 RDKit 的老版本,全局装来装去迟早出问题。为了避免这种糟心事,咱们还是在项目一开始就把环境搭稳。

4.1 虚拟环境:把冲突扼杀在摇篮里

Python 的虚拟环境工具不少,我常用的是 venv 和 conda。如果你只用纯 Python 包,venv 够轻量;要是涉及到 RDKit 这种带 C++ 扩展的库,conda 更省心。

小经验: 我曾在 Ubuntu 上直接用 pip install rdkit 装成功过,但换到 Windows 时踩了编译器的坑。后来我学乖了 —— 只要用 RDKit,直接上 conda,省掉半小时折腾。

创建环境很简单:

# 用 venv
python3 -m venv mol_env
source mol_env/bin/activate   # Linux/macOS
mol_env\Scripts\activate      # Windows

# 用 conda(推荐 RDKit 场景)
conda create -n mol_env python=3.9
conda activate mol_env

环境名我一般叫 mol_env 或 pdb_check,随你开心。记得 Activate 之后,终端前面会多一个 (mol_env) 前缀,看到它就知道当前在隔离环境里。

4.2 Biopython:PDB 解析的基石

Biopython 是处理生物序列和结构的元老级库。它的 Bio.PDB 模块能直接读 PDB 文件、遍历原子、计算距离。我在项目中遇到过用 Biopython 批量提取蛋白质活性位点残基的场景,几百个 PDB 文件几分钟就跑完了。

安装:

pip install biopython

验证:

python -c "from Bio.PDB import PDBParser; print('Biopython 安装成功')"

常用功能一览:

模块用途
Bio.PDB.PDBParser解析 PDB 文件为 Structure 对象
Bio.PDB.PDBIO写回 PDB 文件
Bio.PDB.ResidueDepth计算残基深度(需 MSMS 工具)
Bio.PDB.DSSP二级结构分配
Bio.SeqIO读取序列文件(FASTA 等)
注意: Biopython 对 PDB 文件格式要求比较严格。有些线上数据库的 PDB 文件会在末尾带多余空行或注释,PDBParser 可能报错。我曾经就被一个格式不规范的 PDB 文件卡了半天,后来用 Bio.PDB.PDBParser(QUIET=True) 跳过警告才解决。

4.3 MDAnalysis:分子动力学轨迹的瑞士军刀

MDAnalysis 最初是为分子动力学轨迹设计的,但它的原子选择语法和拓扑分析能力很强,做 PDB 批次处理也非常顺手。它能把 PDB 里的原子、残基、链组织成类似“宇宙-体系-片段-残基-原子”的层级结构,想选哪一层都行。

安装:

pip install MDAnalysis

快速测试:

python -c "import MDAnalysis as mda; print('MDA 版本:', mda.__version__)"

我个人喜欢它的一点是,可以用一行代码选出所有 Cα 原子:

import MDAnalysis as mda
u = mda.Universe('protein.pdb')
ca = u.select_atoms('name CA')  # 秒选所有 Cα
print(len(ca), ca.positions.shape)

对于大批量 PDB 验证,我会用 MDAnalysis.transformations 做坐标变换,比如把所有结构对齐到参考构象上。这在后面章节的 RMSD 计算里会频繁用到。

4.4 RDKit:化学信息学的强力引擎

RDKit 能干的事太多了 —— 小分子指纹、子结构匹配、构象生成、力场优化……做 PDB 相似性验证时,它最常用的是把 PDB 里的配体或者小分子提取出来,做分子对比如 Tanimoto 相似度。

安装(强烈建议用 conda):

conda install -c conda-forge rdkit

如果用 pip 安装,需要先装好 cmake、boost 等依赖,比较麻烦。我试过在 macOS 上 pip install rdkit-pypi 成功了,但 Windows 上还是乖乖用 conda 吧。

验证:

python -c "from rdkit import Chem; mol = Chem.MolFromSmiles('CCO'); print('分子:', Chem.MolToSmiles(mol))"

RDKit 做分子相似性的基本操作:

from rdkit import Chem
from rdkit.Chem import AllChem, DataStructs

mol1 = Chem.MolFromPDBFile('ligand1.pdb')
mol2 = Chem.MolFromPDBFile('ligand2.pdb')
fp1 = AllChem.GetMorganFingerprintAsBitVect(mol1, 2, nBits=2048)
fp2 = AllChem.GetMorganFingerprintAsBitVect(mol2, 2, nBits=2048)
sim = DataStructs.TanimotoSimilarity(fp1, fp2)
print(f'Tanimoto 相似度: {sim:.3f}')
关键提示: RDKit 从 PDB 文件读入分子时,实际上会尝试识别键连关系。如果 PDB 里原子编号、残基连接信息不全,生成出来的分子可能缺键或原子缺失。我遇到过几次这种情况,解决方案是先用 Chemin格式(SDF/Mol2)保存再读,或者手动补键。

4.5 其他值得关注的库

除了上面三个“主力”,做 PDB 批次验证时还会用到这些:

  • OpenBabel:格式转换王,能从 PDB 转成 SDF、MOL2、XYZ 等。安装:conda install -c openbabel openbabel
  • PyMOL:可视化与脚本批处理,可结合 pymol2 无头模式在 Python 里调用。
  • ProDy:专为蛋白质动力学设计,支持主成分分析、弹性网络模型等,适合做构象集合对比。

这些库不是每次都用,但了解它们在,项目后期遇到特定需求时不至于手忙脚乱。

4.6 本章知识体系

Python 生物信息学环境搭建结构图 虚拟环境 (venv/conda) Biopython (Bio.PDB) PDB 解析 / 序列提取 MDAnalysis 原子选择 / 轨迹分析 RDKit 分子指纹 / 相似度 OpenBabel / PyMOL / ProDy (辅助工具) 虚线表示关联关系,箭头表示安装/调用流向

4.7 快速验证脚本

环境搭好之后,我习惯跑一个“全家桶”验证脚本,确认所有库都能正常导入并做点简单操作。省得到后面写代码时才发现某个库没装好。

# check_env.py
errors = []

try:
    from Bio.PDB import PDBParser
    print("[OK] Biopython")
except ImportError as e:
    errors.append(f"Biopython: {e}")

try:
    import MDAnalysis as mda
    print("[OK] MDAnalysis")
except ImportError as e:
    errors.append(f"MDAnalysis: {e}")

try:
    from rdkit import Chem
    mol = Chem.MolFromSmiles('CCO')
    print("[OK] RDKit")
except Exception as e:
    errors.append(f"RDKit: {e}")

if errors:
    print("\n❌ 以下库有问题:")
    for e in errors:
        print("   ", e)
else:
    print("\n🎉 所有核心库就绪!")

保存为 check_env.py,然后在激活的环境里跑 python check_env.py。看到三个绿色的 OK,环境就稳了。

4.8 避坑指南

  • Biopython 版本问题:Biopython 1.78 之后对 PDB 解析做了一些修改,旧版代码里 get_list() 等接口可能报错。升级到 1.80+ 是最好的选择。
  • RDKit 与 Python 版本兼容:RDKit 通常滞后于最新的 Python 小版本。比如 Python 3.12 刚出时,RDKit 等了一个季度才发布兼容包。稳妥起见,用 Python 3.9~3.11 之间。
  • MDAnalysis 读取 PDB 顺序:MDAnalysis 默认按照原子在 PDB 文件中的顺序编号。如果文件里原子索引不连续(比如删除了某些残基),选出来的原子位置可能跟期望不符。检查时可以用 print(u.residues) 先看看残基序列。
一句话总结: 虚拟环境 + Biopython + MDAnalysis + RDKit 就是咱们这门课的主力工具组合。后面的章节全都基于这个环境。我建议你现在就把这四个库装好,跑一遍验证脚本,确认没问题再继续。