erro input () - NameError: name '…' não está definido

219

Estou recebendo um erro ao tentar executar este script simples:

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

Digamos que eu digite "cara", o erro que estou recebendo é:

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

Estou executando esses scripts com Python 2.7.

chillpenguin
fonte
12
Você tem certeza que é Python 3.3? Eu esperaria inputme comportar dessa maneira, mas apenas no 2.7. O que diz quando você executa a python --versionpartir de um prompt de comando? Como alternativa, e se você escrever import sys; print(sys.version)no início do seu script?
Kevin Kevin
1
Você não estiver executando Python 3. Você está correndo Python 2, de alguma forma (eu não estou familiarizado com este app "Python Launcher")
Wooble
1
Coloque como primeira linha import syse como segunda linha print(sys.version_info)para verificar qual versão você está usando.
precisa
1
Eu fiz o que Kevin disse e é a versão 2.7.5! Não tenho certeza de como. Baixei e instalei a versão 3.3. Na pasta de aplicativos, há uma pasta chamada "Python 3.3". Dentro dessa pasta, existe um aplicativo chamado "Python Launcher" e estou executando meus scripts arrastando e soltando-os no aplicativo Python Launcher . Por que ainda estou usando o 2.7 quando estou usando o aplicativo iniciador 3.3?
Chillpenguin
2
@chillpenguin: confira a caixa de diálogo Preferências do Python Launcher. Aparentemente, não é padrão executar a versão com a qual foi instalado, o que é ... burro. (Eu nunca usei-me; eu acho usando o Terminal é melhor ...)
Wooble

Respostas:

265

TL; DR

inputfunção no Python 2.7, avalia o que você digitar, como uma expressão Python. Se você simplesmente quiser ler strings, use a raw_inputfunção no Python 2.7, que não avaliará as strings de leitura.

Se você estiver usando o Python 3.x, raw_inputfoi renomeado para input. Citando as notas de versão do Python 3.0 ,

raw_input()foi renomeado para input(). Ou seja, a nova input()função lê uma linha sys.stdine a retorna com a nova linha à direita retirada. Aumenta EOFErrorse a entrada for finalizada prematuramente. Para obter o comportamento antigo de input(), useeval(input())


No Python 2.7 , existem duas funções que podem ser usadas para aceitar entradas do usuário. Um é inpute o outro é raw_input. Você pode pensar na relação entre eles da seguinte maneira

input = eval(raw_input)

Considere o seguinte trecho de código para entender melhor isso

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

inputaceita uma string do usuário e avalia a string no contexto atual do Python. Quando digito dudecomo entrada, ele descobre que dudeestá vinculado ao valor thefourtheyee, portanto, o resultado da avaliação se torna thefourtheyee ao qual é atribuído input_variable.

Se eu inserir outra coisa que não existe no contexto atual do python, ela falhará 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

Considerações de segurança com o Python 2.7 input:

Como qualquer tipo de usuário é avaliado, ele também impõe problemas de segurança. Por exemplo, se você já carregouos módulo em seu programa e import os, em seguida, o usuário digita

os.remove("/etc/hosts")

isso será avaliado como uma expressão de chamada de função por python e será executado. Se você estiver executando o Python com privilégios elevados,/etc/hosts arquivo será excluído. Veja, quão perigoso poderia ser?

Para demonstrar isso, vamos tentar executar a inputfunção novamente.

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

Agora quando input("Enter your name: ") é executado, aguarda a entrada do usuário e a entrada do usuário é uma chamada de função Python válida e, portanto, também é chamada. É por isso que estamos vendoEnter your name again: aviso novamente.

Então, você está melhor com a raw_inputfunção, assim

input_variable = raw_input("Enter your name: ")

Se você precisar converter o resultado em outro tipo, poderá usar as funções apropriadas para converter a sequência retornada por raw_input. Por exemplo, para ler entradas como números inteiros, use a intfunção, como mostrado em nesta resposta .

No python 3.x , existe apenas uma função para obter entradas do usuário e isso é chamado input, o que é equivalente ao Python 2.7 raw_input.

thefourtheye
fonte
56

Você está executando o Python 2, não o Python 3. Para que isso funcione no Python 2, use raw_input.

input_variable = raw_input ("Enter your name: ")
print ("your name is" + input_variable)
davidism
fonte
17

Como você está escrevendo para o Python 3.x, você deve começar seu script com:

#!/usr/bin/env python3

Se você usar:

#!/usr/bin/env python

O padrão será o Python 2.x. Eles vão para a primeira linha do seu script, se não houver nada que comece com #! (aka o shebang).

Se seus scripts começarem com:

#! python

Então você pode alterá-lo para:

#! python3

Embora essa formatação mais curta seja reconhecida apenas por alguns programas, como o iniciador, não é a melhor opção.

