Python标准输入重定向至文件描述符后input()阻塞问题咨询
解决Python重定向sys.stdin后input()阻塞的问题
嘿,我之前也踩过类似的坑!咱们一步步拆解你的问题:
首先先提个基础排查点——你的代码里没写import sys吧?如果没导入sys模块,运行时会直接抛出NameError;不过你说程序陷入阻塞,应该是实际代码里加了但没贴出来,先提一嘴以防万一。
核心问题:文件格式与input()的读取逻辑不匹配
你的data.txt是一行内容:1 2 3 4 5,但input()的工作逻辑是读取一整行文本。所以第一个input()会直接把整行'1 2 3 4 5'读走,这时候你尝试转成int会报错(因为字符串里有空格);就算没报错,后面的input()会发现文件已经读到末尾,就会开始等待用户输入,自然就陷入阻塞了。
几个可行的解决方案
方案1:修改文件格式(最简单直接)
把data.txt改成三行,对应三次input()的预期:
1 2 3 4 5
这样每次input()都会读到对应的行,完全符合你的预期,不需要改代码。
方案2:直接读取文件并拆分内容(最健壮)
如果没法修改文件,那不如直接读取文件内容后手动拆分,不用折腾sys.stdin重定向:
import sys # 用with语句自动管理文件,避免资源泄漏 with open('data.txt', 'r') as fd: # 读取所有内容并按空格拆分 all_elements = fd.read().strip().split() # 按预期分配变量 a = int(all_elements[0]) b = int(all_elements[1]) c = list(map(int, all_elements[2:])) # 不需要重置sys.stdin,因为根本没修改它 print(a, b, c) # 输出:1 2 [3, 4, 5]
方案3:模拟多行输入(适配现有代码结构)
如果你的代码结构不能改,必须用input(),那可以用StringIO把单行内容包装成多行输入流:
import sys from io import StringIO with open('data.txt', 'r') as fd: content = fd.read().strip().split() # 把内容拼接成三行的字符串,模拟用户逐行输入 fake_input = f"{content[0]}\n{content[1]}\n{' '.join(content[2:])}\n" # 替换sys.stdin为模拟的输入流 sys.stdin = StringIO(fake_input) # 原代码不用改 a = int(input()) b = int(input()) c = [int(e) for e in input().strip().split()] # 重置回标准输入 sys.stdin = sys.__stdin__ print(a, b, c)
选哪个方案看你的实际需求啦,个人推荐方案2,既简单又不容易出问题~
内容的提问来源于stack exchange,提问作者Tom Lau
相关产品推荐
相关产品推荐

