【问题标题】:String from input is limited?输入的字符串是有限的?
【发布时间】:2015-07-30 17:03:09
【问题描述】:

我从控制台获取用户输入,但它只接受 4096 字节 (4kb) 的输入。既然这是一个特定的数字,它是语言内置的吗/有没有办法解决它?

我正在使用的代码:

message = input("Enter Message: ")

【问题讨论】:

  • 4096 是 2 的 12 次方。2^12
  • 我的第一个问题是,您为什么希望用户在控制台输入超过 4000 个字符?
  • 我写了一个密码程序,希望能够接受大量数据。

标签: python string input


【解决方案1】:

它是语言内置的东西

不,限制不是 Python 的一部分,而是控制台 shell 的限制。

有办法解决吗?

这取决于您的操作系统。有关如何在 Linux 的控制台上输入超过 4096 个字符的信息,请参阅此答案:

Linux terminal input: reading user input from terminal truncating lines at 4095 character limit

【讨论】:

  • 对!这将无限制:stty -icanon
【解决方案2】:

4096 是2^12

如果您想要更大的输入,请考虑改为从文件中读取消息。

with open('myfile.txt', 'r') as f:
    text = f.read()

现在,text 将是一个字符串,它是文件中的所有文本。你也可以这样做:

text = text.split('\n')

现在,text 是您的文本文件中的行列表

【讨论】:

    【解决方案3】:

    您需要禁用 TTY 的规范模式,这可以使用 termios 完成。 这将允许您获得比 4096 更长的行,但您将无法使用箭头、退格等编辑行。

    import sys
    import termios
    
    def get_line(prompt=""):
      fd = sys.stdin.fileno()
      old = termios.tcgetattr(fd)
      new = termios.tcgetattr(fd)
      new[3] = new[3] & ~termios.ICANON
      try:
        termios.tcsetattr(fd, termios.TCSADRAIN, new)
        line = input(prompt)
      finally:
        termios.tcsetattr(fd, termios.TCSADRAIN, old)
      return line
    
    str = get_line('test: ')
    print('len: {}'.format(len(str)))
    print(str)
    

    和这个一样

    stty -icanon
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-01-25
      • 1970-01-01
      相关资源
      最近更新 更多