Python调用sys.stdin.read()读取控制台输入在Windows环境下运行卡住问题
问题原因
- 核心原因是代码中使用了
sys.stdin.read(),这个方法会持续读取标准输入流内容,直到接收到*EOF(文件结束符)*才会终止读取并返回结果,否则会一直处于等待输入的阻塞状态。 - 不同系统触发EOF的快捷键不一致:你搜索到的
Ctrl+D是Linux、macOS系统的EOF触发方式,Windows系统控制台触发EOF的规则是先按Ctrl+Z,再按下回车键,所以你按Ctrl+D没有效果,程序就会一直卡住。 - 在线判题系统不会卡住的原因是OJ运行代码时会预先把测试用例的所有输入一次性写入标准输入流,写入完成后自动发送EOF标识,
sys.stdin.read()可以直接读到完整内容,不会进入阻塞等待。
解决方法
你可以根据自己的使用场景选择任意一种方案:
方案1:使用Windows平台正确的EOF触发快捷键
本地运行输入完所有测试内容后,按下Ctrl+Z,此时控制台会显示^Z标识,再按下回车键即可触发EOF,程序就会继续运行后续逻辑。
方案2:修改输入读取逻辑,适配本地调试
如果不想每次都手动触发EOF,可以把输入读取逻辑改成按行读取,读到空行就自动停止,修改后同时兼容在线判题系统和本地调试:
import sys if __name__ == "__main__": data = [] for line in sys.stdin: # 读到空行就停止输入,也可以自定义其他结束标识 if not line.strip(): break data.extend(map(int, line.strip().split())) n, capacity = data[0:2] values = data[2:(2 * n + 2):2] weights = data[3:(2 * n + 2):2] opt_value = get_optimal_value(capacity, weights, values) print("{:.10f}".format(opt_value))
修改后本地运行时,输入完所有测试用例后多敲一个空回车,程序就会自动停止读取继续运行。
方案3:本地调试时从文件读取输入
把测试用例存为input.txt文件,运行代码时直接重定向输入流,在控制台执行命令:python 你的代码文件名.py < input.txt
该方式不需要手动触发EOF,全系统通用,需要多次调试时效率更高。
内容的提问来源于stack exchange,提问作者MSaudi
相关产品推荐
相关产品推荐

