erreur input () - NameError: le nom '…' n'est pas défini

220

Je reçois une erreur lorsque j'essaie d'exécuter ce script simple:

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

Disons que je tape "mec", l'erreur que je reçois est:

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

J'exécute ces scripts avec Python 2.7.

chillpenguin
la source
12
Êtes-vous sûr que c'est Python 3.3? Je m'attendrais inputà me comporter de cette façon, mais seulement en 2.7. Que dit-il lorsque vous exécutez à python --versionpartir d'une invite de commande? Sinon, que se passe-t-il si vous écrivez import sys; print(sys.version)au début de votre script?
Kevin
1
Vous n'utilisez pas Python 3. Vous utilisez Python 2, d'une manière ou d'une autre (je ne connais pas cette application "Python Launcher")
Wooble
1
Mettez comme première ligne import syset comme deuxième ligne print(sys.version_info)afin de déterminer quelle version vous utilisez.
Hyperboreus
1
J'ai fait ce que Kevin a dit et c'est la version 2.7.5! Je ne sais pas comment. J'ai téléchargé et installé la version 3.3, dans mon dossier d'applications il y a un dossier qui s'appelle "Python 3.3" à l'intérieur de ce dossier il y a une application appelée "Python Launcher" et j'exécute mes scripts en les faisant glisser et en les déposant sur l'application Python Launcher . Comment se fait-il que j'utilise toujours la version 2.7 lorsque j'utilise l'application de lancement 3.3?
chillpenguin
2
@chillpenguin: consultez la boîte de dialogue Préférences pour Python Launcher. Apparemment, il ne fonctionne pas par défaut avec la version avec laquelle il a été installé, qui est ... stupide. (Je ne l'ai jamais utilisé moi-même; je trouve que l'utilisation du terminal est meilleure ...)
Wooble

Réponses:

265

TL; DR

inputen Python 2.7, évalue ce que vous entrez, comme une expression Python. Si vous voulez simplement lire des chaînes, utilisez la raw_inputfonction en Python 2.7, qui n'évaluera pas les chaînes lues.

Si vous utilisez Python 3.x, raw_inputa été renommé en input. Citant les notes de publication de Python 3.0 ,

raw_input()a été renommé en input(). Autrement dit, la nouvelle input()fonction lit une ligne sys.stdinet la renvoie avec la nouvelle ligne de fin supprimée. Il augmente EOFErrorsi l'entrée se termine prématurément. Pour obtenir l'ancien comportement de input(), utilisezeval(input())


Dans Python 2.7 , il existe deux fonctions qui peuvent être utilisées pour accepter les entrées utilisateur. L'un est inputet l'autre l'est raw_input. Vous pouvez penser à la relation entre eux comme suit

input = eval(raw_input)

Considérez le morceau de code suivant pour mieux comprendre cela

>>> dude = "thefourtheye"
>>> input_variable = input("Enter your name: ")
Enter your name: dude
>>> input_variable
'thefourtheye'

inputaccepte une chaîne de l'utilisateur et évalue la chaîne dans le contexte Python actuel. Lorsque je tape dudeen entrée, il trouve que dudeest lié à la valeur thefourtheyeet donc le résultat de l'évaluation devient thefourtheyeet qui est affecté à input_variable.

Si j'entre quelque chose d'autre qui n'est pas là dans le contexte actuel de python, il échouera le 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

Considérations de sécurité avec Python 2.7 input:

Étant donné que les types d'utilisateurs sont évalués, cela impose également des problèmes de sécurité. Par exemple, si vous avez déjà chargé le osmodule dans votre programme avec import os, puis l'utilisateur tape dans

os.remove("/etc/hosts")

cela sera évalué comme une expression d'appel de fonction par python et il sera exécuté. Si vous exécutez Python avec des privilèges élevés, le /etc/hostsfichier sera supprimé. Vous voyez, comme cela pourrait être dangereux?

Pour illustrer cela, essayons à inputnouveau d'exécuter la fonction.

>>> dude = "thefourtheye"
>>> input("Enter your name: ")
Enter your name: input("Enter your name again: ")
Enter your name again: dude

Maintenant, lorsqu'il input("Enter your name: ")est exécuté, il attend l'entrée utilisateur et l'entrée utilisateur est une invocation de fonction Python valide et donc elle est également invoquée. C'est pourquoi nous voyons à Enter your name again:nouveau prompt.

Donc, vous êtes mieux avec la raw_inputfonction, comme ça

input_variable = raw_input("Enter your name: ")

Si vous devez convertir le résultat en un autre type, vous pouvez utiliser les fonctions appropriées pour convertir la chaîne renvoyée par raw_input. Par exemple, pour lire les entrées sous forme d'entiers, utilisez la intfonction, comme indiqué dans cette réponse .

Dans python 3.x , il n'y a qu'une seule fonction pour obtenir les entrées utilisateur et qui est appelée input, ce qui équivaut à Python 2.7 raw_input.

thefourtheye
la source
56

Vous exécutez Python 2, pas Python 3. Pour que cela fonctionne en Python 2, utilisez raw_input.

input_variable = raw_input ("Enter your name: ")
print ("your name is" + input_variable)
davidisme
la source
17

Puisque vous écrivez pour Python 3.x, vous voudrez commencer votre script par:

#!/usr/bin/env python3

Si tu utilises:

#!/usr/bin/env python

Il sera par défaut en Python 2.x. Ceux-ci vont sur la première ligne de votre script, s'il n'y a rien qui commence par #! (aka le shebang).

Si vos scripts commencent simplement par:

