我把放行所有人的闸门换成谁都不放行的闸门,测试却看不出区别
来源:dev.to — 2026-09-28
📋 概述
在终端里跑一下 `python3 -c 'import sys; print(sys.stdin.isatty(), sys.stdout.isatty())'`,再在 script(1) 下跑一遍,结果会不一样。作者指出:用 isatty() 判断「眼前是否有人」,再从 /dev/tty 读取这个人的确认输入,这其实是两个不同的问题,而有些进程对它们给出不同答案。文章讲的是他在同一个文件里三次撞上这个坑的经历,每一次都是因为上一次的修复以测试看不出来的方式错了——他造出一个谁都进不来的闸门,测试却依然全绿。
🔑 核心要点
- 探针显示:在 script(1) 下运行时,stdin 与 stdout 都不是 TTY,但 /dev/tty 依然可以打开——两个判断在这个进程上互相矛盾。
- 更扎心的是:在真实终端里直接跑 pytest 就会触发这个矛盾,不需要任何包装器。
- 默认 pytest 捕获同时替换 stdin 与 stdout,两个 isatty() 都是 False,而确认路径从头到尾都能打开终端。
- 加 -s 参数(pytest -s)后两个判断一致,所以别指望在那里找到不一致。
- 被测试的系统是一个可以针对仓库导出版本执行三条冻结命令的智能体,策略文件默认禁止正常执行,作者在测试时临时翻转了这个开关。
💡 金句
如果用调用 isatty() 来判断有没有人在,然后从 /dev/tty 读取这个人的确认,那是两个不同的问题——而有些进程会给它们不同的答案。
👍 0
👎 0
← 返回 dev.to 首页