可以在Python输入上显示编辑的默认值吗?

kir*_*eis 59 python input

python是否可以接受这样的输入:

Folder name: Download

但是,用户不是键入"下载",而是将其作为初始值.如果用户想要将其编辑为"下载",他只需要添加's'并按Enter键.

使用正常输入命令:

folder=input('Folder name: ')
Run Code Online (Sandbox Code Playgroud)

我能得到的只是一个空白提示:

Folder name:

有没有一种简单的方法可以做到这一点,我错过了?

sth*_*sth 65

标准库函数input()raw_input()不具备此功能.如果您使用的是Linux,则可以使用该readline模块定义使用预填充值和高级线编辑的输入函数:

import readline

def rlinput(prompt, prefill=''):
   readline.set_startup_hook(lambda: readline.insert_text(prefill))
   try:
      return input(prompt)  # or raw_input in Python 2
   finally:
      readline.set_startup_hook()
Run Code Online (Sandbox Code Playgroud)

  • 在Windows中,我们不应该信任:( (4认同)
  • 它也可以在Mac OS X上运行.[readline](http://pypi.python.org/pypi/readline)或[pyreadline](http://pypi.python.org/pypi/pyreadline)可能是单独安装. (3认同)

rlo*_*tun 18

我假设你是从命令行的意思.我从未见过命令行提示的初始值,它们通常是以下形式:

     Folder [default] : 
Run Code Online (Sandbox Code Playgroud)

在代码中简单地说:

     res = raw_input('Folder [default] : ')
     res = res or 'default'
Run Code Online (Sandbox Code Playgroud)

或者,您可以尝试使用Python中的curses模块执行某些操作.


qtw*_*trt 10

这适用于Windows.

import win32console

_stdin = win32console.GetStdHandle(win32console.STD_INPUT_HANDLE)

def input_def(prompt, default=''):
    keys = []
    for c in unicode(default):
        evt = win32console.PyINPUT_RECORDType(win32console.KEY_EVENT)
        evt.Char = c
        evt.RepeatCount = 1
        evt.KeyDown = True
        keys.append(evt)

    _stdin.WriteConsoleInput(keys)
    return raw_input(prompt)

if __name__ == '__main__':
    name = input_def('Folder name: ')
    print
    print name
Run Code Online (Sandbox Code Playgroud)

  • 我认为上面的答案仅适用于 Python 2。`print name` 是一个死的赠品;) 对于 Windows 的 Python 3 解决方案,请参阅我对类似问题的回答,代码略有修改:http://stackoverflow.com/ a/32156249/4973698 (2认同)

MCO*_*MCO 7

我终于找到了一个适用于 Windows 和 Linux 的简单替代方案。本质上,我使用pyautogui模块来模拟用户的输入。在实践中,它看起来像这样:

from pyautogui import typewrite

print("enter folder name: ")
typewrite("Default Value")
folder = input()
Run Code Online (Sandbox Code Playgroud)

例子

警告:

  1. 理论上,用户可以在typewrite完成之前按下一个键,在“默认”输入的中间插入字符。
  2. pyautogui 在无头系统上是出了名的不可靠,因此请确保提供备份解决方案,以防导入失败。如果遇到No module named 'Xlib',请尝试安装python3-xlibpython-xlib包(或xlib模块)。运行 ssh也可能是一个问题

一个示例回退实现:

由于缺少 X 服务器在逻辑上只能在 linux 上发生,因此这里有一个使用 sth 的答案作为后备的实现:

try:
    from pyautogui import typewrite
    autogui = True
except (ImportError, KeyError):
    import readline
    autogui = False

def rlinput(prompt, prefill=''):
    if autogui:
        print(prompt)
        typewrite(prefill)
        return input()
    else:
        readline.set_startup_hook(lambda: readline.insert_text(prefill))
        try:
            return input(prompt)
        finally:
            readline.set_startup_hook()
Run Code Online (Sandbox Code Playgroud)