有没有什么简单的方法来实现APT(高级包工具)命令行界面在Python中的作用?
我的意思是,当包管理器提示一个yes/no问题,后面跟着[yes/no]时,脚本接受yes/ Y/yes/ Y或Enter(默认为yes,由大写字母提示)。
我在官方文档中唯一找到的是input和raw_input…
我知道模仿它并不难,但是重写:|很烦人
有没有什么简单的方法来实现APT(高级包工具)命令行界面在Python中的作用?
我的意思是,当包管理器提示一个yes/no问题,后面跟着[yes/no]时,脚本接受yes/ Y/yes/ Y或Enter(默认为yes,由大写字母提示)。
我在官方文档中唯一找到的是input和raw_input…
我知道模仿它并不难,但是重写:|很烦人
当前回答
由于答案是“是”或“否”,在下面的例子中,第一个解决方案是使用while函数重复这个问题,第二个解决方案是使用递归-是定义事物本身的过程。
def yes_or_no(question):
while "the answer is invalid":
reply = str(input(question+' (y/n): ')).lower().strip()
if reply[:1] == 'y':
return True
if reply[:1] == 'n':
return False
yes_or_no("Do you know who Novak Djokovic is?")
第二个解决方案:
def yes_or_no(question):
"""Simple Yes/No Function."""
prompt = f'{question} ? (y/n): '
answer = input(prompt).strip().lower()
if answer not in ['y', 'n']:
print(f'{answer} is invalid, please try again...')
return yes_or_no(question)
if answer == 'y':
return True
return False
def main():
"""Run main function."""
answer = yes_or_no("Do you know who Novak Djokovic is?")
print(f'you answer was: {answer}')
if __name__ == '__main__':
main()
其他回答
我修改了fmark的答案,用python 2/3兼容更pythonic。
如果您对更多错误处理感兴趣,请参阅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)
我会这样做:
# 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 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")
函数的作用是:将字符串转换为bool类型。如果字符串不能被解析,它将引发ValueError。
在Python 3中,raw_input()已重命名为input()。
正如Geoff所说,strtoool实际上返回0或1,因此结果必须转换为bool类型。
这是strtobool的实现,如果你想让特殊的单词被识别为true,你可以复制代码并添加自己的case。
def strtobool (val):
"""Convert a string representation of truth to true (1) or false (0).
True values are 'y', 'yes', 't', 'true', 'on', and '1'; false values
are 'n', 'no', 'f', 'false', 'off', and '0'. Raises ValueError if
'val' is anything else.
"""
val = val.lower()
if val in ('y', 'yes', 't', 'true', 'on', '1'):
return 1
elif val in ('n', 'no', 'f', 'false', 'off', '0'):
return 0
else:
raise ValueError("invalid truth value %r" % (val,))
由于答案是“是”或“否”,在下面的例子中,第一个解决方案是使用while函数重复这个问题,第二个解决方案是使用递归-是定义事物本身的过程。
def yes_or_no(question):
while "the answer is invalid":
reply = str(input(question+' (y/n): ')).lower().strip()
if reply[:1] == 'y':
return True
if reply[:1] == 'n':
return False
yes_or_no("Do you know who Novak Djokovic is?")
第二个解决方案:
def yes_or_no(question):
"""Simple Yes/No Function."""
prompt = f'{question} ? (y/n): '
answer = input(prompt).strip().lower()
if answer not in ['y', 'n']:
print(f'{answer} is invalid, please try again...')
return yes_or_no(question)
if answer == 'y':
return True
return False
def main():
"""Run main function."""
answer = yes_or_no("Do you know who Novak Djokovic is?")
print(f'you answer was: {answer}')
if __name__ == '__main__':
main()
正如你提到的,最简单的方法是使用raw_input()(或简单的input()对于Python 3)。没有内置的方法可以做到这一点。配方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 = 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")
(对于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