TL; DR
input
en Python 2.7, évalue ce que vous entrez, comme une expression Python. Si vous voulez simplement lire des chaînes, utilisez la raw_input
fonction en 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()
. Autrement dit, la nouvelle input()
fonction lit une ligne sys.stdin
et la renvoie avec la nouvelle ligne de fin supprimée. Il augmente EOFError
si 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 input
et 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'
input
accepte une chaîne de l'utilisateur et évalue la 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 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 os
module 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/hosts
fichier sera supprimé. Vous voyez, comme cela pourrait être dangereux?
Pour illustrer cela, essayons à input
nouveau 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_input
fonction, 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 int
fonction, 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
.
input
à me comporter de cette façon, mais seulement en 2.7. Que dit-il lorsque vous exécutez àpython --version
partir d'une invite de commande? Sinon, que se passe-t-il si vous écrivezimport sys; print(sys.version)
au début de votre script?