errore input () - NameError: il nome '…' non è definito


221

Ricevo un errore quando provo a eseguire questo semplice script:

input_variable = input ("Enter your name: ")
print ("your name is" + input_variable)

Diciamo che scrivo "amico", l'errore che sto ricevendo è:

line 1, in <module>
input_variable = input ("Enter your name: ")
File "<string>", line 1, in <module>
NameError: name 'dude' is not defined

Sto eseguendo questi script con Python 2.7.


12
Sei sicuro che sia Python 3.3? Mi aspetterei inputdi comportarmi in questo modo, ma solo in 2.7. Cosa dice quando si esegue python --versionda un prompt dei comandi? In alternativa, cosa succede se scrivi import sys; print(sys.version)all'inizio della tua sceneggiatura?
Kevin,

1
Non stai eseguendo Python 3. Stai eseguendo Python 2, in qualche modo (non ho familiarità con questa app "Python Launcher")
Wooble

1
Inserisci come prima riga import syse come seconda riga print(sys.version_info)per verificare quale versione stai utilizzando.
Iperboro,

1
Ho fatto quello che ha detto Kevin ed è la versione 2.7.5! Non sono sicuro di come. Ho scaricato e installato la versione 3.3, nella mia cartella applicazioni c'è una cartella che si chiama "Python 3.3" all'interno di quella cartella c'è un'app chiamata "Python Launcher" e sto eseguendo i miei script trascinandoli sull'app Python Launcher . Come mai sto ancora usando 2.7 quando sto usando l'app 3.3 launcher?
Chillpenguin,

2
@chillpenguin: controlla la finestra di dialogo Preferenze per Python Launcher. Apparentemente non si esegue di default la versione con cui è stato installato, che è ... stupido. (Non l'ho mai usato da solo; trovo che usare il Terminale sia meglio ...)
Wooble il

Risposte:


265

TL; DR

inputfunzione in Python 2.7, valuta qualunque sia la tua immissione, come espressione di Python. Se vuoi semplicemente leggere le stringhe, usa la raw_inputfunzione in Python 2.7, che non valuterà le stringhe di lettura.

Se stai 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 input()funzione legge una riga sys.stdine la restituisce con la nuova riga finale rimossa. Aumenta EOFErrorse l'ingresso viene interrotto prematuramente. Per ottenere il vecchio comportamento di input(), utilizzareeval(input())


In Python 2.7 , ci sono due funzioni che possono essere utilizzate per accettare input dell'utente. Uno è inpute l'altro è raw_input. Puoi pensare alla relazione tra loro come segue

input = eval(raw_input)

Considera il seguente pezzo di codice per capirlo meglio

>>> dude = "thefourtheye"
>>> input_variable = input("Enter your name: ")
Enter your name: dude
>>> input_variable
'thefourtheye'

inputaccetta una stringa dall'utente e valuta la stringa nel contesto Python corrente. Quando digito dudecome input, trova che dudeè legato al valore thefourtheyee quindi il risultato della valutazione diventa thefourtheyee al quale viene assegnato input_variable.

Se inserisco qualcos'altro che non è presente nell'attuale contesto di Python, fallirà 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 input:

Poiché qualsiasi tipo di utente viene valutato, impone anche problemi di sicurezza. Ad esempio, se hai già caricato il osmodulo nel tuo programma con import os, e quindi l'utente digita

os.remove("/etc/hosts")

questo verrà valutato come espressione di chiamata di funzione da Python e verrà eseguito. Se si esegue Python con privilegi elevati, il /etc/hostsfile verrà eliminato. Vedi, quanto potrebbe essere pericoloso?

Per dimostrarlo, proviamo di inputnuovo ad eseguire la funzione.

>>> dude = "thefourtheye"
>>> input("Enter your name: ")
Enter your name: input("Enter your name again: ")
Enter your name again: dude

Ora, quando input("Enter your name: ")viene eseguito, attende l'input dell'utente e l'input dell'utente è un richiamo della funzione Python valido e quindi viene anche invocato. Ecco perché stiamo vedendo di Enter your name again:nuovo pronto.

Quindi, stai meglio con la raw_inputfunzione, in questo modo

input_variable = raw_input("Enter your name: ")

Se è necessario convertire il risultato in un altro tipo, è possibile utilizzare le funzioni appropriate per convertire la stringa restituita da raw_input. Ad esempio, per leggere gli input come numeri interi, utilizzare la intfunzione, come mostrato in questa risposta .

In python 3.x , c'è solo una funzione per ottenere input utente e si chiama input, che è equivalente a Python 2.7 raw_input.


56

Stai eseguendo 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)

17

Dato che stai scrivendo per Python 3.x, ti consigliamo di iniziare lo script con:

#!/usr/bin/env python3

Se usi:

#!/usr/bin/env python

L'impostazione predefinita è Python 2.x. Questi vanno sulla prima riga del tuo script, se non c'è nulla che inizia con #! (aka lo shebang).

Se i tuoi script iniziano con:

#! python

Quindi puoi cambiarlo in:

#! python3

