errore di input() - NameError: il nome '...' non è definito
Ricevo un errore quando cerco di eseguire questo semplice script python:
input_variable = input ("Enter your name: ")
print ("your name is" + input_variable)
Diciamo che digito "dude", l'errore che ottengo è:
line 1, in <module>
input_variable = input ("Enter your name: ")
File "<string>", line 1, in <module>
NameError: name 'dude' is not defined
Sto usando Mac OS X 10.9.1 e sto usando l'applicazione Python Launcher che è arrivata con l'installazione di python 3.3 per eseguire lo script.
Modifica: mi sono reso conto che in qualche modo sto eseguendo questi script con 2.7. Immagino che la vera domanda sia come faccio a eseguire i miei script con la versione 3.3? Pensavo che se avessi trascinato e lasciato i miei script sopra l'app Python Launcher che si trova all'interno della cartella Python 3.3 nella mia cartella delle applicazioni, avrebbe lanciato i miei script usando 3.3. Immagino che questo metodo lanci ancora gli script con 2.7. Quindi come posso usare la 3.3?
TL;DR
La funzione
input
in Python 2.7, valuta qualsiasi cosa tu inserisca, come un'espressione Python. Se volete semplicemente leggere delle stringhe, allora usate la funzioneraw_input
in Python 2.7, che non valuterà le stringhe lette.Se state usando Python 3.x,
raw_input
è stato rinominato ininput
. Citando le note di rilascio di Python 3.0,raw_input()
è stato rinominato ininput()
. Cioè, la nuova funzioneinput()
legge una linea dasys.stdin
e la restituisce con la newline finale rimossa. Solleva unEOFError
se l'input viene terminato prematuramente. Per ottenere il vecchio comportamento diinput()
, usateeval(input())
In Python 2.7, ci sono due funzioni che possono essere usate per accettare gli input dell'utente. Una è
input
e l'altra èraw_input
. Potete pensare alla relazione tra loro come segueConsiderate il seguente pezzo di codice per capirlo meglio
input
accetta una stringa dall'utente e la valuta nel contesto Python corrente. Quando digitodude
come input, trova chedude
è legato al valorethefourtheye
e quindi il risultato della valutazione diventathefourtheye
e viene assegnato ainput_variable
.Se inserisco qualcos'altro che non è presente nel contesto python corrente, fallirà con il
NameError
.Considerazioni sulla sicurezza con Python 2.7's
input
:Poiché qualsiasi cosa l'utente digiti viene valutata, ciò impone anche problemi di sicurezza. Per esempio, se avete già caricato il modulo
os
nel vostro programma conimport os
, e poi l'utente digitaquesto verrà valutato da Python come espressione di chiamata di funzione e verrà eseguito. Se state eseguendo Python con privilegi elevati, il file
/etc/hosts
verrà cancellato. Vedete, quanto può essere pericoloso?Per dimostrarlo, proviamo ad eseguire di nuovo la funzione
input
.Ora, quando
input("Inserisci il tuo nome: ")
viene eseguito, aspetta l'input dell'utente e l'input dell'utente è una valida invocazione di una funzione Python e quindi viene invocata anche quella. Ecco perché vediamo di nuovo il promptEnter your name again:
.Quindi, è meglio usare la funzione
raw_input
, come questaSe avete bisogno di convertire il risultato in qualche altro tipo, allora potete usare funzioni appropriate per convertire la stringa restituita da
raw_input
. Per esempio, per leggere gli input come interi, usa la funzioneint
, come mostrato in questa risposta.In python 3.x, c'è solo una funzione per ottenere gli input dell'utente e si chiama
input
, che è equivalente alraw_input
di Python 2.7.Stai usando Python 2, non Python 3. Per farlo funzionare in Python 2, usa
raw_input
.Dato che state scrivendo per Python 3.x, vorrete iniziare il vostro script con:
Se usate:
Questi vanno nella prima linea del tuo script, se non c'è niente che inizia con #! (anche detto shebang).
Se i vostri script iniziano solo con:
Allora puoi cambiarlo in:
Anche se questa formattazione più corta è riconosciuta solo da alcuni programmi, come il launcher, quindi non è la scelta migliore.
I primi due esempi sono molto più usati e vi aiuteranno a garantire che il vostro codice funzioni su qualsiasi macchina che abbia Python installato.