Ubuntu终端用sys.stdin.readline()输入Python多行内容报错排查
问题排查与修复方案
核心报错原因
- 代码全局作用域存在多余的预读取逻辑:在类定义前写的
print(sys.stdin.readline())会在程序启动、主逻辑执行前优先读取标准输入的第一行内容。当输入格式正确时,第一行的节点数5会被这行代码提前读走,等到TreeHeight.read()方法执行self.n = int(sys.stdin.readline())时,实际读到的是第二行的父节点列表字符串4 -1 4 1 1,将包含空格和多个数字的字符串直接转为整数必然触发ValueError。 - 前期尝试的here-string传参、test_case文件前两种内容格式本身不符合输入规范:程序要求两行独立输入,第一行单独放节点总数,第二行放父节点列表,把两行内容拼接为单行的写法,即使修复代码问题也无法正确读取。
修复步骤
- 清理多余调试代码:删除全局作用域下的
print(sys.stdin.readline())行,保留read方法内的标准读取逻辑即可,修正后的输入相关代码如下:
import sys, threading sys.setrecursionlimit(10**7) # 递归最大深度设置 threading.stack_size(2**27) # 新线程栈大小设置 class TreeHeight: def read(self): self.n = int(sys.stdin.readline()) self.parent = list(map(int, sys.stdin.readline().split())) # 调试打印可保留 print("Self.n is ",self.n) print("self.parent is ",self.parent) def compute_height(self): # 保留原有正确计算逻辑即可 pass def main(): tree = TreeHeight() tree.read() print(tree.compute_height()) threading.Thread(target=main).start()
- 准备符合格式的测试输入:
- 若用文件重定向方式,新建test_case纯文本文件,内容严格写为两行,不要加反斜杠、多余转义符:
保存后执行命令即可正常读取:5 4 -1 4 1 1python3 tree-height.py < test_case - 若用终端here-string方式传参,需要显式声明换行,不要用反斜杠转义空格拼接单行内容,正确命令为:
该写法通过bash的python3 tree-height.py <<< $'5\n4 -1 4 1 1'$'...'语法让shell正确解析\n为换行符,传入的内容和两行格式的文件完全一致。
- 若用文件重定向方式,新建test_case纯文本文件,内容严格写为两行,不要加反斜杠、多余转义符:
验证标准
代码修复、输入格式正确后,控制台会先打印Self.n is 5,再打印self.parent is [4, -1, 4, 1, 1],最终输出树高计算结果3。
内容的提问来源于stack exchange,提问作者LordCakenator
相关产品推荐
相关产品推荐

