Skip to main content
lager python 脚本运行到一半时暂停它,检查实验台,然后从脚本停下的地方继续。您可以用临时的 lager 命令检查,也可以用实时的 Python 提示符检查。当一个长时间的测试走到已知的问题点时,这很有用;当您必须检查一台处于未知状态的设备、又不想中止并重新运行时,它同样有用。 lager 0.21.0 起提供。

导入

pause(label=None, *, timeout=None, interactive=False)

在调用处阻塞脚本,直到它被恢复(或超时)。
执行到这一行时,脚本会打印一个横幅并停下:
pause() 无法暂停时,它是一个安全的空操作 —— 即脚本不是在 lager python 下运行(没有断点上下文),或者断点被禁用时。它永远不会抛出异常。

恢复运行

被暂停的脚本可以用三种方式恢复:
  1. 按回车键,在运行该脚本的终端中(前台的 lager python 会话)。
  2. lager python --continue <id> --box <box> —— 可以在任意终端、任意位置执行。请使用横幅中的 id。脚本已分离,或者您已经在另一个终端里时,这很方便。
  3. 自动恢复 —— 超时(默认 300 秒)之后脚本自行继续,并记录它这样做了。这样,无人值守或被遗忘的断点就不会把整个运行挂住。

控制自动恢复的超时时间

默认是 300 秒。您可以按断点、按运行来覆盖它,也可以完全禁用:
解析顺序是 timeout= 参数 → LAGER_BREAKPOINT_TIMEOUT 环境变量 → 300 秒默认值,因此脚本中显式写出的 timeout= 优先于环境变量。
lager python --timeout 是另一项设置。它是脚本的总运行时间上限,Box 把它限制在 300 秒以内。无论脚本是否处于暂停状态,它到时都会终止整个运行。使用较长的断点暂停时,请让它保持默认值(0,不限时)。

交互式控制台

使用 pause(interactive=True) 时,断点还会打开一个运行在被暂停脚本进程内部的 Python 控制台,并预置暂停时处于作用域中的变量:
从另一个终端连接到它:
您可以读取任何变量、求值表达式,并调用脚本定义的函数。 Ctrl+D 断开连接(脚本仍然保持暂停)。
该控制台用于检查。它操作的是脚本命名空间的一个快照。您在控制台中所做的更改不会在脚本恢复时带回脚本中。

暂停期间检查硬件

由于被暂停的脚本不持有 Box 级别的锁,您可以在它等待期间,从另一个终端对实验台运行普通的 lager 命令:
有两条硬件规则需要记住,它们都源于 USB 仪器同一时刻只允许一个占用者:
  • 脚本自己已打开的设备,由被暂停的进程占用。 从第二个终端读取它会返回 “device busy / claimed by another process” 错误。请改用 --console 读取 —— 它运行在同一进程中,共享已打开的句柄。
  • 每个进程、每台物理仪器只能有一个 Net。 同一台仪器上的两个 Net 不能在一个脚本中同时打开。例如同一台 Rigol DP821 的两个通道 supply2/supply3,以及双角色的 Keithley 2281S 的 supply1/battery1。请从不同的终端读取,或者一次读一个。

内置的 breakpoint()

lager python 脚本中调用 Python 内置的 breakpoint(),会触发与 lager.pause() 相同的交互式暂停:

禁用断点

LAGER_BREAKPOINTS 设为表示关闭的值。此后每个 pause()breakpoint() 调用都会变成空操作,这样一个仍然包含断点的脚本就能干净地非交互运行:
接受 off0falseno(不区分大小写)。

完整示例

test.py
运行它(终端 1):
在它暂停期间,检查实验台(终端 2):
在终端 1 中按回车(或运行 lager python --continue 7f3a…e9 --box mybox),脚本随即完成: