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.
python
python-2.7
input
nameerror
chillpenguin
fonte
fonte
input
me comportar dessa maneira, mas apenas no 2.7. O que diz quando você executa apython --version
partir de um prompt de comando? Como alternativa, e se você escreverimport sys; print(sys.version)
no início do seu script?import sys
e como segunda linhaprint(sys.version_info)
para verificar qual versão você está usando.Respostas:
TL; DR
input
função no Python 2.7, avalia o que você digitar, como uma expressão Python. Se você simplesmente quiser ler strings, use araw_input
função no Python 2.7, que não avaliará as strings de leitura.Se você estiver usando o Python 3.x,
raw_input
foi renomeado parainput
. Citando as notas de versão do Python 3.0 ,No Python 2.7 , existem duas funções que podem ser usadas para aceitar entradas do usuário. Um é
input
e o outro éraw_input
. Você pode pensar na relação entre eles da seguinte maneiraConsidere o seguinte trecho de código para entender melhor isso
input
aceita uma string do usuário e avalia a string no contexto atual do Python. Quando digitodude
como entrada, ele descobre quedude
está vinculado ao valorthefourtheye
e, portanto, o resultado da avaliação se tornathefourtheye
e ao qual é atribuídoinput_variable
.Se eu inserir outra coisa que não existe no contexto atual do python, ela falhará
NameError
.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á carregou
os
módulo em seu programa eimport os
, em seguida, o usuário digitaisso 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
input
função novamente.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_input
função, assimSe 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 aint
funçã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.7raw_input
.fonte
Você está executando o Python 2, não o Python 3. Para que isso funcione no Python 2, use
raw_input
.fonte
Como você está escrevendo para o Python 3.x, você deve começar seu script com:
Se você usar:
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:
Então você pode alterá-lo para:
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.
fonte
Você deve usar
raw_input
porque está usando python-2.7. Quando você usainput()
uma variável (por exemplos = 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 exemplof = raw_input('Name : ')
:) e não a executa no ambiente Python sem criar nenhum erro possível:fonte
Para python 3 e acima
resolverá o problema no pycharm IDE se você estiver resolvendo no site on-line exatamente hackerrank e use:
fonte
Você pode fazer:
ou:
fonte
Você deve inserir a entrada entre aspas simples ou duplas
fonte
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:
isso corrigiu a usabilidade dos dois intérpretes
você pode ler mais sobre as seis bibliotecas aqui
fonte
Estamos usando o seguinte que funciona tanto em python 2 quanto em python 3
fonte
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:
./filename.py
partir da linha de comando-bash: ./filename.py: Permission denied
, corrachmod a+x filename.py
./filename.py
novamenteSe você incluiu
import sys; print(sys.version)
como Kevin sugeriu, agora verá que o script está sendo interpretado por python3fonte
Boas contribuições as anteriores.
Obrigado!
fonte
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
string
, basta começar a digitar com "input vai com aspas duplas" e funcionará em python2.7 eA segunda maneira é com alterações de código,
use a importação abaixo e execute com qualquer versão do python
from six.moves import input
raw_input()
função em vez dainput()
função no seu código com qualquer importaçãostr()
função likestr(input())
e, em seguida, atribua a qualquer variávelComo 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.
fonte
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
para
Porque com a vírgula, ela é impressa com um espaço em branco no meio
your name is
e o que o usuário inseriu. AND: se você estiver usando 2.7, basta usar emraw_input
vez de inserir.fonte