error input () - NameError: el nombre '...' no está definido

220

Recibo un error cuando intento ejecutar este script simple:

input_variable = input ("Enter your name: ")
print ("your name is" + input_variable)

Digamos que escribo "amigo", el error que obtengo es:

line 1, in <module>
input_variable = input ("Enter your name: ")
File "<string>", line 1, in <module>
NameError: name 'dude' is not defined

Estoy ejecutando estos scripts con Python 2.7.

chillpenguin
fuente
12
¿Estás seguro de que es Python 3.3? Esperaría inputcomportarme de esta manera, pero solo en 2.7. ¿Qué dice cuando se ejecuta python --versiondesde un símbolo del sistema? Alternativamente, ¿qué pasa si escribe import sys; print(sys.version)al comienzo de su guión?
Kevin
1
No estás ejecutando Python 3. Estás ejecutando Python 2, de alguna manera (no estoy familiarizado con esta aplicación "Python Launcher")
Wooble
1
Ponga como primera línea import sysy como segunda línea print(sys.version_info)para determinar qué versión está utilizando.
Hyperboreus
1
¡Hice lo que dijo Kevin y es la versión 2.7.5! Aunque no estoy seguro de cómo. Descargué e instalé la versión 3.3, en mi carpeta de aplicaciones hay una carpeta que se llama "Python 3.3" dentro de esa carpeta hay una aplicación llamada "Python Launcher" y estoy ejecutando mis scripts arrastrándolos y soltándolos en la aplicación Python Launcher . ¿Cómo es que todavía estoy usando 2.7 cuando estoy usando la aplicación de inicio 3.3?
chillpenguin
2
@chillpenguin: consulte el cuadro de diálogo Preferencias para Python Launcher. Aparentemente, no ejecuta de forma predeterminada la versión con la que se instaló, lo cual es ... tonto. (Nunca lo he usado yo mismo; creo que usar el Terminal es mejor ...)
Wooble

Respuestas:

265

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.

thefourtheye
fuente
56

Está ejecutando Python 2, no Python 3. Para que esto funcione en Python 2, use raw_input.

input_variable = raw_input ("Enter your name: ")
print ("your name is" + input_variable)
davidismo
fuente
17

Como está escribiendo para Python 3.x, querrá comenzar su script con:

#!/usr/bin/env python3

Si utiliza:

#!/usr/bin/env python

Por defecto será Python 2.x. Estos van en la primera línea del script, si no hay nada que comienza con #! (también conocido como el shebang).

Si sus scripts solo comienzan con:

#! python

Luego puedes cambiarlo a:

#! python3

Aunque este formato más corto solo es reconocido por unos pocos programas, como el iniciador, por lo que no es la mejor opción.

Los primeros dos ejemplos se usan mucho más y ayudarán a garantizar que su código funcione en cualquier máquina que tenga instalado Python.

Zim
fuente
6

Debe usar raw_inputporque está usando python-2.7. Cuando lo usa input()en una variable (por ejemplo s = input('Name: '):), ejecutará el comando EN el entorno Python sin guardar lo que escribió en la variable ( s) y creará un error si lo que escribió no está definido.

raw_input()guardará correctamente lo que escribió en la variable (por ejemplo:) f = raw_input('Name : '), y no lo ejecutará en el entorno Python sin crear ningún posible error:

input_variable = raw_input('Enter Your Name : ')
print("Your Name Is  : " + (input_variable))
Skiller Dz
fuente
5

Para python 3 y superior

s = raw_input()

resolverá el problema en pycharm IDE si está resolviendo en el sitio en línea exactamente hackerrank, luego use:

s = input()
RAHUL KUMAR
fuente
4

Puedes hacer lo siguiente:

x = raw_input("enter your name")
print "your name is %s " % x

o:

x = str(input("enter your name"))
print "your name is %s" % x
Abdullah Baraka
fuente
1
raw_input me solucionó el problema
Spencer Goff
Pero raw_input () no está disponible en Python 3.
carthurs
4
input_variable = input ("Enter your name: ")
print ("your name is" + input_variable)

