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.
python
python-2.7
input
nameerror
chillpenguin
la source
la source
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?import sys
et comme deuxième ligneprint(sys.version_info)
afin de déterminer quelle version vous utilisez.Réponses:
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 laraw_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é eninput
. Citant les notes de publication de Python 3.0 ,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'estraw_input
. Vous pouvez penser à la relation entre eux comme suitConsidérez le morceau de code suivant pour mieux comprendre cela
input
accepte une chaîne de l'utilisateur et évalue la chaîne dans le contexte Python actuel. Lorsque je tapedude
en entrée, il trouve quedude
est lié à la valeurthefourtheye
et donc le résultat de l'évaluation devientthefourtheye
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
.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 avecimport os
, puis l'utilisateur tape danscela 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.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 çaSi 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 laint
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.7raw_input
.la source
Vous exécutez Python 2, pas Python 3. Pour que cela fonctionne en Python 2, utilisez
raw_input
.la source
Puisque vous écrivez pour Python 3.x, vous voudrez commencer votre script par:
Si tu utilises:
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:
Ensuite, vous pouvez le changer en:
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é.
la source
Vous devez utiliser
raw_input
car vous utilisez python-2.7. Lorsque vous utilisezinput()
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:la source
Pour python 3 et supérieur
il résoudra le problème sur pycharm IDE si vous résolvez sur le site en ligne exactement hackerrank puis utilisez:
la source
Vous pouvez soit faire:
ou:
la source
Vous devez saisir les entrées entre guillemets simples ou doubles
la source
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:
cela a fixé la convivialité pour les deux interprètes
vous pouvez en savoir plus sur la bibliothèque six ici
la source
Nous utilisons ce qui suit qui fonctionne à la fois python 2 et python 3
la source
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:
./filename.py
partir de la ligne de commande-bash: ./filename.py: Permission denied
, courezchmod a+x filename.py
./filename.py
nouveauSi 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 python3la source
Bonnes contributions les précédentes.
Merci!
la source
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
string
commencez simplement à taper avec "l'entrée va avec les guillemets doubles" et cela fonctionnera en python2.7 etLa 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
from six.moves import input
raw_input()
fonction au lieu de lainput()
fonction dans votre code avec n'importe quelle importationstr()
fonction commestr(input())
, puis attribuer à n'importe quelle variableComme 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.
la source
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
à
Parce qu'avec la virgule, il imprime avec un espace entre les deux
your name is
et tout ce que l'utilisateur a entré. ET: si vous utilisez 2.7, utilisez simplementraw_input
au lieu de saisir.la source