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 funzione raw_input
in Python 2.7, che non valuterà le stringhe lette.
Se state usando Python 3.x, raw_input
è stato rinominato in input
. Citando le note di rilascio di Python 3.0,
raw_input()
è stato rinominato in input()
. Cioè, la nuova funzione input()
legge una linea da sys.stdin
e la restituisce con la newline finale rimossa. Solleva un EOFError
se l'input viene terminato prematuramente. Per ottenere il vecchio comportamento di input()
, usate eval(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 segue
input = eval(raw_input)
Considerate il seguente pezzo di codice per capirlo meglio
>>> dude = "thefourtheye"
>>> input_variable = input("Enter your name: ")
Enter your name: dude
>>> input_variable
'thefourtheye'
input
accetta una stringa dall'utente e la valuta nel contesto Python corrente. Quando digito dude
come input, trova che dude
è legato al valore thefourtheye
e quindi il risultato della valutazione diventa thefourtheye
e viene assegnato a input_variable
.
Se inserisco qualcos'altro che non è presente nel contesto python corrente, fallirà con il 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
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 con import os
, e poi l'utente digita
os.remove("/etc/hosts")
questo 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
.
>>> dude = "thefourtheye"
>>> input("Enter your name: ")
Enter your name: input("Enter your name again: ")
Enter your name again: dude
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 prompt Enter your name again:
.
Quindi, è meglio usare la funzione raw_input
, come questa
input_variable = raw_input("Enter your name: ")
Se 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 funzione int
, 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 al raw_input
di Python 2.7.
Dato che state scrivendo per Python 3.x, vorrete iniziare il vostro script con:
#!/usr/bin/env python3
Se usate:
#!/usr/bin/env python
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:
#! python
Allora puoi cambiarlo in:
#! python3
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.