You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用RDKit预测化学反应产物?解决代码索引越界错误

解决RDKit中RunReactants返回空导致的IndexError问题

错误原因

你使用的反应SMARTS定义的是硫脲类化合物与酰氯类化合物缩合生成噻唑环的反应,但传入的反应物(四硼酸钠、卡那霉素)完全不匹配该反应的底物结构要求:

  • 四硼酸钠的结构中没有反应所需的[NH2:1][C:2](=[S:3])[NH0:4]硫脲片段
  • 卡那霉素的结构中没有反应所需的[C:5](=[O:6])[C:7][Cl:8]酰氯片段

因此rxn.RunReactants()找不到任何匹配的反应位点,返回空元组,直接取[0][0]就会触发IndexError。

解决方案

1. 使用匹配反应SMARTS的反应物

如果要测试这个噻唑生成反应,需要替换为符合结构要求的底物,示例代码如下:

from rdkit import Chem
from rdkit.Chem import AllChem

# 硫脲类反应物(含反应所需的硫脲片段)
thiourea = Chem.MolFromSmiles('NC(=S)N')
# 酰氯类反应物(含反应所需的酰氯片段)
acyl_chloride = Chem.MolFromSmiles('CC(=O)CCl')

rxn_smarts = '[NH2:1][C:2](=[S:3])[NH0:4].[C:5](=[O:6])[C:7][Cl:8]>>[N:4][c:2]1[s:3][c:5][c:7][n:1]1'
rxn = AllChem.ReactionFromSmarts(rxn_smarts)

# 先检查是否生成产物,避免索引错误
products = rxn.RunReactants((thiourea, acyl_chloride))
if products:
    product = products[0][0]
    Chem.SanitizeMol(product)
    print("产物SMILES:", Chem.MolToSmiles(product))
else:
    print("未找到匹配的反应位点,无法生成产物")

2. 针对四硼酸钠和卡那霉素的反应编写正确的SMARTS

如果你的目标是让这两个分子发生反应,需要先明确它们之间的具体反应类型(比如酯化、配位等),再编写对应的反应SMARTS。例如,若要模拟它们的配位反应,需要根据实际的成键方式定义SMARTS规则。

3. 增加空值判断

无论使用哪种反应,都建议先判断RunReactants的返回结果是否为空,避免直接索引导致的错误,这是通用的代码健壮性优化手段。

内容的提问来源于stack exchange,提问作者titan digitalsoft

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.15 20:45:30