erro input() - NameError: nome '...' não está definido

Estou a receber um erro quando tento executar este simples script python:

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

Digamos que eu digito "dude" o erro que eu 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 rodando o Mac OS X 10.9.1 e estou usando o aplicativo Python Launcher que veio com a instalação do python 3.3 para rodar o script.

Editar: Percebi que estou de alguma forma rodando estes scripts com 2.7. Acho que a verdadeira questão é como eu executo meus scripts com a versão 3.3? Eu pensei que se eu arrastasse e largasse os meus scripts em cima da aplicação Python Launcher que está dentro da pasta Python 3.3 na minha pasta de aplicações que ela iria lançar os meus scripts usando a 3.3. Acho que este método ainda lança scripts com a versão 2.7. Então, como eu uso a 3.3?

**TL;DR***

A função "input" em Python 2.7, avalia o que quer que você entre, como uma expressão Python. Se você simplesmente quer ler strings, então utilize a função 'raw_input' em Python 2.7, que não irá avaliar as strings lidas.

Se você estiver utilizando o Python 3.x, raw_input foi renomeado para input. Citando as notas de lançamento do Python 3.0,

raw_input() foi renomeado para input(). Ou seja, a nova função input() lê uma linha de sys.stdin e a retorna com a nova linha despojada. Ela levanta EOFError se a entrada for terminada prematuramente. Para obter o comportamento antigo de input(), utilize eval(input())


Em Python 2.7, há duas funções que podem ser usadas para aceitar entradas do usuário. Uma é input e a outra é raw_input. Você pode pensar na relação entre elas da seguinte forma

input = eval(raw_input)

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

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

A 'entrada' aceita uma string do usuário e avalia a string no contexto atual do Python. Quando eu digito dude como input, ele descobre que dude está vinculado ao valor thefourtheye e assim o resultado da avaliação torna-se thefourtheye e que é atribuído a input_variable.

Se eu entrar outra coisa que não esteja lá no contexto atual da pitão, falhará o `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

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

Uma vez que qualquer tipo de usuário é avaliado, ele também impõe questões de segurança. Por exemplo, se você já carregou o módulo os em seu programa com importar os, e então o usuário digita em

os.remove("/etc/hosts")

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

Para demonstrar isso, deixe's tentar executar a função 'input' novamente.

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

Agora, quando input("Digite seu nome: ") é executado, ele espera pela entrada do usuário e a entrada do usuário é uma invocação válida da função Python e por isso também é invocada. É por isso que estamos vendo Enter o seu nome novamente: prompt novamente.

Então, você está melhor com a função 'raw_input', como esta

input_variable = raw_input("Enter your name: ")

Se você precisar converter o resultado para algum outro tipo, então você pode utilizar funções apropriadas para converter a string retornada por raw_input. Por exemplo, para ler entradas como inteiros, utilize a função int, como mostrado em esta resposta.

**Em python 3.x***, há apenas uma função para obter entradas do usuário e que se chama input, que é equivalente a Python 2.7's raw_input.

Comentários (0)

Você está a executar Python 2, não Python 3. Para isto funcionar em Python 2, utilize raw_input.

input_variable = raw_input ("Enter your name: ")
print ("your name is" + input_variable)
Comentários (0)

Já que você está escrevendo para Python 3.x, você'vai querer começar seu script com:

#!/usr/bin/env python3

Se você usar:

#!/usr/bin/env python

Ele irá por defeito para Python 2.x. Estes vão na primeira linha do seu script, se não houver nada que comece com #! (aka the shebang).

Se os teus guiões apenas começarem com:

#! python

Então podes mudá-lo para:

#! python3

Embora esta formatação mais curta seja reconhecida apenas por alguns programas, como o lançador, por isso não é a melhor escolha.

Os dois primeiros exemplos são muito mais amplamente utilizados e ajudarão a garantir que seu código funcionará em qualquer máquina que tenha o Python instalado.

Comentários (0)