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 parainput()
. Ou seja, a nova funçãoinput()
lê uma linha desys.stdin
e a retorna com a nova linha despojada. Ela levantaEOFError
se a entrada for terminada prematuramente. Para obter o comportamento antigo deinput()
, utilizeeval(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 <module>
File "<string>", line 1, in <module>
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
.
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.