TL; DR
inputfunciona en Python 2.7, evalúa lo que ingrese, como una expresión de Python. Si simplemente desea leer cadenas, use la raw_inputfunción en Python 2.7, que no evaluará las cadenas leídas.
Si está utilizando Python 3.x, se le raw_inputha 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.stdiny la devuelve con la nueva línea eliminada. Se eleva EOFErrorsi 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 inputy 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'
inputacepta una cadena del usuario y la evalúa en el contexto actual de Python. Cuando escribo dudecomo entrada, descubre que dudeestá vinculado al valor thefourtheyey, por lo tanto, el resultado de la evaluación se convierte thefourtheyey 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 osmó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/hostsarchivo se eliminará. Mira, ¿qué tan peligroso puede ser?
Para demostrar esto, intentemos ejecutar la inputfunció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_inputfunció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 intfunció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.
inputcomportarme de esta manera, pero solo en 2.7. ¿Qué dice cuando se ejecutapython --versiondesde un símbolo del sistema? Alternativamente, ¿qué pasa si escribeimport sys; print(sys.version)al comienzo de su guión?