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?
192
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 parainput
. Citando as notas de lançamento do Python 3.0,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 formaConsidere o seguinte trecho de código para entender isto melhor
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 quedude
está vinculado ao valorthefourtheye
e assim o resultado da avaliação torna-sethefourtheye
e que é atribuído ainput_variable
.Se eu entrar outra coisa que não esteja lá no contexto atual da pitão, falhará o `NameError'.
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 comimportar os
, e então o usuário digita emisto 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.
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 vendoEnter o seu nome novamente:
prompt novamente.Então, você está melhor com a função 'raw_input', como esta
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çãoint
, 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'sraw_input
.Você está a executar Python 2, não Python 3. Para isto funcionar em Python 2, utilize
raw_input
.Já que você está escrevendo para Python 3.x, você'vai querer começar seu script com:
Se você usar:
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:
Então podes mudá-lo para:
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.