python - guia - qgis manual
error de entrada()-NameError: name ''...'' no está definido (8)
Me aparece un error cuando intento ejecutar este sencillo script de Python:
input_variable = input ("Enter your name: ")
print ("your name is" + input_variable)
Digamos que escribo "amigo", el error que estoy obteniendo 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 Mac OS X 10.9.1 y estoy usando la aplicación Python Launcher que vino con la instalación de Python 3.3 para ejecutar el script.
Editar: Me di cuenta de que de alguna manera estoy ejecutando estos scripts con 2.7. Supongo que la verdadera pregunta es ¿cómo puedo ejecutar mis scripts con la versión 3.3? Pensé que si arrastraba y soltaba mis scripts encima de la aplicación Python Launcher que está dentro de la carpeta Python 3.3 en mi carpeta de aplicaciones, lanzaría mis scripts usando 3.3. Supongo que este método todavía lanza scripts con 2.7. Entonces, ¿cómo utilizo 3.3?
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)
Para cualquier otra persona que pueda encontrarse con este problema, resulta que incluso si incluye #!/usr/bin/env python3
al comienzo de su script, el shebang se ignora si el archivo no es ejecutable.
Para determinar si su archivo es ejecutable o no:
- ejecutar
./filename.py
desde la línea de comando - si obtienes
-bash: ./filename.py: Permission denied
, ejecutachmod a+x filename.py
- ejecutar
./filename.py
nuevamente
Si ha incluido import sys; print(sys.version)
import sys; print(sys.version)
como Kevin sugirió, ahora verá que el script está siendo interpretado por python3
Puede cambiar qué python está usando con su IDE, si ya ha descargado Python 3.x, no debería ser demasiado difícil cambiarlo. Pero tu 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 entre your name is
y lo que el usuario ingresó. Y: si está utilizando 2.7 simplemente use raw_input
lugar de entrada.
U podría hacer
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
Ya que está escribiendo para Python 3.x, querrá comenzar su script con:
#!/usr/bin/env python3
Si utiliza:
#!/usr/bin/env python
Se establecerá de manera predeterminada en Python 2.x. Estos van en la primera línea de su script, si no hay nada que comience con #! (también conocido como el shebang).
Si tus scripts simplemente comienzan con:
#! python
Entonces puedes cambiarlo a:
#! python3
Aunque este formato más corto solo es reconocido por algunos programas, como el iniciador, no es la mejor opción.
Los dos primeros ejemplos son mucho más utilizados y ayudarán a garantizar que su código funcione en cualquier máquina que tenga instalado Python.
deberías usar raw_input porque estás usando python-2.7, cuando usas input () en un ejemplo de variable: s = input (''Name:''), ejecutará el comando ON en Python Environement sin guardar lo que escribiste en la variable (s) y crear un error Si lo que escribió no está Definido, entonces, puede usar raw_input (), guardará correctamente lo que escribió en la variable, por ejemplo: f = raw_input (''Nombre:'') y no lo hará Ejecútelo en el entorno Python sin Crear un posible error
input_variable = raw_input(''Enter Your Name : '')
print("Your Name Is : " + (input_variable))
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 y luego usará:
s = input()
TL; DR
función de input
en Python 2.7, evalúa lo que sea que ingrese, como una expresión de Python. Si simplemente desea leer cadenas, utilice la función raw_input
en Python 2.7, que no evaluará las cadenas de lectura.
Si está utilizando Python 3.x, raw_input
ha sido renombrado como input
. Citando las notas de la versión de Python 3.0 ,
raw_input()
fue renombrado comoinput()
. Es decir, la nueva funcióninput()
lee una línea desys.stdin
y la devuelve con la nueva línea final eliminada.EOFError
si la entrada finaliza prematuramente. Para obtener el comportamiento anterior deinput()
, useeval(input())
En Python 2.7 , hay dos funciones que se pueden usar para aceptar entradas de usuario. Uno de ellos es de 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 evalúa la cadena en el contexto actual de Python. Cuando dude
como entrada, encuentra que dude
está vinculado al valor thefourtheye
y entonces el resultado de la evaluación se convierte en el thefourtheye
y eso se asigna a input_variable
.
Si introduzco algo más que no está allí en el contexto de python actual, fallará el 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 la input
Python 2.7:
Dado que se evalúa cualquier tipo de usuario, también impone problemas de seguridad. Por ejemplo, si ya ha cargado el módulo os
en su programa con import os
, y luego el usuario escribe
os.remove("/etc/hosts")
esto será evaluado como una expresión de llamada de función por python y se ejecutará. Si está ejecutando Python con privilegios elevados, se eliminará el archivo /etc/hosts
. Mira, ¿qué tan peligroso podría ser?
Para demostrar esto, intentemos ejecutar input
función de input
nuevamente.
>>> dude = "thefourtheye"
>>> input("Enter your name: ")
Enter your name: input("Enter your name again: ")
Enter your name again: dude
Ahora, cuando se ejecuta la input("Enter your name: ")
, espera la entrada del usuario y la entrada del usuario es una invocación de función de Python válida, por lo que también se invoca. Es por eso que estamos viendo Enter your name again:
solicite nuevamente.
Entonces, estás mejor con la función raw_input
, como esta
input_variable = raw_input("Enter your name: ")
Si necesita convertir el resultado a algún otro tipo, puede usar las funciones apropiadas para convertir la cadena devuelta por raw_input
. Por ejemplo, para leer las entradas como enteros, use la función int
, como se muestra en esta respuesta .
En Python 3.x , solo hay una función para obtener las entradas del usuario y eso se llama input
, que es equivalente a raw_input
Python 2.7.