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 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 
  File "", line 1, in 
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.

Commentari (0)

Stai usando Python 2, non Python 3. Per farlo funzionare in Python 2, usa raw_input.

input_variable = raw_input ("Enter your name: ")
print ("your name is" + input_variable)
Commentari (0)

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.

Commentari (0)