pip3 - instalar pip python windows
Interfaz de línea de comando APT, como la entrada sí/no? (17)
¿Hay alguna manera de lograr lo que hace la interfaz de línea de comando APT ( Advanced Package Tool ) en Python?
Quiero decir, cuando el administrador de paquetes solicita una pregunta sí / no seguida de [Yes/no]
, la secuencia de comandos acepta YES/Y/yes/y
o Intro (por defecto es Yes
como lo indica la letra mayúscula).
Lo único que encuentro en los documentos oficiales es input
y raw_input
...
Sé que no es tan difícil de emular, pero es molesto reescribir: |
Aquí está mi opinión, simplemente quería abortar si el usuario no confirma la acción.
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()
Como mencionaste, la forma más fácil es usar raw_input()
. No hay una forma incorporada de hacer esto. De la receta 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")
Ejemplo de uso:
>>> 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
Esto es lo que uso:
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
Haciendo lo mismo con python 3.x, donde raw_input()
no existe:
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")
Hay una función strtobool
en la biblioteca estándar de Python: docs.python.org/2/distutils/…
Puede usarlo para verificar la entrada del usuario y transformarlo en valor True
o False
.
Lo haría de esta manera:
# 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''")
Modifiqué la respuesta de fmark por python 2/3 compatible más pythonic.
Vea el módulo de utilidad de ipython si está interesado en algo con más manejo de errores
# 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)
Para Python 3, estoy usando esta función:
def user_prompt(question:str):
""" Prompts a Yes/No questions. """
import sys
from distutils.util import strtobool
while True:
sys.stdout.write(question + " [y/n]: ")
user_input = input().lower()
try:
result = strtobool(user_input)
return result
except ValueError:
sys.stdout.write("Please use y/n or yes/no./n")
La función strtobool convierte una cadena en un bool. Si la cadena no se puede analizar, generará un ValueError.
En Python 3, raw_input ha sido renombrado como input .
Puede intentar algo como el siguiente código para poder trabajar con opciones de la variable ''aceptada'' que se muestra aquí:
print( ''accepted: {}''.format(accepted) )
# accepted: {''yes'': ['''', ''Yes'', ''yes'', ''YES'', ''y'', ''Y''], ''no'': [''No'', ''no'', ''NO'', ''n'', ''N'']}
Aquí está el código ...
#!/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
Puede usar el método de confirm
click .
import click
if click.confirm(''Do you want to continue?'', default=True):
print(''Do something'')
Esto se imprimirá:
$ Do you want to continue? [Y/n]:
Debería funcionar para Python 2/3
en Linux, Mac o Windows.
Documentos: http://click.pocoo.org/5/prompts/#confirmation-prompts
Qué tal esto:
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
Sé que esto se ha respondido de varias maneras y esto puede no responder a la pregunta específica de OP (con la lista de criterios), pero esto es lo que hice para el caso de uso más común y es mucho más simple que las otras respuestas:
answer = input(''Please indicate approval: [y/n]'')
if not answer or answer[0].lower() != ''y'':
print(''You did not indicate approval'')
exit(1)
También puede usar el prompter .
Sin vergüenza, tomado del README:
#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
Una manera muy simple (pero no muy sofisticada) de hacer esto para una sola opción sería:
msg = ''Shall I?''
shall = raw_input("%s (y/N) " % msg).lower() == ''y''
También podría escribir una función simple (ligeramente mejorada) alrededor de esto:
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
como lo menciona @Alexander Artemenko, aquí hay una solución simple usando 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
en 2.7, ¿esto también es no-pitónico?
if raw_input(''your prompt'').lower()[0]==''y'':
your code here
else:
alternate code here
capta cualquier variación de Yes al menos.
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"))
Así es como lo haría.
Salida
Is it raining today? Specify ''Y'' or ''N''
> Y
answer = ''Y''