¿Cómo uso raw_input en Python 3?

553
import sys
print(sys.platform)
print(2**100)
raw_input()

Estoy usando Python 3.1 y no puedo hacer raw_inputque "congele" la ventana emergente de DOS. El libro que estoy leyendo es para Python 2.5 y estoy usando Python 3.1

¿Qué debo hacer para arreglar esto?

Precio de Lonnie
fuente
1
hm, obtengo NameError: el nombre 'raw_input' no está definido cuando intento usar su código. no te pasa lo mismo?
SilentGhost 05 de
99
Ha cambiado mucho en Python 3, por lo que probablemente no debería intentar dominarlo usando un libro para 2.5 (que es realmente antiguo).
Niklas B.
55
raw_input fue renombrado como input en python 3
krystan honor
Obtengo un error http 401 cuando sigo el enlace Oauth2
Big Ian

Respuestas:

1011

Comenzando con Python 3, raw_input()se renombró a input().

De What's New In Python 3.0, segundo elemento de la sección Builtins .

balpha
fuente
56
Originalmente había una función input () que actuaba de manera similar a la evaluación actual (input ()). Fue un sobrante de cuando Python era menos consciente de la seguridad. El cambio simplificó el lenguaje. Consulte también "importar esto" para obtener una explicación más profunda. ¿Preferirías una lengua muerta a una que evolucione? Hay muchos de esos alrededor.
meawoppl
99
También estoy aprendiendo Python y encontré una diferencia entre input()y raw_input(). a = input()tomará la entrada del usuario y la pondrá en el tipo correcto. Por ejemplo: si el usuario escribe 5, entonces el valor en aes entero 5. a = raw_input()tomará la entrada del usuario y la colocará como una cadena. Por ejemplo: si el usuario escribe 5, entonces el valor en aes cadena '5' y no un entero. Pensé que podría ser una buena información para los novatos en Python como yo.
Vishnu Narang
10
@VishnuNarang Sí, eso es correcto en Python 2. Pero en Python 3, este comportamiento cambió, y la entrada hace lo que hizo raw_input en Python 2.
balpha
44
@balpha: recién verificado. Estás en lo correcto. Tengo Python 2.7 (No puedo editar la respuesta para mencionar que ...)
Vishnu Narang
3
@meawoppl El paso de Python 2 a 3 estaba destinado a romperse. No significa que tenía que ser así. Un lenguaje puede evolucionar sin morir y sin cambiar la firma de la función. Ayuda si no tienes funciones globales. Comience con una idea retrospectiva de otros idiomas. Etc. Eliminar funciones tampoco está fuera de la mesa.
dlamblin
117

Esto funciona en Python 3.xy 2.x:

# Fix Python 2.x.
try: input = raw_input
except NameError: pass
print("Hi " + input("Say something: "))
Cees Timmerman
fuente
44
Estaba teniendo un problema de alcance con este enfoque. Se corrigió con un global inputen la parte superior de la función de llamada.
kevlar1818
1
Esto parece un poco más limpia para mí: import __builtin__; input = getattr(__builtin__, 'raw_input', input)
mbarkhau
3
Python 3 no tiene un módulo nombrado __builtin__.
Cees Timmerman
@mbarkhau: es demasiado global. ¿Qué pasa si llamas a una biblioteca que no lo espera? __builtin__se renombra builtinsen Python 3. Ambos están disponibles como __builtins__en CPython.
jfs
3
getattr(__builtins__, 'raw_input', input)devuelve el valor predeterminado cuando se importa en Python 2.7.2.
Cees Timmerman
45

Una forma confiable de abordar esto es

from six.moves import input

six es un módulo que repara muchos de los 2/3 puntos comunes de código base.

Tacaswell
fuente
1
Buena idea ... y si lo hace from six.moves import input as raw_input, puede mantener raw_inputsu secuencia de comandos y ejecutar usando ambas versiones de Python.
eddy85br
15

Como otros han indicado, la raw_inputfunción ha sido renombrada inputen Python 3.0, y realmente sería mejor que recibiera un libro más actualizado, pero quiero señalar que hay mejores formas de ver el resultado de su script .

Según su descripción, creo que está utilizando Windows, ha guardado un .pyarchivo y luego hace doble clic en él para ejecutarlo. La ventana de terminal que aparece se cierra tan pronto como finaliza su programa, por lo que no puede ver cuál fue el resultado de su programa. Para resolver esto, su libro recomienda agregar una declaración raw_input/ inputpara esperar hasta que el usuario presione Intro. Sin embargo, como has visto, si algo sale mal, como un error en tu programa, esa declaración no se ejecutará y la ventana se cerrará sin que puedas ver qué salió mal. Es posible que le resulte más fácil usar un símbolo del sistema o IDLE.

Use un símbolo del sistema

Cuando esté mirando la ventana de la carpeta que contiene su programa Python, mantenga presionada la tecla Mayús y haga clic con el botón derecho en cualquier parte del área de fondo blanco de la ventana. El menú que aparece debe contener una entrada "Abrir ventana de comandos aquí". (Creo que esto funciona en Windows Vista y Windows 7.) Esto abrirá una ventana de símbolo del sistema que se ve así:

    Microsoft Windows [Version 6.1.7601]
    Copyright (c) 2009 Microsoft Corporation.  All rights reserved.

    C:\Users\Weeble\My Python Program>_

