Python APT命令行界面,如是/否输入?
有没有什么捷径可以实现APT(高级包工具)命令行界面在Python中的功能 我的意思是,当包管理器提示一个yes/no问题,后跟Python APT命令行界面,如是/否输入?,python,Python,有没有什么捷径可以实现APT(高级包工具)命令行界面在Python中的功能 我的意思是,当包管理器提示一个yes/no问题,后跟[yes/no],脚本接受yes/Y/yes/Y或输入(默认为yes,大写字母表示) 我在官方文件中找到的唯一东西是输入和原始输入 我知道模仿并不难,但重写起来很烦人:|正如你提到的,最简单的方法是使用raw\u input()(或者简单地说是input())。没有内置的方法可以做到这一点。发件人: 导入系统 def查询是否(问题,默认为“是”): “”“通过原始输入(
[yes/no]
,脚本接受yes/Y/yes/Y
或输入(默认为yes
,大写字母表示)
我在官方文件中找到的唯一东西是输入
和原始输入
我知道模仿并不难,但重写起来很烦人:|正如你提到的,最简单的方法是使用
raw\u input()
(或者简单地说是input()
)。没有内置的方法可以做到这一点。发件人:
导入系统
def查询是否(问题,默认为“是”):
“”“通过原始输入()询问是/否问题并返回他们的答案。
“问题”是呈现给用户的字符串。
“默认”是假定的答案,如果用户刚刚点击。
它必须是“是”(默认值)、“否”或“无”(表示
需要用户提供答案)。
“回答”返回值对于“是”为True,对于“否”为False。
"""
valid={“yes”:True,“y”:True,“ye”:True,“no”:False,“n”:False}
如果默认值为无:
prompt=“[y/n]”
elif default==“是”:
prompt=“[Y/n]”
elif默认值==“否”:
prompt=“[y/N]”
其他:
raise VALUERROR(“无效的默认答案:“%s]”%default)
尽管如此:
系统标准输出写入(问题+提示)
选项=输入()
如果默认值不是None且选项==“”:
返回有效[默认值]
elif选择有效:
返回有效[选择]
其他:
sys.stdout.write(“请回答‘是’或‘否’”(或‘是’或‘n’)。\n)
(对于Python 2,使用raw_input
而不是input
)
用法示例:
>>> query_yes_no("Is cabbage yummier than cauliflower?")
Is cabbage yummier than cauliflower? [Y/n] oops
Please respond with 'yes' or 'no' (or 'y' or 'n').
Is cabbage yummier than cauliflower? [Y/n] [ENTER]
>>> True
>>> query_yes_no("Is cabbage yummier than cauliflower?", None)
Is cabbage yummier than cauliflower? [y/n] [ENTER]
Please respond with 'yes' or 'no' (or 'y' or 'n').
Is cabbage yummier than cauliflower? [y/n] y
>>> True
我会这样做:
# raw_input returns the empty string for "enter"
yes = {'yes','y', 'ye', ''}
no = {'no','n'}
choice = raw_input().lower()
if choice in yes:
return True
elif choice in no:
return False
else:
sys.stdout.write("Please respond with 'yes' or 'no'")
对于单个选择,一种非常简单(但不是非常复杂)的方法是:
msg = 'Shall I?'
shall = input("%s (y/N) " % msg).lower() == 'y'
您还可以围绕以下内容编写一个简单(稍加改进)的函数:
def yn_choice(message, default='y'):
choices = 'Y/n' if default.lower() in ('y', 'yes') else 'y/N'
choice = input("%s (%s) " % (message, choices))
values = ('y', 'yes', '') if choices == 'Y/n' else ('y', 'yes')
return choice.strip().lower() in values
注意:在Python 2上,使用
raw\u input
而不是input
Python的标准库中有一个函数strtobool
:
您可以使用它来检查用户的输入,并将其转换为True
或False
值。如何:
def yes(prompt = 'Please enter Yes/No: '):
while True:
try:
i = raw_input(prompt)
except KeyboardInterrupt:
return False
if i.lower() in ('yes','y'): return True
elif i.lower() in ('no','n'): return False
您可以尝试下面的代码,以便能够使用此处显示的变量“accepted”中的选项:
print( 'accepted: {}'.format(accepted) )
# accepted: {'yes': ['', 'Yes', 'yes', 'YES', 'y', 'Y'], 'no': ['No', 'no', 'NO', 'n', 'N']}
这是密码
#!/usr/bin/python3
def makeChoi(yeh, neh):
accept = {}
# for w in words:
accept['yes'] = [ '', yeh, yeh.lower(), yeh.upper(), yeh.lower()[0], yeh.upper()[0] ]
accept['no'] = [ neh, neh.lower(), neh.upper(), neh.lower()[0], neh.upper()[0] ]
return accept
accepted = makeChoi('Yes', 'No')
def doYeh():
print('Yeh! Let\'s do it.')
def doNeh():
print('Neh! Let\'s not do it.')
choi = None
while not choi:
choi = input( 'Please choose: Y/n? ' )
if choi in accepted['yes']:
choi = True
doYeh()
elif choi in accepted['no']:
choi = True
doNeh()
else:
print('Your choice was "{}". Please use an accepted input value ..'.format(choi))
print( accepted )
choi = None
正如@Alexander Artemenko所提到的,这里有一个使用strtobool的简单解决方案
from distutils.util import strtobool
def user_yes_no_query(question):
sys.stdout.write('%s [y/n]\n' % question)
while True:
try:
return strtobool(raw_input().lower())
except ValueError:
sys.stdout.write('Please respond with \'y\' or \'n\'.\n')
#usage
>>> user_yes_no_query('Do you like cheese?')
Do you like cheese? [y/n]
Only on tuesdays
Please respond with 'y' or 'n'.
ok
Please respond with 'y' or 'n'.
y
>>> True
我知道这已经得到了一系列的回答,这可能无法回答OP的具体问题(包括标准列表),但这是我为最常见的用例所做的,它比其他回答简单得多:
answer = input('Please indicate approval: [y/n]')
if not answer or answer[0].lower() != 'y':
print('You did not indicate approval')
exit(1)
这就是我使用的:
import sys
# cs = case sensitive
# ys = whatever you want to be "yes" - string or tuple of strings
# prompt('promptString') == 1: # only y
# prompt('promptString',cs = 0) == 1: # y or Y
# prompt('promptString','Yes') == 1: # only Yes
# prompt('promptString',('y','yes')) == 1: # only y or yes
# prompt('promptString',('Y','Yes')) == 1: # only Y or Yes
# prompt('promptString',('y','yes'),0) == 1: # Yes, YES, yes, y, Y etc.
def prompt(ps,ys='y',cs=1):
sys.stdout.write(ps)
ii = raw_input()
if cs == 0:
ii = ii.lower()
if type(ys) == tuple:
for accept in ys:
if cs == 0:
accept = accept.lower()
if ii == accept:
return True
else:
if ii == ys:
return True
return False
您也可以使用
无耻地摘自自述:
#pip install prompter
from prompter import yesno
>>> yesno('Really?')
Really? [Y/n]
True
>>> yesno('Really?')
Really? [Y/n] no
False
>>> yesno('Really?', default='no')
Really? [y/N]
True
我就是这样做的
输出
Is it raining today? Specify 'Y' or 'N'
> Y
answer = 'Y'
我修改了fmark对python2/3兼容的python的回答 看看您是否对更具错误处理能力的内容感兴趣
# PY2/3 compatibility
from __future__ import print_function
# You could use the six package for this
try:
input_ = raw_input
except NameError:
input_ = input
def query_yes_no(question, default=True):
"""Ask a yes/no question via standard input and return the answer.
If invalid input is given, the user will be asked until
they acutally give valid input.
Args:
question(str):
A question that is presented to the user.
default(bool|None):
The default value when enter is pressed with no value.
When None, there is no default value and the query
will loop.
Returns:
A bool indicating whether user has entered yes or no.
Side Effects:
Blocks program execution until valid input(y/n) is given.
"""
yes_list = ["yes", "y"]
no_list = ["no", "n"]
default_dict = { # default => prompt default string
None: "[y/n]",
True: "[Y/n]",
False: "[y/N]",
}
default_str = default_dict[default]
prompt_str = "%s %s " % (question, default_str)
while True:
choice = input_(prompt_str).lower()
if not choice and default is not None:
return default
if choice in yes_list:
return True
if choice in no_list:
return False
notification_str = "Please respond with 'y' or 'n'"
print(notification_str)
下面是我的看法,如果用户没有确认操作,我只想中止
import distutils
if unsafe_case:
print('Proceed with potentially unsafe thing? [y/n]')
while True:
try:
verify = distutils.util.strtobool(raw_input())
if not verify:
raise SystemExit # Abort on user reject
break
except ValueError as err:
print('Please enter \'yes\' or \'no\'')
# Try again
print('Continuing ...')
do_unsafe_thing()
在2.7中,这是否太不符合Python
if raw_input('your prompt').lower()[0]=='y':
your code here
else:
alternate code here
它至少捕获了Yes的任何变体。对python 3.x执行相同操作,其中
raw\u input()
不存在:
def ask(question, default = None):
hasDefault = default is not None
prompt = (question
+ " [" + ["y", "Y"][hasDefault and default] + "/"
+ ["n", "N"][hasDefault and not default] + "] ")
while True:
sys.stdout.write(prompt)
choice = input().strip().lower()
if choice == '':
if default is not None:
return default
else:
if "yes".startswith(choice):
return True
if "no".startswith(choice):
return False
sys.stdout.write("Please respond with 'yes' or 'no' "
"(or 'y' or 'n').\n")
您可以使用的confirm
方法
import click
if click.confirm('Do you want to continue?', default=True):
print('Do something')
这将打印:
$ Do you want to continue? [Y/n]:
应适用于Linux、Mac或Windows上的Python 2/3
文档:对于Python 3,我使用以下函数:
def user_prompt(question: str) -> bool:
""" Prompt the yes/no-*question* to the user. """
from distutils.util import strtobool
while True:
user_input = input(question + " [y/n]: ")
try:
return bool(strtobool(user_input))
except ValueError:
print("Please use y/n or yes/no.\n")
函数将字符串转换为布尔值。如果无法分析字符串,则会引发ValueError
在Python 3中,原始输入()已重命名为
正如Geoff所说,strtobool实际上返回0或1,因此必须将结果转换为bool
这是strtobool的实现,如果您希望特殊单词被识别为
true
,您可以复制代码并添加自己的案例
def strobool(val):
“”“将真值的字符串表示形式转换为真(1)或假(0)。
真值为“y”、“是”、“t”、“真”、“开”和“1”;假值
是“n”、“否”、“f”、“false”、“off”和“0”。如果
“瓦尔”是别的意思。
"""
val=val.lower()
如果val在('y','yes','t','true','on','1'):
返回1
elif val in('n','no','f','false','off','0'):
返回0
其他:
raise VALUERROR(“无效真值%r”%(val,))
作为一个编程能手,我发现上面的一系列答案过于复杂,特别是如果目标是拥有一个简单的函数,您可以将各种是/否问题传递给用户,迫使用户选择是或否。在浏览了本页和其他几页,并借用了所有各种好主意后,我得出以下结论:
def yes_no(question_to_be_answered):
while True:
choice = input(question_to_be_answered).lower()
if choice[:1] == 'y':
return True
elif choice[:1] == 'n':
return False
else:
print("Please respond with 'Yes' or 'No'\n")
#See it in Practice below
musical_taste = yes_no('Do you like Pine Coladas?')
if musical_taste == True:
print('and getting caught in the rain')
elif musical_taste == False:
print('You clearly have no taste in music')
一个经过清理的Python 3示例:
# inputExample.py
def confirm_input(question, default="no"):
"""Ask a yes/no question and return their answer.
"question" is a string that is presented to the user.
"default" is the presumed answer if the user just hits <Enter>.
It must be "yes", "no", or None (meaning
an answer is required of the user).
The "answer" return value is True for "yes" or False for "no".
"""
valid = {"yes": True, "y": True, "ye": True,
"no": False, "n": False}
if default is None:
prompt = " [y/n] "
elif default == "yes":
prompt = " [Y/n] "
elif default == "no":
prompt = " [y/N] "
else:
raise ValueError("invalid default answer: '{}}'".format(default))
while True:
print(question + prompt)
choice = input().lower()
if default is not None and choice == '':
return valid[default]
elif choice in valid:
return valid[choice]
else:
print("Please respond with 'yes' or 'no' "
"(or 'y' or 'n').\n")
def main():
if confirm_input("\nDo you want to continue? "):
print("You said yes because the function equals true. Continuing.")
else:
print("Quitting because the function equals false.")
if __name__ == "__main__":
main()
#inputExample.py
def确认_输入(问题,默认值=“否”):
“问一个是/否的问题,并返回他们的答案。
“问题”是呈现给用户的字符串。
“默认”是假定的答案,如果用户刚刚点击。
必须是“是”、“否”或“无”(意思是
需要用户提供答案)。
“回答”返回值对于“是”为True,对于“否”为False。
"""
valid={“yes”:真,“y”:真,“ye”:真,
“否”:False,“n”:False}
如果默认值为无:
prompt=“[y/n]”
elif default==“是”:
prompt=“[Y/n]”
elif默认值==“否”:
prompt=“[y/N]”
其他:
raise VALUERROR(“无效的默认答案:'{}'”。格式(默认))
尽管如此:
打印(问题+提示)
选项=输入()
如果默认值不是None且选项='':
返回有效[默认值]
elif选择有效:
返回有效[选择]
其他:
打印(“请
# inputExample.py
def confirm_input(question, default="no"):
"""Ask a yes/no question and return their answer.
"question" is a string that is presented to the user.
"default" is the presumed answer if the user just hits <Enter>.
It must be "yes", "no", or None (meaning
an answer is required of the user).
The "answer" return value is True for "yes" or False for "no".
"""
valid = {"yes": True, "y": True, "ye": True,
"no": False, "n": False}
if default is None:
prompt = " [y/n] "
elif default == "yes":
prompt = " [Y/n] "
elif default == "no":
prompt = " [y/N] "
else:
raise ValueError("invalid default answer: '{}}'".format(default))
while True:
print(question + prompt)
choice = input().lower()
if default is not None and choice == '':
return valid[default]
elif choice in valid:
return valid[choice]
else:
print("Please respond with 'yes' or 'no' "
"(or 'y' or 'n').\n")
def main():
if confirm_input("\nDo you want to continue? "):
print("You said yes because the function equals true. Continuing.")
else:
print("Quitting because the function equals false.")
if __name__ == "__main__":
main()
while res:= input("When correct, press enter to continue...").lower() not in {'y','yes','Y','YES',''}: pass
res = True
while res:
res = input("Please confirm with y/yes...").lower(); res = res not in {'y','yes','Y','YES',''}