web-dev-qa-db-fra.com

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

Je reçois une erreur lorsque j'essaie d'exécuter ce script python 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'utilise Mac OS X 10.9.1 et j'utilise l'application Python Launcher fournie avec l'installation de Python 3.3 pour exécuter le script.

Edit: J'ai réalisé que je suis en quelque sorte en train d'exécuter ces scripts avec la version 2.7. Je suppose que la vraie question est de savoir comment exécuter mes scripts avec la version 3.3? Je pensais que si je glissais et déposais mes scripts sur l'application Python Launcher qui se trouve dans le dossier Python 3.3 du dossier Applications, il lancerait mes scripts à l'aide de la version 3.3. Je suppose que cette méthode lance toujours les scripts avec 2.7. Alors, comment utiliser 3.3?

164
chillpenguin

TL; DR

La fonction input dans Python 2.7 évalue votre entrée, en tant qu’expression Python. Si vous voulez simplement lire des chaînes, utilisez la fonction raw_input dans Python 2.7, qui n'évaluera pas les chaînes lues.

Si vous utilisez Python 3.x, raw_input a été renommé en input. Citant les Notes de publication de Python 3.0 ,

raw_input() a été renommé en input(). C'est-à-dire que la nouvelle fonction input() lit une ligne à partir de sys.stdin et la renvoie avec la nouvelle ligne supprimée. EOFError est généré si l'entrée est terminée prématurément. Pour obtenir l'ancien comportement de input(), utilisez eval(input())


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

input = eval(raw_input)

Considérez le code suivant pour mieux comprendre ceci

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

input accepte une chaîne de l'utilisateur et l'évalue dans le contexte Python actuel. Lorsque je saisis dude en tant qu'entrée, il trouve que dude est lié à la valeur thefourtheye et que le résultat de l'évaluation devient donc thefourtheye et que input_variable est affecté.

Si j'entre quelque chose d'autre qui n'est pas là dans le contexte actuel de python, la NameError échouera.

>>> 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 sur la sécurité avec la variable input de Python 2.7:

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

os.remove("/etc/hosts")

ceci sera évalué en tant qu'expression d'appel de fonction par python et sera exécuté. Si vous exécutez Python avec des privilèges élevés, le fichier /etc/hosts sera supprimé. Vous voyez, à quel point cela pourrait être dangereux?

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

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

Désormais, lorsque input("Enter your name: ") est exécuté, il attend l'entrée utilisateur et cette entrée est un appel de fonction Python valide, qui est donc également appelé. C'est pourquoi nous voyons à nouveau l'invite Enter your name again:.

Donc, vous êtes mieux avec la fonction raw_input, comme ceci

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 fonction int, comme indiqué dans this answer .

Dans python 3.x, une seule fonction permettant d'obtenir les entrées de l'utilisateur est appelée input , ce qui équivaut au raw_input de Python 2.7.

231
thefourtheye

Vous utilisez Python 2, pas Python 3. Pour que cela fonctionne avec Python 2, utilisez raw_input.

input_variable = raw_input ("Enter your name: ")
print ("your name is" + input_variable)
46
user2534732

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

#!/usr/bin/env python3

Si tu utilises:

#!/usr/bin/env python

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

Si vos scripts commencent simplement par:

#! python

Ensuite, vous pouvez le changer pour:

#! python3

Bien que cette mise en forme plus courte ne soit reconnue que par quelques programmes, tels que le lanceur, ce n’est donc pas le meilleur choix. 

Les deux premiers exemples sont beaucoup plus utilisés et vous aideront à vous assurer que votre code fonctionnera sur toutes les machines sur lesquelles Python est installé.

10
Zim

vous devez utiliser raw_input parce que vous utilisez python-2.7. Lorsque vous utilisez input () sur un exemple de variable: s = input ('Nom:'), il exécutera la commande sur l'environnement Python sans enregistrer ce que vous avez écrit sur la variable. (s) et créant une erreur Si ce que vous avez écrit n'est pas défini, vous pouvez donc utiliser raw_input (), il enregistrera correctement ce que vous avez écrit sur la variable, par exemple: f = raw_input ('Nom:') et il n'en conservera pas Exécutez-le sur l'environnement Python sans créer d'erreur possible 

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

Pour Python 3 et plus

s = raw_input()

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

s = input()
4
RAHUL KUMAR

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
2
Abdullah Baraka
input_variable = input ("Enter your name: ")
print ("your name is" + input_variable)

Vous devez entrer des guillemets simples ou doubles.

Ex:'dude' -> correct

    dude -> not correct
2
Parminder Singh

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, Shebang est ignoré si le fichier n'est pas exécutable.

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

  • lancez ./filename.py à partir de la ligne de commande
  • si vous obtenez -bash: ./filename.py: Permission denied, lancez chmod a+x filename.py
  • relancez ./filename.py

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

2
automonous

Nous utilisons les éléments suivants qui fonctionnent à 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: "))
0
Hardian

Vous pouvez changer le python que vous utilisez avec votre IDE. Si vous avez déjà téléchargé Python 3.x, cela 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, l’impression se fait avec un espace entre your name is et ce que l’utilisateur entre. AND: si vous utilisez 2.7, utilisez simplement raw_input au lieu de l'entrée. 

0
Cleve Green

J'ai également rencontré ce problème avec un module supposé être compatible avec 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 corrigé la facilité d'utilisation pour les deux interprètes

vous pouvez en savoir plus sur les six bibliothèques ici

0
Elad L.

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'>) 
 Bonjour Joe, au revoir 
 
 Votre nom: Joe 
 Joe 

Merci!

0
Joe Llerena