You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

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

火山引擎 最新活动