Ik krijg een foutmelding wanneer ik dit eenvoudige script probeer uit te voeren:
input_variable = input("Enter your name: ")
print("your name is" + input_variable)
Stel dat ik “dude” typ, de foutmelding die ik krijg is:
line 1, in <module>
input_variable = input("Enter your name: ")
File "<string>", line 1, in <module>
NameError: name 'dude' is not defined
Ik voer deze scripts uit met Python 2.7.
Antwoord 1, autoriteit 100%
TL;DR
input
-functie in Python 2.7, evalueert alles wat je invoert, als een Python-expressie. Als je gewoon strings wilt lezen, gebruik dan de functie raw_input
in Python 2.7, die de gelezen strings niet zal evalueren.
Als je Python 3.x gebruikt, is raw_input
hernoemd naar input
. Onder verwijzing naar de Python 3.0 release-opmerkingen,
raw_input()
is hernoemd naareval(input())
. Dat wil zeggen, de nieuwe functieeval(input())
leest een regel uitsys.stdin
en retourneert deze met de achterliggende nieuwe regel gestript. Het verhoogtEOFError
als de invoer voortijdig wordt beëindigd. Gebruikeval(input())
om het oude gedrag van
eval(input())
te krijgen.
In Python 2.7zijn er twee functies die kunnen worden gebruikt om gebruikersinvoer te accepteren. De ene is input
en de andere is raw_input
. Je kunt de relatie daartussen als volgt bedenken
input = eval(raw_input)
Overweeg het volgende stukje code om dit beter te begrijpen
>>> dude = "thefourtheye"
>>> input_variable = input("Enter your name: ")
Enter your name: dude
>>> input_variable
'thefourtheye'
input
accepteert een string van de gebruiker en evalueert de string in de huidige Python-context. Als ik dude
typ als invoer, blijkt dat dude
gebonden is aan de waarde thefourtheye
en dus wordt het resultaat van de evaluatie thefourtheye
en dat wordt toegewezen aan input_variable
.
Als ik iets anders invoer dat er niet is in de huidige python-context, zal het mislukken, de 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
Veiligheidsoverwegingen met de input
van Python 2.7:
Aangezien de gebruikerstypen ook worden geëvalueerd, legt het ook veiligheidskwesties op. Als u bijvoorbeeld al os
-module in uw programma hebt geladen met import os
, en vervolgens de gebruikerstypen in
os.remove("/etc/hosts")
Dit wordt geëvalueerd als een functie-oproepuitdrukking door Python en zal worden uitgevoerd. Als u Python uitvoert met verhoogde privileges, wordt /etc/hosts
bestand verwijderd. Zie, hoe gevaarlijk het zou kunnen zijn?
Laten we proberen dit te proberen input
-functie opnieuw uit te voeren.
>>> dude = "thefourtheye"
>>> input("Enter your name: ")
Enter your name: input("Enter your name again: ")
Enter your name again: dude
Nu, wanneer input("Enter your name: ")
wordt uitgevoerd, het wacht op de gebruikersinvoer en de gebruikersinvoer is een geldige inroep van Python-functie en zo wordt ook aangeroepen. Daarom zien we Enter your name again:
prompt opnieuw.
Dus, je bent beter af met raw_input
functie, zoals deze
input_variable = raw_input("Enter your name: ")
Als u het resultaat naar een ander type wilt converteren, kunt u de juiste functies gebruiken om de tekenreeks te converteren die wordt geretourneerd door raw_input
. Om inputs bijvoorbeeld als gehele getallen te lezen, gebruikt u de int
functie, zoals weergegeven in dit antwoord .
in Python 3.x , er is slechts één functie om gebruikersinangen te krijgen en dat wordt input
, die gelijk is aan Python 2.7’s raw_input
.
Antwoord 2, Autoriteit 21%
U loopt Python 2, niet Python 3. Hiervoor werkt u in Python 2, gebruik raw_input
.
input_variable = raw_input ("Enter your name: ")
print ("your name is" + input_variable)
Antwoord 3, Autoriteit 7%
Omdat u aan het schrijven bent voor Python 3.x, wilt u beginnen met uw script met:
#!/usr/bin/env python3
Als u gebruikt:
#!/usr/bin/env python
Het zal standaard in Python 2.x. Deze gaan op de eerste regel van je script, als er niets is dat begint met #! (aka de Shebang).
Als uw scripts gewoon beginnen met:
#! python
Dan kunt u het wijzigen naar:
#! python3
Hoewel deze kortere opmaak alleen wordt herkend door een paar programma’s, zoals de launcher, dus het is niet de beste keuze.
De eerste twee voorbeelden zijn veel meer meer gebruikt en zullen helpen ervoor te zorgen dat uw code werkt op een machine die Python heeft geïnstalleerd.
Antwoord 4, Autoriteit 2%
Ik heb ook dit probleem tegengekomen met een module die compatibel was voor Python 2.7 en 3.7
Wat ik vond het probleem op te lossen, was importeren:
from six.moves import input
dit heeft de bruikbaarheid voor beide tolken verholpen
u kunt hier
meer lezen over de zes bibliotheken
Antwoord 5, autoriteit 2%
Je moet raw_input
gebruiken omdat je python-2.7 gebruikt. Wanneer u eval(input())
op een variabele gebruikt (bijvoorbeeld: s = input('Name: ')
), zal het de opdracht OP de Python-omgeving uitvoeren zonder op te slaan wat je hebt geschreven op de variabele (s
) en een fout maakt als wat je hebt geschreven niet is gedefinieerd.
raw_input()
zal correct opslaan wat u op de variabele hebt geschreven (bijvoorbeeld: f = raw_input('Name : ')
), en het zal het niet uitvoeren in de Python-omgeving zonder een mogelijke fout te creëren:
input_variable = raw_input('Enter Your Name : ')
print("Your Name Is : " + (input_variable))
Antwoord 6, autoriteit 2%
input_variable = input ("Enter your name: ")
print ("your name is" + input_variable)
Je moet invoer tussen enkele of dubbele aanhalingstekens invoeren
Ex:'dude' -> correct
dude -> not correct
Antwoord 7, autoriteit 2%
Voor python 3 en hoger
s = raw_input()
het lost het probleem op pycharm IDE op
als je op een online site precies hackerrank oplost, gebruik dan:
s = input()
Antwoord 8
U kunt het volgende doen:
x = raw_input("enter your name")
print "your name is %s " % x
of:
x = str(input("enter your name"))
print "your name is %s" % x
Antwoord 9
We gebruiken het volgende dat zowel python 2 als python 3
werkt
#Works in Python 2 and 3:
try: input = raw_input
except NameError: pass
print(input("Enter your name: "))
Antwoord 10
Voor iedereen die mogelijk tegen dit probleem aanloopt, blijkt dat zelfs als je #!/usr/bin/env python3
aan het begin van je script opneemt, de shebang wordt genegeerd als het bestand is niet uitvoerbaar.
Om te bepalen of uw bestand al dan niet uitvoerbaar is:
- voer
./filename.py
uit vanaf de opdrachtregel - als je
-bash: ./filename.py: Permission denied
krijgt, voer jechmod a+x filename.py
- voer
./filename.py
opnieuw uit
uit
Als u import sys; print(sys.version)
zoals Kevin suggereerde, je zult nu zien dat het script wordt geïnterpreteerd door python3
Antwoord 11
Goede bijdragen de vorige.
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: "))
Vul je naam in: Joe ('Hoi ', 'Joe', <typ 'str'>) Hallo Joe, doei Jouw naam: Joe Joe
Bedankt!
Antwoord 12
Er zijn twee manieren om deze problemen op te lossen,
-
De eerste is eenvoudig zonder codewijziging, dat is
voer je script uit met Python3,
als je nog steeds op python2 wilt draaien, dan
na het uitvoeren van uw python-script, houd er rekening mee wanneer u de invoer invoert- als je
string
wilt invoeren, begin dan gewoon te typen met “invoer gaat met dubbele aanhalingstekens” en het zal werken in python2.7 en - als je tekens wilt invoeren, gebruik dan de invoer met een enkel aanhalingsteken, zoals ‘je invoer komt hier’
- als u een nummer wilt invoeren dat geen probleem is, typt u gewoon het nummer
- als je
-
Tweede manier is met codewijzigingen
gebruik de onderstaande import en voer het uit met elke versie van pythonfrom six.moves import input
- Gebruik de functie
raw_input()
in plaats van de functieeval(input())
in uw code bij elke import - maak uw code schoon met de functie
str()
zoalsstr(input())
en wijs deze vervolgens toe aan een willekeurige variabele
Zoals een fout impliceert:
naam ‘dude’ is niet gedefinieerd
dwz voor python wordt ‘kerel’ hier variabel en er wordt geen waarde van het door python gedefinieerde type toegewezen
dus alleen het huilt als een baby, dus als we een ‘kerel’-variabele definiëren en een waarde toewijzen en eraan doorgeven, zal het werken maar dat is niet wat we willen omdat we niet weten welke gebruiker zal invoeren en bovendien willen we de gebruikersinvoer vastleggen.
Feit over deze methode:
Functieeval(input())
: deze functie neemt de waarde en het type van de invoer die u invoert zoals het is, zonder het type te wijzigen.raw_input()
functie: Deze functie converteert expliciet de invoer die u geeft in type string,
Opmerking:
De kwetsbaarheid in de input()-methode ligt in het feit dat:
de variabele die toegang heeft tot de waarde van invoer is toegankelijk voor iedereen
gewoon door de naam van de variabele of methode te gebruiken.
Antwoord 13
Je kunt veranderen welke python je gebruikt met je IDE, als je python 3.x al hebt gedownload, zou het niet al te moeilijk moeten zijn om over te schakelen. Maar je script werkt prima op python 3.x, ik zou gewoon veranderen
print ("your name is" + input_variable)
naar
print ("your name is", input_variable)
Omdat het met de komma wordt afgedrukt met een spatie tussen your name is
en wat de gebruiker ook heeft ingevoerd. EN: als je 2.7 gebruikt, gebruik dan gewoon raw_input
in plaats van invoer.
Antwoord 14
Hier is een invoerfunctie die compatibel is met zowel Python 2.7 als Python 3+:
(Enigszins aangepast antwoord door @Hardian) om UnboundLocalError: local variable 'input' referenced before assignment
-fout
def input_compatible(prompt=None):
try:
input_func = raw_input
except NameError:
input_func = input
return input_func(prompt)
Antwoord 15
Probeer raw_input
te gebruiken in plaats van input
als je gewoon strings wilt lezen.
print("Enter your name: ")
x = raw_input()
print("Hello, "+x)