APT命令行界面 – 像是/否input?
有什么简短的方法来实现APT( 高级包工具 )命令行界面在Python中做什么?
我的意思是,当包pipe理器提示是/否问题后跟[Yes/no]
,脚本接受YES/Y/yes/y
还是回车 (默认为Yes
如大写字母所暗示)。
我在官方文档中find的唯一东西是input
和raw_input
…
我知道这不是很难模仿,但重写:|是很烦人的
正如你所提到的,最简单的方法是使用raw_input()
。 没有内置的方法来做到这一点。 从配方577058 :
import sys def query_yes_no(question, default="yes"): """Ask a yes/no question via raw_input() 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" (the default), "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: '%s'" % default) while True: sys.stdout.write(question + prompt) choice = raw_input().lower() if default is not None and choice == '': return valid[default] elif choice in valid: return valid[choice] else: sys.stdout.write("Please respond with 'yes' or 'no' " "(or 'y' or 'n').\n")
用法示例:
>>> 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'")
Python的标准库中有一个函数strtobool
: http : strtobool
您可以使用它来检查用户的input并将其转换为True
或False
值。
一个非常简单的(但不是非常复杂的)做这个select的方法是:
msg = 'Shall I?' shall = raw_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 = raw_input("%s (%s) " % (message, choices)) values = ('y', 'yes', '') if choices == 'Y/n' else ('y', 'yes') return choice.strip().lower() in values
正如@Alexander Artemenko所提到的,这是一个使用strtobool的简单解决scheme
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)
你也可以使用提示器 。
自述文件无耻地采取:
#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
您可以使用点击 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
。
文档: http : //click.pocoo.org/5/prompts/#confirmation-prompts
我修改了fmark的答案python 2/3兼容更pythonic。
如果您对更多error handling感兴趣,请参阅ipython的实用程序模块
# 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)
在2.7,这是不是pythonic?
if raw_input('your prompt').lower()[0]=='y': your code here else: alternate code here
它至less捕获了是的任何变化。
在python 3.x中执行相同的操作,其中raw_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")
你可以尝试类似下面的代码,以便能够使用来自variables“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
这个怎么样:
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
这是我使用的:
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
def question(question, answers): acceptable = False while not acceptable: print(question + "specify '%s' or '%s'") % answers answer = raw_input() if answer.lower() == answers[0].lower() or answers[0].lower(): print('Answer == %s') % answer acceptable = True return answer raining = question("Is it raining today?", ("Y", "N"))
这是我该怎么做的。
产量
Is it raining today? Specify 'Y' or 'N' > Y answer = 'Y'
这是我的承诺,如果用户不确认这个行为,我只是想放弃。
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()