J'obtiens une erreur lorsque j'essaie d'exécuter ce simple script python :
input_variable = input ("Enter your name: ")
print ("your name is" + input_variable)
Disons que je tape "dude" ;, l'erreur que j'obtiens est :
line 1, in <module>
input_variable = input ("Enter your name: ")
File "<string>", line 1, in <module>
NameError: name 'dude' is not defined
Je suis sous 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 lance 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 au-dessus de l'application Python Launcher qui se trouve dans le dossier Python 3.3 de mon dossier d'applications, cela lancerait mes scripts avec la version 3.3. Je suppose que cette méthode lance toujours les scripts avec 2.7. Alors, comment puis-je utiliser la version 3.3 ?
TL;DR
La fonction input
de Python 2.7, évalue tout ce que vous entrez, comme une expression Python. Si vous voulez simplement lire des chaînes de caractères, alors utilisez la fonction raw_input
de Python 2.7, qui n'évaluera pas les chaînes lues.
Si vous utilisez Python 3.x, raw_input
a été renommé en input
. Je cite les [notes de version de Python 3.0] (https://docs.python.org/3.0/whatsnew/3.0.html#builtins),
raw_input()
a été renommé eninput()
. En d'autres termes, la nouvelle fonctioninput()
lit une ligne desys.stdin
et la renvoie avec la nouvelle ligne de queue effacée. Elle lèveEOFError
si l'entrée est terminée prématurément. Pour obtenir l'ancien comportement deinput()
, utilisezeval(input())
.
En Python 2.7, il y a deux fonctions qui peuvent être utilisées pour accepter les entrées utilisateur. L'une est [input
][1] et l'autre est [raw_input
][2]. La relation entre ces deux fonctions est la suivante
input = eval(raw_input)
Pour mieux comprendre, considérez le morceau de code suivant
>>> dude = "thefourtheye"
>>> input_variable = input("Enter your name: ")
Enter your name: dude
>>> input_variable
'thefourtheye'
input
accepte une chaîne de caractères de la part de l'utilisateur et évalue cette chaîne dans le contexte Python actuel. Lorsque je tape dude
en entrée, il trouve que dude
est lié à la valeur thefourtheye
et donc le résultat de l'évaluation devient thefourtheye
et est assigné à input_variable
.
Si j'entre quelque chose d'autre qui n'existe pas dans le contexte actuel de Python, il échouera avec 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
Les considérations de sécurité avec l'entrée de Python 2.7's input
:
Puisque tout ce que l'utilisateur tape est évalué, cela impose également des problèmes de sécurité. Par exemple, si vous avez déjà chargé le module os
dans votre programme avec import os
, et qu'ensuite l'utilisateur tape en
os.remove("/etc/hosts")
ceci sera évalué comme une 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 peut être dangereux ?
Pour le démontrer, essayons à nouveau d'exécuter la fonction input
.
>>> dude = "thefourtheye"
>>> input("Enter your name: ")
Enter your name: input("Enter your name again: ")
Enter your name again: dude
Maintenant, lorsque la fonction input("Enter your name : " ;)
est exécutée, elle attend l'entrée de l'utilisateur et l'entrée de l'utilisateur est une invocation valide de la fonction Python, qui est donc également invoquée. C'est pourquoi nous voyons à nouveau l'invite Entrez votre nom :
.
Il est donc préférable d'utiliser la fonction raw_input
, comme ceci
input_variable = raw_input("Enter your name: ")
Si vous avez besoin de convertir le résultat en un autre type, vous pouvez utiliser les fonctions appropriées pour convertir la chaîne retournée par raw_input
. Par exemple, pour lire les entrées sous forme d'entiers, utilisez la fonction int
, comme indiqué dans cette réponse.
En Python 3.x, il n'y a qu'une seule fonction pour obtenir les entrées de l'utilisateur et elle est appelée [input
][3], qui est équivalente à la fonction raw_input
de Python 2.7.
[1] : http://docs.python.org/2/library/functions.html#input [2] : http://docs.python.org/2/library/functions.html#raw_input [3] : http://docs.python.org/3/library/functions.html#input
Vous utilisez Python 2 et non Python 3. Pour que cela fonctionne dans Python 2, utilisez raw_input
.
input_variable = raw_input ("Enter your name: ")
print ("your name is" + input_variable)
Puisque vous écrivez pour Python 3.x, vous voudrez commencer votre script avec :
#!/usr/bin/env python3
Si vous utilisez :
#!/usr/bin/env python
Il utilisera par défaut Python 2.x. Ils seront placés sur la première ligne de votre script, s'il n'y a rien qui commence par #! (alias le shebang).
Si vos scripts ne commencent que par :
#! python
Alors vous pouvez le changer en :
#! python3
Bien que ce formatage plus court ne soit reconnu que par quelques programmes, comme le lanceur, ce n'est pas le meilleur choix.
Les deux premiers exemples sont beaucoup plus largement utilisés et vous permettront de vous assurer que votre code fonctionnera sur toute machine sur laquelle Python est installé.