TL; DR
input
funciona en Python 2.7, evalúa lo que ingrese, como una expresión de Python. Si simplemente desea leer cadenas, use la raw_input
función en Python 2.7, que no evaluará las cadenas leídas.
Si está utilizando Python 3.x, se le raw_input
ha cambiado el nombre input
. Citando las notas de la versión de Python 3.0 ,
raw_input()
fue renombrado a input()
. Es decir, la nueva input()
función lee una línea sys.stdin
y la devuelve con la nueva línea eliminada. Se eleva EOFError
si la entrada se termina prematuramente. Para obtener el comportamiento anterior de input()
, useeval(input())
En Python 2.7 , hay dos funciones que se pueden usar para aceptar las entradas del usuario. Uno es input
y el otro es raw_input
. Puedes pensar en la relación entre ellos de la siguiente manera
input = eval(raw_input)
Considere la siguiente pieza de código para entender esto mejor
>>> dude = "thefourtheye"
>>> input_variable = input("Enter your name: ")
Enter your name: dude
>>> input_variable
'thefourtheye'
input
acepta una cadena del usuario y la evalúa en el contexto actual de Python. Cuando escribo dude
como entrada, descubre que dude
está vinculado al valor thefourtheye
y, por lo tanto, el resultado de la evaluación se convierte thefourtheye
y se le asigna input_variable
.
Si ingreso algo más que no está allí en el contexto actual de Python, fallará NameError
.
>>> input("Enter your name: ")
Enter your name: dummy
Traceback (most recent call last):
File "<input>", line 1, in <module>
File "<string>", line 1, in <module>
NameError: name 'dummy' is not defined
Consideraciones de seguridad con Python 2.7 input
:
Como se evalúa cualquier tipo de usuario, también impone problemas de seguridad. Por ejemplo, si ya ha cargado el os
módulo en su programa con import os
, y luego el usuario escribe
os.remove("/etc/hosts")
Python evaluará esto como una expresión de llamada de función y se ejecutará. Si está ejecutando Python con privilegios elevados, el /etc/hosts
archivo se eliminará. Mira, ¿qué tan peligroso puede ser?
Para demostrar esto, intentemos ejecutar la input
función nuevamente.
>>> dude = "thefourtheye"
>>> input("Enter your name: ")
Enter your name: input("Enter your name again: ")
Enter your name again: dude
Ahora, cuando input("Enter your name: ")
se ejecuta, espera la entrada del usuario y la entrada del usuario es una invocación válida de la función Python, por lo que también se invoca. Es por eso que estamos viendo el Enter your name again:
aviso nuevamente.
Entonces, estás mejor con la raw_input
función, así
input_variable = raw_input("Enter your name: ")
Si necesita convertir el resultado a otro tipo, puede usar las funciones apropiadas para convertir la cadena devuelta por raw_input
. Por ejemplo, para leer entradas como enteros, use la int
función, como se muestra en esta respuesta .
En python 3.x , solo hay una función para obtener las entradas del usuario y se llama input
, que es equivalente a Python 2.7 raw_input
.
input
comportarme de esta manera, pero solo en 2.7. ¿Qué dice cuando se ejecutapython --version
desde un símbolo del sistema? Alternativamente, ¿qué pasa si escribeimport sys; print(sys.version)
al comienzo de su guión?