APT命令行界面 – 像是/否input?

有什么简短的方法来实现APT( 高级包工具 )命令行界面在Python中做什么?

我的意思是,当包pipe理器提示是/否问题后跟[Yes/no] ,脚本接受YES/Y/yes/y还是回车 (默认为Yes如大写字母所暗示)。

我在官方文档中find的唯一东西是inputraw_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并将其转换为TrueFalse值。

一个非常简单的(但不是非常复杂的)做这个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()