PAYATHON 2026

如何修改 Python 脚本,避免 Opentrons OT-2 跳过暂停步骤?

数据小许

先检查 protocol 声明的 API 版本

优先检查脚本中的 apiLevel。如果使用的是 Python Protocol API 2.13 或更早版本,连续调用 protocol.pause() 可能无法实现你期望的逐条确认。

官方文档说明,在这些旧版本中,暂停要等到下一次调用涉及机器人运动的函数时才生效。你的确认步骤集中在开头,彼此之间只有条件判断、字符串生成和变量赋值,因此建议优先核对 API 版本。原问题没有提供 apiLevel,暂时无法确定根因。Opentrons pause() API 文档

用最小协议验证连续暂停

如果机器人软件支持 API 2.14,可以先单独运行下面的诊断协议。它不包含移液操作,也不依赖原脚本中的变量或 OpentronsTiploader:

from opentrons import protocol_api

metadata = {
    "protocolName": "Sequential pause check",
    "apiLevel": "2.14",
}


def run(protocol: protocol_api.ProtocolContext):
    protocol.pause("Check 1: Confirm deck locations, then press Resume.")
    protocol.pause("Check 2: Confirm sample columns, then press Resume.")
    protocol.pause("Check 3: Confirm reservoir loading, then press Resume.")
    protocol.comment("All confirmation steps completed.")

预期行为是:第一次暂停后点击 Resume,程序进入第二次暂停;再次恢复后进入第三次暂停。目前没有实际运行结果。

请在 Opentrons App 中启动实际运行并观察暂停状态。仅凭上传时的分析或模拟,不能证明机器人会等待人工恢复。

如果这个协议能够逐条暂停,再检查原协议:

  1. 比较原协议与正常协议的 apiLevel,并核对它们使用的 App 和机器人软件版本。
  2. 如果原协议声明的是 2.13 或更早版本,在确认软件支持且完整协议兼容后,将其调整为 2.14 或更高的受支持版本。
  3. 保留原来的确认语句,重新分析并验证完整流程。API 版本调整可能影响其他命令,不能仅凭暂停测试通过就认定整个协议兼容。

已有 metadata 时,修改其中的 apiLevel,不要直接用示例字典覆盖原有元数据。

检查实际文件中的缩进

粘贴出来的代码没有显示函数体和条件分支的缩进。如果实际文件也缺少这些缩进,Python 会报缩进错误,程序无法正常运行;如果只是粘贴时丢失了格式,就不是故障原因。

实际代码应保持这样的层级:

def run(protocol: protocol_api.ProtocolContext):
    # Confirmations
    protocol.pause("Confirm deck locations.")

    if number_sample_columns > 0:
        protocol.pause(
            f"Confirm: {number_sample_columns} sample columns."
        )
    else:
        protocol.pause("Confirm: No sample columns will be added.")

    blank_start_col = number_sample_columns + 1

    # Keep the remaining confirmation steps here.
    # Variables and OpentronsTiploader must already be defined.
    OpentronsTiploader(protocol, True).load_columns(True, True, False)

这段代码只展示缩进结构,不能替代完整协议。变量和自定义类仍需依赖原文件中的定义。

如果仍然跳过,继续定位调用来源

如果在受支持的新 API 下,最小协议能够暂停而原协议不能,下一步应检查完整代码,尤其是 OpentronsTiploader 的实现,以及是否有其他代码或外部控制程序调用恢复操作。当前片段没有这些信息,不能断言自定义类导致了故障。

同时核对实际上传的文件,避免修改的是一份脚本,运行的却是另一份。记录每条暂停消息和对应的运行状态,有助于区分“消息没有明显显示”和“执行确实没有停下”。

不要用 time.sleep() 或固定时长的 protocol.delay() 替代人工确认:它们不能表达“等待用户点击 Resume”。也不要在脚本中添加自动 protocol.resume() 来处理这个问题;官方文档已将该方法标记为弃用,并说明协议没有安全的自恢复方式。Opentrons resume() API 文档

备注:内容仅供参考。