Linux终端中如何读取超过4096字节的粘贴标准输入数据?
Linux终端中如何读取超过4096字节的粘贴标准输入数据?
兄弟,我太懂这种卡壳的感觉了!你碰到的这个4096字节限制,根本不是Python的问题,而是Linux终端的伪终端(PTY)输入缓冲区默认大小就是4096字节——当你粘贴大文本时,终端会自动把超过的部分截断,所以不管你用readline()还是循环read(1),都拿不到完整的数据。
给你两个靠谱的解决方向:
一、用代码直接读取所有输入(最通用,不用改终端设置)
别再纠结按行或按单个字符读取了,直接读取所有标准输入直到用户触发EOF(也就是粘贴完数据后按Ctrl+D),这样就能绕过缓冲区的限制。修改后的代码如下:
import sys binfile = "data.hex" print("请粘贴ASCII编码的十六进制数据,完成后按Ctrl+D结束输入:") # 读取所有输入直到EOF,不管终端分多少块发送 full_input = sys.stdin.read() # 去掉输入末尾可能附带的多余换行符 clean_input = full_input.strip('\n') # 将十六进制字符串转换为二进制数据 binary_data = bytes.fromhex(clean_input) with open(binfile, "wb") as fp: fp.write(binary_data) print(f"成功读取{len(clean_input)}个十六进制字符,转换为{len(binary_data)}字节并写入文件!")
这个方法的核心是sys.stdin.read()会持续监听并读取所有传入标准输入的数据,直到终端发送EOF信号,完全不受终端分块发送的影响。
二、调整终端的伪终端缓冲区大小(适合不想改代码的场景)
如果你不想修改现有代码,可以用stty命令临时调整PTY的输入缓冲区大小,比如改成16384字节(根据你的需求调整数值):
stty input 16384
执行这个命令后再运行你的Python脚本,粘贴大文本时就不会被4096字节截断了。不过要注意,这个设置是临时的,关闭当前终端窗口后就会恢复默认值。
另外要提醒你:如果粘贴的文本本身包含换行符,用readline()肯定读不全——它会在遇到第一个换行时就停止读取,所以用read()读取全部输入始终是处理大粘贴数据更稳妥的选择。
备注:内容来源于stack exchange,提问作者Bart Friederichs