Os dois primeiros exemplos são muito mais usados ​​e ajudarão a garantir que seu código funcione em qualquer máquina com o Python instalado.

Zim
fonte
6

Você deve usar raw_inputporque está usando python-2.7. Quando você usa input()uma variável (por exemplo s = input('Name: '):), ele executa o comando ON no ambiente Python sem salvar o que você escreveu na variável (s ) e cria um erro se o que você escreveu não estiver definido.

raw_input()salva corretamente o que você escreveu na variável (por exemplo f = raw_input('Name : '):) e não a executa no ambiente Python sem criar nenhum erro possível:

input_variable = raw_input('Enter Your Name : ')
print("Your Name Is  : " + (input_variable))
Skiller Dz
fonte
5

Para python 3 e acima

s = raw_input()

resolverá o problema no pycharm IDE se você estiver resolvendo no site on-line exatamente hackerrank e use:

s = input()
RAHUL KUMAR
fonte
4

Você pode fazer:

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

ou:

x = str(input("enter your name"))
print "your name is %s" % x
Abdullah Baraka
fonte
1
raw_input corrigiu o problema para mim
Spencer Goff
Mas raw_input () não está disponível em Python 3.
carthurs
4
input_variable = input ("Enter your name: ")
print ("your name is" + input_variable)

Você deve inserir a entrada entre aspas simples ou duplas

Ex:'dude' -> correct

    dude -> not correct
Parminder Singh
fonte
4

Eu também encontrei esse problema com um módulo que deveria ser compatível com python 2.7 e 3.7

o que encontrei para corrigir o problema estava sendo importado:

from six.moves import input

isso corrigiu a usabilidade dos dois intérpretes

você pode ler mais sobre as seis bibliotecas aqui

Elad L.
fonte
3

Estamos usando o seguinte que funciona tanto em python 2 quanto em python 3

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

Para qualquer outra pessoa que possa se deparar com esse problema, acontece que, mesmo que você inclua #!/usr/bin/env python3 no início do script, o shebang será ignorado se o arquivo não for executável.

Para determinar se seu arquivo é ou não executável:

  • executar a ./filename.pypartir da linha de comando
  • se você conseguir -bash: ./filename.py: Permission denied, corrachmod a+x filename.py
  • corra ./filename.pynovamente

Se você incluiu import sys; print(sys.version)como Kevin sugeriu, agora verá que o script está sendo interpretado por python3

automonous
fonte
2

Boas contribuições as anteriores.

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: "))
Digite seu nome: Joe
('Oi', 'Joe', <tipo 'str'>)
Oi Joe, tchau 

Seu nome: Joe
Joe

Obrigado!

Joe Llerena
fonte
1

Existem duas maneiras de corrigir esses problemas,

  • O primeiro é simples, sem alteração de código que
    executa o seu script pelo Python3,
    se você ainda deseja executar no python2 , depois de executar o script python, ao inserir a entrada, lembre-se

    1. se você quiser entrar string, basta começar a digitar com "input vai com aspas duplas" e funcionará em python2.7 e
    2. se você quiser inserir um caractere, use a entrada com aspas simples como 'sua entrada vai aqui'
    3. se você quiser inserir um número que não seja um problema, basta digitar o número
  • A segunda maneira é com alterações de código,
    use a importação abaixo e execute com qualquer versão do python

    1. from six.moves import input
    2. Use a raw_input()função em vez da input()função no seu código com qualquer importação
    3. higienize seu código com a str()função like str(input())e, em seguida, atribua a qualquer variável

Como o erro implica : o
nome 'cara' não está definido, ou seja, para python 'cara' se torna variável aqui e não está tendo nenhum valor do tipo definido em python atribuído;
portanto, apenas está chorando como bebê; se definirmos uma variável 'cara' e atribuirmos qualquer valor e passar para ele, funcionará, mas não é isso que queremos, pois não sabemos em que usuário o usuário entrará e, além disso, queremos capturar a entrada do usuário.

Fato sobre este método:
input() function: Esta função aceita o valor e o tipo da entrada que você digita como está, sem modificá-lo.
raw_input() function: Esta função converte explicitamente a entrada que você fornece para o tipo string,

Nota:
A vulnerabilidade no método input () está no fato de que a variável que acessa o valor da entrada pode ser acessada por qualquer pessoa apenas usando o nome da variável ou do método.

Naval Kishor Jha
fonte
0

Você pode alterar qual python você está usando com o IDE, se você já baixou o python 3.x, não deve ser muito difícil mudar. Mas seu script funciona bem no python 3.x, eu mudaria

print ("your name is" + input_variable)

para

print ("your name is", input_variable)

Porque com a vírgula, ela é impressa com um espaço em branco no meio your name ise o que o usuário inseriu. AND: se você estiver usando 2.7, basta usar em raw_inputvez de inserir.

Cleve Green
fonte