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.
python
python-2.7
input
nameerror
chillpenguin
fuente
fuente
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?import sys
y como segunda líneaprint(sys.version_info)
para determinar qué versión está utilizando.Respuestas:
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 laraw_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 nombreinput
. Citando las notas de la versión de Python 3.0 ,En Python 2.7 , hay dos funciones que se pueden usar para aceptar las entradas del usuario. Uno es
input
y el otro esraw_input
. Puedes pensar en la relación entre ellos de la siguiente maneraConsidere la siguiente pieza de código para entender esto mejor
input
acepta una cadena del usuario y la evalúa en el contexto actual de Python. Cuando escribodude
como entrada, descubre quedude
está vinculado al valorthefourtheye
y, por lo tanto, el resultado de la evaluación se conviertethefourtheye
y se le asignainput_variable
.Si ingreso algo más que no está allí en el contexto actual de Python, fallará
NameError
.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 conimport os
, y luego el usuario escribePython 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.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 elEnter your name again:
aviso nuevamente.Entonces, estás mejor con la
raw_input
función, así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 laint
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.7raw_input
.fuente
Está ejecutando Python 2, no Python 3. Para que esto funcione en Python 2, use
raw_input
.fuente
Como está escribiendo para Python 3.x, querrá comenzar su script con:
Si utiliza:
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:
Luego puedes cambiarlo a:
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.
fuente
Debe usar
raw_input
porque está usando python-2.7. Cuando lo usainput()
en una variable (por ejemplos = 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:fuente
Para python 3 y superior
resolverá el problema en pycharm IDE si está resolviendo en el sitio en línea exactamente hackerrank, luego use:
fuente
Puedes hacer lo siguiente:
o:
fuente
Debe ingresar la entrada entre comillas simples o dobles
fuente
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:
esto solucionó la usabilidad para ambos intérpretes
Puedes leer más sobre las seis bibliotecas aquí
fuente
Estamos utilizando lo siguiente que funciona tanto en python 2 como en python 3
fuente
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:
./filename.py
desde la línea de comando-bash: ./filename.py: Permission denied
, correchmod a+x filename.py
./filename.py
nuevoSi ha incluido
import sys; print(sys.version)
como Kevin sugirió, ahora verá que el script está siendo interpretado por python3fuente
Buenas aportaciones las anteriores.
¡Gracias!
fuente
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
string
, simplemente comience a escribir con "la entrada va con comillas dobles" y funcionará en python2.7 yLa segunda forma es con los cambios de código,
use la importación a continuación y ejecute con cualquier versión de python
from six.moves import input
raw_input()
función en lugar de lainput()
función en su código con cualquier importaciónstr()
función comostr(input())
y luego asigne a cualquier variableComo 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.
fuente
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
a
Porque con la coma se imprime con un espacio en blanco en el medio
your name is
y lo que haya ingresado el usuario. Y: si está utilizando 2.7, simplemente use enraw_input
lugar de entrada.fuente