Sebbene questa formattazione più breve sia riconosciuta solo da alcuni programmi, come il launcher, non è la scelta migliore.

I primi due esempi sono molto più ampiamente utilizzati e contribuiranno a garantire che il codice funzioni su qualsiasi macchina su cui è installato Python.


6

Dovresti usarlo raw_inputperché stai usando python-2.7. Quando lo usi input()su una variabile (ad esempio s = input('Name: '):), eseguirà il comando ON nell'ambiente Python senza salvare ciò che hai scritto sulla variabile ( s) e creerà un errore se ciò che hai scritto non è definito.

raw_input()salverà correttamente ciò che hai scritto sulla variabile (ad esempio:) f = raw_input('Name : ')e non lo eseguirà nell'ambiente Python senza creare alcun errore possibile:

input_variable = raw_input('Enter Your Name : ')
print("Your Name Is  : " + (input_variable))

5

Per python 3 e versioni successive

s = raw_input()

risolverà il problema su pycharm IDE se si sta risolvendo esattamente sul sito online hackerrank quindi utilizzare:

s = input()

4

Puoi fare:

x = raw_input("enter your name")
print "your name is %s " % x

o:

x = str(input("enter your name"))
print "your name is %s" % x

1
raw_input ha risolto il problema per me
Spencer Goff l'

Ma raw_input () non è disponibile in Python 3.
carthurs

4
input_variable = input ("Enter your name: ")
print ("your name is" + input_variable)

Devi inserire un input tra virgolette singole o doppie

Ex:'dude' -> correct

    dude -> not correct

4

Ho anche riscontrato questo problema con un modulo che doveva essere compatibile con Python 2.7 e 3.7

quello che ho trovato per risolvere il problema era l'importazione:

from six.moves import input

questo ha risolto l'usabilità per entrambi gli interpreti

puoi leggere di più sulla sei biblioteca qui


3

Stiamo usando quanto segue che funziona sia su Python 2 che su Python 3

#Works in Python 2 and 3:
try: input = raw_input
except NameError: pass
print(input("Enter your name: "))

2

Per chiunque possa riscontrare questo problema, risulta che anche se includi #!/usr/bin/env python3all'inizio dello script, lo shebang viene ignorato se il file non è eseguibile.

Per determinare se il file è eseguibile o meno:

  • eseguito ./filename.pydalla riga di comando
  • se hai -bash: ./filename.py: Permission denied, corrichmod a+x filename.py
  • corri di ./filename.pynuovo

Se hai incluso import sys; print(sys.version)come suggerito Kevin, ora vedrai che lo script viene interpretato da python3


2

Buoni contributi ai precedenti.

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: "))
Inserisci il tuo nome: Joe
('Ciao', 'Joe', <digitare 'str'>)
Ciao Joe, ciao 

Il tuo nome: Joe
Joe

Grazie!


1

Esistono due modi per risolvere questi problemi,

  • Il primo è semplice senza la modifica del codice che viene
    eseguito lo script da Python3,
    se si desidera ancora eseguire su python2, dopo aver eseguito lo script python, quando si immette l'input tenere presente

    1. se vuoi entrare, stringinizia a digitare con "input va con virgolette doppie" e funzionerà in python2.7 e
    2. se vuoi inserire un carattere, usa l'input con una singola virgoletta come "il tuo input va qui"
    3. se si desidera inserire il numero non un problema, è sufficiente digitare il numero
  • Il secondo modo è con le modifiche al codice,
    usa l'importazione sotto ed esegui con qualsiasi versione di Python

    1. from six.moves import input
    2. Utilizzare la raw_input()funzione anziché la input()funzione nel codice con qualsiasi importazione
    3. disinfetta il tuo codice con una str()funzione simile str(input())e quindi assegna a qualsiasi variabile

Come suggerisce l'errore : il
nome 'amico' non è definito, cioè per Python 'amico' diventa variabile qui e non ha alcun valore del tipo definito da Python assegnato
quindi solo il suo pianto come bambino quindi se definiamo una variabile 'amico' e assegniamo qualsiasi valore e passarci sopra, funzionerà ma non è quello che vogliamo perché non sappiamo quale utente entrerà e inoltre vogliamo catturare l'input dell'utente.

Informazioni su questo metodo:
input() funzione: questa funzione prende il valore e il tipo di input inserito così com'è senza modificarlo.
raw_input() funzione: questa funzione converte esplicitamente l'input fornito in stringa di tipo,

Nota:
la vulnerabilità del metodo input () risiede nel fatto che la variabile che accede al valore dell'input è accessibile a chiunque semplicemente usando il nome della variabile o del metodo.


0

Puoi cambiare quale Python stai usando con il tuo IDE, se hai già scaricato Python 3.x non dovrebbe essere troppo difficile cambiare. Ma il tuo script funziona bene su Python 3.x, vorrei solo cambiare

print ("your name is" + input_variable)

per

print ("your name is", input_variable)

Perché con la virgola si stampa con uno spazio bianco in mezzo your name ise qualunque sia l'immissione dell'utente. E: se stai usando 2.7, usa semplicemente raw_inputinvece di input.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.