#! python

Ensuite, vous pouvez le changer en:

#! python3

Bien que ce formatage plus court ne soit reconnu que par quelques programmes, tels que le lanceur, ce n'est donc pas le meilleur choix.

Les deux premiers exemples sont beaucoup plus largement utilisés et aideront à garantir que votre code fonctionnera sur n'importe quelle machine sur laquelle Python est installé.

Zim
la source
6

Vous devez utiliser raw_inputcar vous utilisez python-2.7. Lorsque vous utilisez input()une variable (par exemple:) s = input('Name: '), il exécutera la commande SUR l'environnement Python sans enregistrer ce que vous avez écrit sur la variable (s ) et créera une erreur si ce que vous avez écrit n'est pas défini.

raw_input()enregistrera correctement ce que vous avez écrit sur la variable (par exemple:) f = raw_input('Name : '), et ne l'exécutera pas dans l'environnement Python sans créer d'erreur possible:

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

Pour python 3 et supérieur

s = raw_input()

il résoudra le problème sur pycharm IDE si vous résolvez sur le site en ligne exactement hackerrank puis utilisez:

s = input()
RAHUL KUMAR
la source
4

Vous pouvez soit faire:

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

ou:

x = str(input("enter your name"))
print "your name is %s" % x
Abdullah Baraka
la source
1
raw_input a résolu le problème pour moi
Spencer Goff
Mais raw_input () n'est pas disponible dans Python 3.
carthurs
4
input_variable = input ("Enter your name: ")
print ("your name is" + input_variable)

Vous devez saisir les entrées entre guillemets simples ou doubles

Ex:'dude' -> correct

    dude -> not correct
Parminder Singh
la source
4

J'ai également rencontré ce problème avec un module qui était censé être compatible pour python 2.7 et 3.7

ce que j'ai trouvé pour résoudre le problème importait:

from six.moves import input

cela a fixé la convivialité pour les deux interprètes

vous pouvez en savoir plus sur la bibliothèque six ici

Elad L.
la source
3

Nous utilisons ce qui suit qui fonctionne à la fois python 2 et python 3

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

Pour toute autre personne susceptible de rencontrer ce problème, il s'avère que même si vous incluez #!/usr/bin/env python3 au début de votre script, le shebang est ignoré si le fichier n'est pas exécutable.

Pour déterminer si votre fichier est exécutable ou non:

  • exécuter à ./filename.pypartir de la ligne de commande
  • si vous obtenez -bash: ./filename.py: Permission denied, courezchmod a+x filename.py
  • courir à ./filename.pynouveau

Si vous l'avez inclus import sys; print(sys.version)comme Kevin l'a suggéré, vous verrez maintenant que le script est interprété par python3

automonous
la source
2

Bonnes contributions les précédentes.

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: "))
Entrez votre nom: Joe
('Salut', 'Joe', <type 'str'>)
Salut Joe, au revoir 

Votre nom: Joe
Joe

Merci!

Joe Llerena
la source
1

Il existe deux façons de résoudre ces problèmes,

  • 1er est simple sans changement de code qui
    exécute votre script par Python3,
    si vous voulez toujours exécuter sur python2, puis après avoir exécuté votre script python, lorsque vous entrez l'entrée, gardez à l'esprit

    1. si vous voulez entrer, stringcommencez simplement à taper avec "l'entrée va avec les guillemets doubles" et cela fonctionnera en python2.7 et
    2. si vous voulez entrer du caractère, utilisez l'entrée avec une seule citation comme «votre entrée va ici»
    3. si vous voulez entrer un numéro, ce n'est pas un problème, il vous suffit de taper le numéro
  • La deuxième façon est avec les changements de code,
    utilisez l'importation ci-dessous et exécutez avec n'importe quelle version de python

    1. from six.moves import input
    2. Utilisez la raw_input()fonction au lieu de la input()fonction dans votre code avec n'importe quelle importation
    3. assainir votre code avec une str()fonction comme str(input()), puis attribuer à n'importe quelle variable

Comme l'erreur l'indique : le
nom 'mec' n'est pas défini, c'est-à-dire que pour python, 'mec' devient variable ici et il n'y a aucune valeur de type défini par python assignée
donc seulement ses pleurs comme bébé donc si nous définissons une variable 'mec' et assignons n'importe quelle valeur et passez-y, cela fonctionnera mais ce n'est pas ce que nous voulons car nous ne savons pas quel utilisateur entrera et de plus nous voulons capturer l'entrée de l'utilisateur.

Fait à propos de ces méthode:
input() fonction: Cette fonction prend la valeur et le type de l'entrée que vous entrez tel quel sans modifier le type.
raw_input() fonction: Cette fonction convertit explicitement l'entrée que vous donnez en chaîne de type,

Remarque:
La vulnérabilité de la méthode input () réside dans le fait que la variable accédant à la valeur de l'entrée peut être accessible par n'importe qui en utilisant simplement le nom de la variable ou de la méthode.

Naval Kishor Jha
la source
0

Vous pouvez changer le python que vous utilisez avec votre IDE, si vous avez déjà téléchargé python 3.x, il ne devrait pas être trop difficile de changer. Mais votre script fonctionne bien sur python 3.x, je voudrais juste changer

print ("your name is" + input_variable)

à

print ("your name is", input_variable)

Parce qu'avec la virgule, il imprime avec un espace entre les deux your name iset tout ce que l'utilisateur a entré. ET: si vous utilisez 2.7, utilisez simplement raw_inputau lieu de saisir.

Cleve Green
la source