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?
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é eninput()
. C'est-à-dire que la nouvelle fonctioninput()
lit une ligne à partir desys.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 deinput()
, utilisezeval(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.
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)
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é.
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))
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()
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
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
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:
./filename.py
à partir de la ligne de commande-bash: ./filename.py: Permission denied
, lancez chmod a+x filename.py
./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.
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: "))
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.
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
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!