Debe ingresar la entrada entre comillas simples o dobles

Ex:'dude' -> correct

    dude -> not correct
Parminder Singh
fuente
4

También encontré este problema con un módulo que se suponía que era compatible con Python 2.7 y 3.7

lo que encontré para solucionar el problema fue importar:

from six.moves import input

esto solucionó la usabilidad para ambos intérpretes

Puedes leer más sobre las seis bibliotecas aquí

Elad L.
fuente
3

Estamos utilizando lo siguiente que funciona tanto en python 2 como en python 3

#Works in Python 2 and 3:
try: input = raw_input
except NameError: pass
print(input("Enter your name: "))
Hardian
fuente
2

Para cualquier otra persona que pueda encontrarse con este problema, resulta que incluso si incluye #!/usr/bin/env python3al comienzo de su script, el shebang se ignora si el archivo no es ejecutable.

Para determinar si su archivo es ejecutable o no:

  • correr ./filename.pydesde la línea de comando
  • si consigues -bash: ./filename.py: Permission denied, correchmod a+x filename.py
  • corre de ./filename.pynuevo

Si ha incluido import sys; print(sys.version)como Kevin sugirió, ahora verá que el script está siendo interpretado por python3

autómata
fuente
2

Buenas aportaciones las anteriores.

import sys; print(sys.version)

def ingreso(nombre):
    print('Hi ', nombre, type(nombre))

def bienvenida(nombre):
    print("Hi "+nombre+", bye ")

nombre = raw_input("Enter your name: ")

ingreso(nombre)
bienvenida(nombre)

#Works in Python 2 and 3:
try: input = raw_input
except NameError: pass
print(input("Your name: "))
Ingrese su nombre: Joe
('Hola', 'Joe', <escriba 'str'>)
Hola Joe adios 

Tu nombre: Joe
Joe

¡Gracias!

Joe Llerena
fuente
1

Hay dos formas de solucionar estos problemas,

  • Primero es simple sin cambio de código que
    Python3 ejecuta su script,
    si aún desea ejecutar en python2 , luego de ejecutar su script de python, cuando ingrese la entrada, tenga en cuenta

    1. si desea ingresar string, simplemente comience a escribir con "la entrada va con comillas dobles" y funcionará en python2.7 y
    2. si desea ingresar caracteres, use la entrada con una comilla simple como 'su entrada va aquí'
    3. si desea ingresar el número no es un problema, simplemente escriba el número
  • La segunda forma es con los cambios de código,
    use la importación a continuación y ejecute con cualquier versión de python

    1. from six.moves import input
    2. Use la raw_input()función en lugar de la input()función en su código con cualquier importación
    3. desinfecte su código con una str()función como str(input())y luego asigne a cualquier variable

Como el error implica : el
nombre 'amigo' no está definido, es decir, para python 'amigo' se vuelve variable aquí y no tiene ningún valor de tipo definido de python asignado,
por lo que solo está llorando como un bebé, así que si definimos una variable 'amigo' y asignamos cualquier valor y pasarlo, funcionará, pero eso no es lo que queremos, ya que no sabemos qué usuario ingresará y, además, queremos capturar la entrada del usuario.

Hecho acerca de este método:
input() función: esta función toma el valor y el tipo de la entrada que ingresa tal cual sin modificar su tipo.
raw_input() función: esta función convierte explícitamente la entrada que da en cadena de tipo,

Nota:
La vulnerabilidad en el método input () radica en el hecho de que cualquiera puede acceder a la variable que accede al valor de entrada simplemente usando el nombre de la variable o método.

Naval Kishor Jha
fuente
0

Puede cambiar qué python está utilizando con su IDE, si ya ha descargado python 3.x, no debería ser demasiado difícil de cambiar. Pero su script funciona bien en Python 3.x, solo cambiaría

print ("your name is" + input_variable)

a

print ("your name is", input_variable)

Porque con la coma se imprime con un espacio en blanco en el medio your name isy lo que haya ingresado el usuario. Y: si está utilizando 2.7, simplemente use en raw_inputlugar de entrada.

Cleve Green
fuente