我正在使用python2.7的raw_input
来读取stdin。
我想让用户更改给定的默认字符串。
代码:
i = raw_input("Please enter name:")
控制台:
Please enter name: Jack
应该向用户显示Jack
,但可以将其更改(退格)为其他内容。
Please enter name:
参数将是raw_input
的提示,用户不应更改该部分。
答案 0 :(得分:78)
你可以这样做:
i = raw_input("Please enter name[Jack]:") or "Jack"
这样,如果用户只是按下返回而不输入任何内容,“i”将被分配为“Jack”。
答案 1 :(得分:11)
Python2.7获取raw_input并设置默认值:
将其放在名为a.py的文件中:
import readline
def rlinput(prompt, prefill=''):
readline.set_startup_hook(lambda: readline.insert_text(prefill))
try:
return raw_input(prompt)
finally:
readline.set_startup_hook()
default_value = "an insecticide"
stuff = rlinput("Caffeine is: ", default_value)
print("final answer: " + stuff)
运行该程序,它会停止并向用户显示:
el@defiant ~ $ python2.7 a.py
Caffeine is: an insecticide
光标在最后,用户按下退格键,直到杀虫剂为止。消失了,输入别的东西,然后按回车:
el@defiant ~ $ python2.7 a.py
Caffeine is: water soluable
程序完成这样,最终答案得到用户键入的内容:
el@defiant ~ $ python2.7 a.py
Caffeine is: water soluable
final answer: water soluable
与上述相同,但适用于Python3:
import readline
def rlinput(prompt, prefill=''):
readline.set_startup_hook(lambda: readline.insert_text(prefill))
try:
return input(prompt)
finally:
readline.set_startup_hook()
default_value = "an insecticide"
stuff = rlinput("Caffeine is: ", default_value)
print("final answer: " + stuff)
有关此处发生了什么的更多信息:
答案 2 :(得分:7)
在dheerosaur的回答中如果用户按Enter键来实际选择默认值,它将不会被保存,因为python认为它是''字符串所以延伸了一下dheerosaur。
default = "Jack"
user_input = raw_input("Please enter name: %s"%default + chr(8)*4)
if not user_input:
user_input = default
Fyi ..退格的ASCII value
为08
答案 3 :(得分:4)
在readline
平台上,您可以使用此处描述的方法:https://stackoverflow.com/a/2533142/1090657
在Windows上,您可以使用msvcrt模块:
from msvcrt import getch, putch
def putstr(str):
for c in str:
putch(c)
def input(prompt, default=None):
putstr(prompt)
if default is None:
data = []
else:
data = list(default)
putstr(data)
while True:
c = getch()
if c in '\r\n':
break
elif c == '\003': # Ctrl-C
putstr('\r\n')
raise KeyboardInterrupt
elif c == '\b': # Backspace
if data:
putstr('\b \b') # Backspace and wipe the character cell
data.pop()
elif c in '\0\xe0': # Special keys
getch()
else:
putch(c)
data.append(c)
putstr('\r\n')
return ''.join(data)
请注意,箭头键不适用于Windows版本,使用时,不会发生任何事情。
答案 4 :(得分:4)
我只是添加了这个,因为你应该编写一个简单的函数来重用。这是我写的那个:
def default_input( message, defaultVal ):
if defaultVal:
return raw_input( "%s [%s]:" % (message,defaultVal) ) or defaultVal
else:
return raw_input( "%s " % (message) )
答案 5 :(得分:0)
对于具有gitbash/msys2
或cygwin
的 windows 用户,您可以使用它通过python子进程在readline中内置。这是一种黑客手段,但效果很好,不需要任何第三方代码。对于个人工具,这确实很好。
特定于Msys2:如果要ctrl + c立即退出,则需要使用
运行程序
winpty python program.py
import subprocess
import shlex
def inputMsysOrCygwin(prompt = "", prefilled = ""):
"""Run your program with winpty python program.py if you want ctrl+c to behave properly while in subprocess"""
try:
bashCmd = "read -e -p {} -i {} bash_input; printf '%s' \"$bash_input\"".format(shlex.quote(prompt), shlex.quote(prefilled))
userInput = subprocess.check_output(["sh", "-c", bashCmd], encoding='utf-8')
return userInput
except FileNotFoundError:
raise FileNotFoundError("Invalid environment: inputMsysOrCygwin can only be run from bash where 'read' is available.")
userInput = ""
try:
#cygwin or msys2 shell
userInput = inputMsysOrCygwin("Prompt: ", "This is default text")
except FileNotFoundError:
#cmd or powershell context where bash and read are not available
userInput = input("Prompt [This is default text]: ") or "This is default text"
print("userInput={}".format(userInput))
答案 6 :(得分:-1)
试试这个:raw_input("Please enter name: Jack" + chr(8)*4)
backspace
的ASCII值为08
。