简介:这份《pymol使用教程》汇编PDF面向结构生物学、生物信息学方向的学生与科研人员,以及刚接触分子三维可视化的初学者,帮助读者在缺少系统中文资料的情况下,快速掌握PyMOL的安装配置与日常操作。资源为单个PDF文件,压缩包约5.96MB,内容由多篇学习笔记整理汇编而成,按安装、鼠标操作、基本命令的脉络依次展开,便于按需检索与对照练习。教程从源码编译讲起,分别说明Windows下CygWin与Linux下Python、Pmw、OpenGL、libpng等依赖的安装思路,并解释External GUI与Viewer Window的界面分工、命令行与内部GUI的配合方式;随后介绍load加载pdb文件、show与hide切换cartoon、ribbon、surface等显示模式,以及旋转、缩放、平移、设定旋转中心与移动剪切平面的鼠标操作,还穿插log_open记录命令等实用技巧。目前已有475人学习,适合需要动手复现蛋白质结构图的中高级读者。
1. 结构图不是截图就完事:一份 PyMOL 使用教程真正要解决的问题
组会上把蛋白-配体结合图投到屏幕上,导师问「这个氢键多少埃」「换个角度看二聚体界面」,如果只会用鼠标拖,接下来二十分钟就是灾难。PyMOL 的价值不在能画出好看的卡通图,而在于它有一套完整的命令语言:加载哪个结构、选中哪些残基、用什么表征、视角转到哪、导出多少像素,全都能写成文字复现。网上流传的 PyMOL 使用教程往往散在博客、论坛帖和实验室祖传脚本里,把零散命令汇编成一条能走通的路径,才是这份东西真正的用处。
阅读对象有三类:刚进组、第一次打开 PyMOL 的研究生;做酶工程或分子对接、需要把结果画成图的工程师;要写方法学部分、必须让别人复现同一张图的同学。从安装固定环境开始,经过选择语法与表征,走到对齐、测量和批量出图,最后落在会话复现与数值自检这些返修时才想起的细节上。
2. PyMOL 软件安装与首次启动:先把运行环境钉死
装 PyMOL 最常见的翻车不是装不上,而是装了三份、互相打架。系统里同时存在 conda 装的、pip 装的、软件中心装的版本,脚本在新机器上跑出来的图跟本地不一样,排查半天发现是加载了不同的 Python 环境。做结构可视化这件事,第一步应该是把解释器、PyMOL 主程序和依赖库锁在同一个独立环境里,之后所有脚本都以这个环境为准。
2.1 用 conda 装 PyMOL 开源版的最小命令序列
# 建一个专用环境,避免和已有的 RDKit、OpenMM、numpy 版本互相污染 conda create -n pymol -c conda-forge pymol-open-source python=3.11 -y conda activate pymol # 无界面自检:能打印版本号说明主程序与依赖都正常 pymol -cq -d "print(cmd.get_version())"conda create里的-c conda-forge指定频道,-n pymol是环境名,-y跳过交互确认。后面的pymol -cq -d "..."是排错利器:-c表示不开图形界面,-q表示安静模式不打印启动横幅,-d后跟一条 PyMOL 命令并在执行后退出。这个组合在没有显示器的服务器上是标准用法,出图脚本最终也是靠它跑。
PyMOL 有开源版和 Schrödinger 维护的激励版两条线,命令语法、选择表达式、脚本 API 基本一致,.pml脚本可以互相搬。差别主要在光线追踪速度、部分内置工具和官方支持上。个人学习和常规出图,开源版足够;如果每天都在渲染大体系、或者要把出图流程嵌进商业项目,再考虑激励版。
| 安装途径 | 典型命令 | 适用场景 | 注意点 |
|---|---|---|---|
| conda-forge 开源版 | conda create -n pymol -c conda-forge pymol-open-source | 个人、实验室、脚本化出图 | 依赖干净,版本可回退 |
| pip 安装 | pip install pymol-open-source | 已有 venv 的 Python 项目 | 可能触发本地编译,缺编译链会失败 |
| 系统包管理器 | 发行版自带包 | 临时看一眼结构 | 版本通常偏旧,参数名可能对不上 |
| 官方激励版安装包 | 图形化安装 | 高频渲染、需要支持 | 授权与版本管理要和团队对齐 |
2.2 首次启动就该改掉的 .pymolrc 参数
PyMOL 启动时会自动读取用户主目录下的.pymolrc或.pymolrc.py。把常用设置写进去,比每次开图手动敲一遍靠谱得多。习惯用 Python 写配置的话,直接建.pymolrc.py:
# ~/.pymolrc.py PyMOL 启动时自动执行 from pymol import cmd cmd.set("bg_color", "white") # 白底,直接丢进 Word 或 PPT 不刺眼 cmd.set("ray_opaque_background", 0) # 光线追踪导出 PNG 时保留透明背景 cmd.set("ray_shadows", 0) # 关阴影,小图不会发灰 cmd.set("antialias", 2) # 抗锯齿等级,2 是速度和质量的平衡点 cmd.set("cartoon_fancy_helices", 1) # 螺旋画得更立体,出版级图常用 cmd.set("auto_zoom", 0) # 加载结构后不自动缩放,便于统一视角 cmd.set("valence", 1) # 显示芳香环内双键 cmd.set("mouse_selection_mode", 0) # 防止误点留下粉红色选择点每条cmd.set改的是一个全局参数。bg_color接受颜色名或 RGB 列表;ray_opaque_background设成 0 时导出图背景透明,方便后期在 Illustrator 里叠标注;auto_zoom关掉后,加载新对象不会把镜头拉跑,做多张同视角对比图时这点很关键。
改完必须重启 PyMOL 才生效。想确认配置到底有没有被读到,启动后在命令行敲一句print(cmd.get("bg_color")),返回white说明 rc 文件生效,返回默认的黑色说明文件位置放错了——常见原因是把文件放进了项目目录而不是主目录。
2.3 装完打不开?三类报错的处理顺序
第一类是图形库缺失,Linux 上典型报错是ImportError: libGL.so.1: cannot open shared object file,解决办法是补系统级 OpenGL 运行库,而不是反复重装 PyMOL。服务器上没有图形环境时,直接改用pymol -cq跑脚本,不要试图强开窗口。
第二类是环境冲突,表现为窗口一闪而过、或者import numpy报二进制不兼容。用conda list | grep numpy看一眼是否混进了 pip 装的版本,有的话先把 pip 版本卸干净再重装。判断依据是报错里出现mkl、openblas、ABI这类词。
第三类是路径问题,结构文件放在带空格或中文的目录里,load会静默失败或提示找不到文件。稳妥做法是把工作目录切到纯英文路径,脚本里用绝对路径引用结构文件。排查顺序建议固定为:先确认命令能跑起来,再确认文件能读到,最后才怀疑参数。
3. 选择语法与表征:PyMOL 的主战场在命令行
鼠标能干的活命令行都能干,反过来不成立。PyMOL 的选择表达式(selection algebra)是整套工具里信息密度最高的部分,它把「哪些原子」这件事形式化成可组合、可复用的字符串。掌握了它,配体口袋、界面残基、柔性区这些概念就不需要靠肉眼一个个点,而是写成一行条件,随时能重新算一遍。
3.1 加载 PDB 与对象管理的最小工作流
pymol -cq <<'EOF' fetch 1ubq, async=0 # 从 PDB 拉取结构,async=0 表示等下载完成再往下走 hide everything # 清掉默认的 lines 表征 show cartoon, 1ubq # 只显示卡通模型 color grey80, 1ubq orient # 调整视角,让结构占满画布 png 1ubq_overview.png, 1200, 900, dpi=150, ray=1 EOFfetch后面跟 PDB 的 4 位编号,async=0在脚本里必须加,否则下一步会在结构还没到的时候先执行。本地文件用load 4hhb.cif, hb,第二个参数是对象名,起个短名字后面写选择表达式会舒服很多。orient和zoom的区别在于前者会考虑结构的整体走向自动摆正,后者只是把相机推近推远。
一个容易忽略的点是生物组装体。PDB 文件里存的往往是不对称单元,直接加载看到的「二聚体界面」很可能只是晶体学对称伙伴。要在加载前加一句set assembly, "1",PyMOL 会按文件里的 BIOMOLECULE 记录生成真正的组装体。做界面分析前先确认这一点,否则后面所有距离和面积都是错的。
3.2 从 resi 到 byres within:选择表达式的组合写法
# 结合口袋:配体 5 埃范围内、且属于聚合物链的残基,按整残基保留 select pocket, byres (polymer within 5 of resn ATP) # 主链原子,用于结构叠合 select bb, name C+N+CA+O # 某个具体位点,带侧链 select mut, chain A and resi 45 # 界面残基:A 链上与 B 链相距 4 埃以内的残基 select iface, byres (chain A within 4 of chain B) # 高 B 因子区域,通常对应柔性loop select flexible, polymer and b > 60 # 排除水分子的聚合物 select apolymer, polymer and not resn HOH这段里的byres是关键:within选出来的是原子,byres把它扩展成完整的残基,不然你会得到半个侧链。polymer、solvent、backbone、sidechain都是内置宏,等价于写全not (resn HOH+HOH...)之类的长表达式。b > 60里的b指的是温度因子列,读的是结构文件里那一列数字。
选择表达式支持逻辑运算and、or、not,也支持括号嵌套,写复杂条件时要靠括号明确优先级。单个原子还能用斜杠表达式定位,格式是/对象名//链/残基号/原子名,例如/1a//A/45/CA。想验证一个选择集选到了什么,用count_atoms pocket看原子数,比盯着屏幕数快得多。
| 关键词 | 含义 | 典型写法 |
|---|---|---|
resi | 残基编号 | resi 45-60 |
resn | 残基名称 | resn ATP |
name | 原子名 | name CA |
elem | 元素 | elem Zn |
chain | 链标识 | chain A+B |
within | 距离范围 | within 4 of resn ATP |
byres | 扩展为整残基 | byres (chain A within 4 of chain B) |
neighbor | 共价相连 | neighbor name CA |
b | 温度因子 | b > 60 |
not | 取反 | polymer and not resn HOH |
3.3 cartoon、sticks、surface 的参数怎么配
表征决定图能不能说明问题。同一套坐标,换成 surface 之后结合口袋的形貌才看得出来;换成 sticks 之后氢键和盐桥的位置才说得清。
hide everything show cartoon, polymer set cartoon_transparency, 0.6, polymer # 卡通模型半透明,露出内部配体 show sticks, byres (polymer within 4 of resn ATP) show spheres, resn ATP set sphere_scale, 0.3 # 球太大挡视线,缩到 0.3 倍 show surface, polymer set surface_quality, 1 # 提升网格密度,0 最快最粗糙 set transparency, 0.3 set solvent_radius, 1.4 # 探针半径,常规 SASA 计算用 1.4 埃cartoon_transparency取值 0 到 1,越大越透;surface_quality从 0 往上调,渲染时间几乎是线性增长,做初稿时保持 0 或 1,定稿再往上加。solvent_radius影响表面积计算结果,跟文献对比数值时要用同一个探针半径,这是很多人算出来对不上的原因。
提示:surface 和 cartoon 同时显示会严重拖慢旋转帧率。定视角的时候先
hide surface,确认好角度再打开。
3.4 配色:按链分色、彩虹渐变与只染碳原子
util.cbc("1ubq", 1) # 按链分色,同一个对象内各条链自动分配颜色 util.cbaw("1ubq") # 按元素分色,碳灰、氮蓝、氧红 spectrum count, rainbow, polymer # 按残基序号做彩虹渐变,看 N 端到 C 端的走向 color red, resi 45 and elem C # 只染碳原子,杂原子保持原色 set_color myblue, [0.20, 0.40, 0.80] # 自定义颜色 color myblue, chain Autil.cbc和util.cbaw属于 PyMOL 内置的 Python 工具函数,直接在命令行当命令用即可。做突出显示时会踩的一个坑:color red, resi 45会把该残基的氮氧也一起染红,结构信息就没了。稳妥写法是加and elem C,只改碳骨架颜色,杂原子保留元素配色。
颜色名可以直接用grey80、palegreen、slate、tv_red这类内置色,数值越大灰度越浅。自定义颜色用set_color加 0 到 1 之间的三个浮点数,调完记得color一次才生效。
4. 把教程汇编成脚本:对齐、测量与批量出图
一篇 PyMOL 使用教程里最容易被跳过的,往往是「怎么一次做十张图」这一段。手工调十次视角,配色和留白一定不一致,审稿意见一来就要全部重做。真正省时间的做法是把对齐、测量、渲染写成脚本,用pymol -cq script.py一条命令跑完,改参数就是改一行。
4.1 align、super、cealign 三种叠合方式的选择依据
# 以 1b 为参考把 1a 叠上去,只用 CA 原子,cycles=0 表示不做迭代优化 res = cmd.align("1a and name CA", "1b and name CA", cycles=0) print("align 返回:", res)不同版本align的返回值可能是列表也可能是浮点数,写脚本前先print一次确认,取 RMSD 时用res[0]或直接取res,别凭记忆写。
| 命令 | 依据 | 适用情况 | 代价 |
|---|---|---|---|
align | 序列对齐 + 结构叠合,带离群点剔除 | 同源蛋白、突变体与野生型 | 序列差异大时可能对不齐 |
super | 纯结构叠合,不考虑序列 | 序列相似度低但折叠相同 | 容易把不相关的结构硬套上 |
cealign | CE 算法,组合扩展 | 低相似度、结构比对 | 计算慢,大体系要等 |
transform=0是个实用参数,加上它只计算 RMSD 而不真的移动坐标,适合做「两套坐标有多接近」的判断。叠合前记得把选择集限定在主链或 CA 上,用全原子叠合会被侧链构象差异带偏,RMSD 明显偏高。
4.2 距离、角度、二面角的测量与标签排版
# 测量并拿到数值:cmd.distance 返回浮点距离 d = cmd.distance("d1", "/1a//A/45/CA", "/1b//B/120/CA") # 角度与二面角 cmd.angle("a1", "/1a//A/10/CA", "/1a//A/11/CA", "/1a//A/12/CA") cmd.dihedral("t1", "/1a//A/10/CA", "/1a//A/11/CA", "/1a//A/12/CA", "/1a//A/13/CA") # 虚线样式与标签 cmd.set("dash_width", 3) # 虚线粗细 cmd.set("dash_gap", 0.4) # 虚线间隔 cmd.set("label_size", 18) cmd.label("d1", "%.2f A" % d) print("距离 = %.2f A" % d)cmd.distance的第一个参数是测量对象的名称,后面两个是原子定位串;返回的距离数值可以直接格式化进标签,避免事后手动敲数字敲错。angle需要三个原子,dihedral需要四个,顺序不同算出来的角不同,写脚本时按「从参考原子出发」的固定顺序排。
标签里建议先用A代替埃字号,等确认导出没问题再换回带音标的写法——某些构建版配字体缺失时,音标会渲染成方框,出图前放大检查一遍比返工便宜。
注意:测量对象是独立于结构的对象,删结构时不会自动消失,
delete d1要显式写。批量出图时忘了清,上一张图的虚线会串到下一张。
4.3 一次生成一组统一视角的图
# batch_figures.py —— 用 pymol -cq batch_figures.py 运行 from pymol import cmd cmd.set("ray_shadows", 0) cmd.set("ray_opaque_background", 0) cmd.set("antialias", 2) targets = {"1ubq": "A", "4hhb": "A", "1crn": "A"} for pdb, chain in targets.items(): cmd.reinitialize() # 清空上一轮的对象、选择集和参数 cmd.fetch(pdb, async=0) cmd.remove("solvent") # 去掉水,减小渲染负担 cmd.hide("everything") cmd.show("cartoon", "polymer") cmd.color("grey80", "polymer") cmd.orient("chain %s" % chain) cmd.zoom("chain %s" % chain, 3) # 3 埃缓冲,保证每张图留白一致 cmd.png("%s_cartoon.png" % pdb, 1600, 1200, dpi=300, ray=1)循环里最关键的一句是reinitialize。它把对象、选择集、视角和临时参数全部复位,这样每轮循环的起点完全相同,出图才具备可比性。cmd.zoom(选择集, buffer)的第二个参数是向外扩展的空间距离,固定成 3 埃之后,不同大小的结构在画布里的留白比例一致,拼版的时候不用再对齐。
cmd.png的参数顺序是文件名、宽、高,dpi只影响文件里记录的打印分辨率,ray=1才会触发光线追踪。像素尺寸决定细节量,1600×1200 是投稿图的常用起点。
4.4 光线追踪参数与渲染耗时的权衡
光线追踪是出图阶段唯一真正慢的环节,参数调错会出现「跑了一小时内存报错」。
| 参数 | 建议值 | 作用与代价 |
|---|---|---|
ray_shadows | 0 | 关闭阴影,小图更干净,速度明显提升 |
antialias | 2 | 抗锯齿,0 最快,2 兼顾质量 |
hash_max | 100–300 | 大体系内存吃紧时调低,能避免崩溃 |
ray_trace_mode | 0 / 1 | 0 为常规渲染,1 为卡通描边风格 |
ray_trace_color | black | 配合描边模式设定线条颜色 |
surface_quality | 1 | 表面积网格密度,配合渲染时间同步调 |
内存不够时优先降hash_max,它控制渲染时哈希网格的精度,从默认值往下调通常能救回一次崩溃;如果只是嫌慢,先关阴影再降抗锯齿,最后才动分辨率。
5. 出图之后:会话复现、数值自检与返修时改什么
图交出去不等于工作结束。三个月后审稿意见回来,要求「把第 3 张图的视角再往右转 15 度,配体换成 sticks」——如果当时只存了 PNG,这一张图就得从头再做。可复现的工作流必须同时保存两样东西:能立刻回到现场的快照,和能被人读懂、进版本控制的脚本。
5.1 .pse 快照与 .pml 脚本的双轨保存
# 会话文件:连同对象、选择集、视角、参数一起存下,打开即回到现场 save scene_v3.pse # 脚本文件:纯命令流,体积小,可以进 git,别人能逐行读懂 save scene_v3.pml # 只导出当前视角矩阵,方便在别的会话里精确复用同一个角度 get_view scene_v3_view.txt.pse的好处是完整,缺点是体积大、跨版本偶尔读不回来;.pml反过来,它记录的是生成这张图的命令序列,缺点是不含坐标数据本身,需要配合原始 PDB。我的习惯是每次到关键节点就两个都存一遍,.pse留给自己,.pml交给合作者。get_view导出的是一串数字矩阵,用set_view可以在完全不同的会话里精确复现同一个镜头,写方法学部分或者做补充材料时特别有用。
提示:
.pml脚本里避免出现绝对路径。结构文件用相对路径或fetch,别人拿到脚本才能直接跑。
5.2 用 get_area、get_distance 和 iterate 做数值自检
视觉判断容易被视角骗,数值不会。
# 聚合物与复合物表面积,差值近似为界面埋藏面积 sasa_poly = cmd.get_area("polymer") sasa_all = cmd.get_area("all") print("SASA polymer = %.1f, all = %.1f" % (sasa_poly, sasa_all)) # 统计某个选择集的平均 B 因子:iterate 里必须用 stored. 前缀写入外部变量 stored.bs = [] cmd.iterate("polymer and name CA", "stored.bs.append(b)") if len(stored.bs): print("mean B = %.2f" % (sum(stored.bs) / len(stored.bs)))get_area返回的是平方埃为单位的面积数值,配合不同的选择集就能算出界面埋藏面积,比目测「接触面大不大」靠谱。iterate里有一个必须记住的规则:要写到命令外部可见的变量,名字前面得加stored.,直接写bs.append(b)变量会在表达式求值后消失。想统计的是特定状态而不是当前状态时,把iterate换成iterate_state。
5.3 返修阶段最常见的三个坑
第一,生物组装体没打开。审稿人说「你标的这个界面对不上」,十有八九是当初加载的是不对称单元。加载前加set assembly, "1",或者从 PDB 页面确认 BIOMOLECULE 记录再决定。
第二,选择集没有随对象更新。删掉或替换了结构对象之后,旧选择集的原子范围会失效但名称还在,后面count_atoms、get_area算出来的数全是错的。脚本里养成习惯,操作完对象立刻delete掉相关选择集,或者干脆用reinitialize从头来。
第三,加氢改变了距离。测氢键前用h_add补氢,补完之后原本按重原子算的距离会变,两个数值混在一张表里就会自相矛盾。要么全程只报重原子距离并注明,要么补氢后重新跑一遍所有测量,别把两种口径的数据拼在一起。
最后一条经验:把出图脚本和.pml一起放进项目仓库,和图文件同级目录。半年后有人问「这张图参数是多少」,答案就在旁边那个文件里,不需要靠回忆重建现场的每一句命令。
本文还有配套的精品资源,点击获取