Para ejecutar su programa, escriba lo siguiente (sustituyendo el nombre de su script):

    python myscript.py

... y presiona enter. (Si recibe un error de que "python" no es un comando reconocido, consulte http://showmedo.com/videotutorials/video?name=960000&fromSeriesID=96 ) Cuando su programa termina de ejecutarse, ya sea que se complete con éxito o no, la ventana permanecerá abierto y el símbolo del sistema aparecerá nuevamente para que pueda escribir otro comando. Si desea ejecutar su programa nuevamente, puede presionar la flecha hacia arriba para recuperar el comando anterior que ingresó y presionar enter para ejecutarlo nuevamente, en lugar de tener que escribir el nombre del archivo cada vez.

Use IDLE

IDLE es un editor de programas simple que viene instalado con Python. Entre otras características, puede ejecutar sus programas en una ventana. Haga clic derecho en su .pyarchivo y elija "Editar en IDLE". Cuando su programa aparezca en el editor, presione F5 o elija "Ejecutar módulo" en el menú "Ejecutar". Su programa se ejecutará en una ventana que permanece abierta después de que finalice su programa, y ​​en la que puede ingresar comandos de Python para que se ejecuten de inmediato.

Weeble
fuente
¿IDLE está instalado con Windows? Ejecutar IDLE o inactivo en mi terminal aparece vacío.
vgoff
1
IDLE se instala con Python en Windows. Aparece como un acceso directo en el menú de inicio y como una asociación de archivos para archivos .py, pero no creo que haya ningún comando 'inactivo' agregado a su ruta de forma predeterminada. Si desea iniciarlo desde la línea de comandos, puede ejecutarpythonw -m idlelib.idle
Weeble
Eso lo explica. Solo toco Windows para ganar dinero, no como sistema operativo. Luego diría que su sección "Usar IDLE" está sesgada. Deberías mencionar la selectividad, tal vez.
vgoff
3
No estoy seguro de entender. La pregunta era específica de Windows. Habla de una "ventana emergente de DOS". IDLE se instala como parte de Python, pero algunos distribuidores pueden separarlo. Por ejemplo, en Ubuntu parece que tienes que instalarlo como un paquete separado. La respuesta ya sugiere un enfoque diferente al solicitado por el interlocutor, por lo que prefiero no agregarle más tangentes. FWIW Yo uso Linux en casa y solo uso Windows donde tengo que trabajar.
Weeble
DOS es un acrónimo de varios sistemas operativos estrechamente relacionados que dominaron el mercado compatible con PC de IBM entre 1981 y 1995, o hasta aproximadamente 2000, incluidas las versiones 95, 98 y Millennium Edition de Microsoft Windows parcialmente basadas en DOS.
vgoff
7

La solución de Timmerman funciona muy bien cuando se ejecuta el código, pero si no desea obtener Undefined nameerrores al usar pyflakes o un linter similar, puede usar lo siguiente:

try:
    import __builtin__
    input = getattr(__builtin__, 'raw_input')
except (ImportError, AttributeError):
    pass
jmagnusson
fuente
Eh, todavía estoy recibiendo un montón de errores en pylint: Redefining built-in 'input' (redefined-builtin), Unable to import '__builtin__' (import-error), Invalid constant name "input" (invalid-name).
Babken Vardanyan
@BabkenVardanyan pylint es notoriamente estricto cuando se trata de estilo de código. Recomendaría más flake8o pyflakesmenos para no tomar todo el día con advertencias sin sentido.
jmagnusson
6

Aquí hay un fragmento de código que puse en mis scripts que quiero ejecutar en un entorno independiente de py2 / 3:

# Thank you, python2-3 team, for making such a fantastic mess with
# input/raw_input :-)
real_raw_input = vars(__builtins__).get('raw_input',input)

Ahora puede usar real_raw_input. Es bastante caro pero corto y legible. El uso de la entrada sin formato suele ser costoso (esperar la entrada), por lo que no es importante.

En teoría, incluso puede asignar raw_input en lugar de real_raw_input, pero puede haber módulos que verifiquen la existencia de raw_input y se comporten en consecuencia. Es mejor mantenerse seguro.

ChewbaccaKL
fuente
Obtuve esto cuando lo probé: inputcons = vars ( builtins ) .get ('raw_input', input) TypeError: el argumento vars () debe tener un atributo dict
0

Probablemente no sea la mejor solución, pero antes de venir, hice esto sobre la marcha para seguir trabajando sin tener un breve descanso del estudio.

def raw_input(x):
  input(x)

Luego, cuando ejecuto raw_input('Enter your first name: ')el script en el que estaba trabajando, lo captura como lo input()haría.

¡Puede haber una razón para no hacer esto, que todavía no he encontrado!

Danijel-James W
fuente
77
¿Por qué no solo raw_input = input?
tonypdmtr