Como uso raw_input no Python 3

553
import sys
print(sys.platform)
print(2**100)
raw_input()

Estou usando o Python 3.1 e não consigo raw_input"congelar" o pop-up dos. O livro que estou lendo é para Python 2.5 e estou usando Python 3.1

O que devo fazer para corrigir isso?

Lonnie Price
fonte
1
Estou obtendo NameError: o nome 'raw_input' não é definido quando estou tentando usar seu código. você não consegue o mesmo?
SilentGhost 5/06/09
9
Mudou muito no Python 3, então provavelmente você não deve tentar dominá-lo usando um livro para 2.5 (que é realmente antigo).
Niklas B.
5
raw_input foi renomeado para entrada em python 3
honra krystan
Obtendo um erro http 401 quando sigo o link Oauth2
Big Ian

Respostas:

1011

A partir do Python 3, raw_input()foi renomeado para input().

Do que há de novo no Python 3.0, segundo item da seção Builtins .

balpha
fonte
56
Originalmente, havia uma função input () que agia como a avaliação atual (input ()). Foi uma sobra de quando Python estava menos consciente da segurança. A mudança simplificou o idioma. Veja também "importar isto" para uma explicação mais profunda. Você prefere uma língua morta a uma que evolua? Existem muitos por aí.
precisa saber é
9
Estou aprendendo python também e encontrei uma diferença entre input()e raw_input(). a = input()pegará a entrada do usuário e a colocará no tipo correto. Por exemplo: se o usuário digitar 5, o valor em aé o número 5. a = raw_input()receberá a entrada do usuário e a colocará como uma string. Por exemplo: se o usuário digitar 5, o valor em aé a string '5' e não um número inteiro. Pensei que poderia ser uma boa informação para iniciantes em python como eu.
Vishnu Narang 05/03
10
@VishnuNarang Sim, isso é correto em Python 2. Mas em Python 3, esse comportamento mudou, e de entrada faz o raw_input fez em Python 2.
balpha
4
@balpha: Apenas verificado. Você está certo. Eu tenho python 2.7 (Não é possível editar a resposta de mencionar que ...)
Vishnu Narang
3
@meawoppl Passar do python 2 para o 3 era para quebrar. Isso não significa que tinha que ser. Um idioma pode evoluir sem morrer e sem alterar a assinatura da função. Ajuda se você não tiver funções globais. Comece com uma retrospectiva de outros idiomas. Etc. A remoção de funções também não está fora da mesa.
precisa saber é o seguinte
117

Isso funciona no Python 3.xe 2.x:

# Fix Python 2.x.
try: input = raw_input
except NameError: pass
print("Hi " + input("Say something: "))
Cees Timmerman
fonte
4
Eu estava tendo um problema de escopo com essa abordagem. Corrigido com um global inputna parte superior da função de chamada.
kevlar1818
1
Isto parece um pouco mais limpo para mim: import __builtin__; input = getattr(__builtin__, 'raw_input', input)
mbarkhau
3
Python 3 não possui um módulo chamado __builtin__.
Cees Timmerman
@mbarkhau: é muito global. E se você chamar uma biblioteca que não espera isso? __builtin__é renomeado para builtinsno Python 3. Ambos estão disponíveis como __builtins__no CPython.
JFS
3
getattr(__builtins__, 'raw_input', input)retorna o padrão quando importado no Python 2.7.2.
precisa
45

Uma maneira confiável de resolver isso é

from six.moves import input

six é um módulo que corrige muitos dos 2/3 pontos problemáticos básicos do código.

Tacaswell
fonte
1
Boa ideia ... e, se o fizer from six.moves import input as raw_input, você pode manter raw_inputseu script e executar usando as duas versões do Python.
Eddy85br 13/12/19
15

Como outros indicaram, a raw_inputfunção foi renomeada inputno Python 3.0, e você realmente seria melhor atendido por um livro mais atualizado, mas quero ressaltar que existem maneiras melhores de ver a saída do seu script .

Na sua descrição, acho que você está usando o Windows, salvou um .py arquivo e clicou duas vezes nele para executá-lo. A janela do terminal exibida fecha assim que o programa termina, para que você não possa ver qual foi o resultado do programa. Para resolver isso, seu livro recomenda adicionar uma instrução raw_input/ inputpara aguardar até que o usuário pressione Enter. No entanto, como você viu, se algo der errado, como um erro no seu programa, essa instrução não será executada e a janela será fechada sem que você possa ver o que deu errado. Você pode achar mais fácil usar um prompt de comando ou IDLE.

Use um prompt de comando

Quando você estiver olhando para a janela da pasta que contém o seu programa Python, mantenha pressionada a tecla Shift e clique com o botão direito do mouse em qualquer lugar na área branca da janela. O menu exibido deve conter a entrada "Abrir janela de comando aqui". (Eu acho que isso funciona no Windows Vista e Windows 7.) Isso abrirá uma janela de prompt de comando que se parece com isso:

    Microsoft Windows [Version 6.1.7601]
    Copyright (c) 2009 Microsoft Corporation.  All rights reserved.

    C:\Users\Weeble\My Python Program>_

Para executar seu programa, digite o seguinte (substituindo o nome do script):

    python myscript.py

... e pressione enter. (Se você receber um erro que "python" não é um comando reconhecido, consulte http://showmedo.com/videotutorials/video?name=960000&fromSeriesID=96 ) Quando o programa termina a execução, seja com êxito ou não, a janela permanecerá aberto e o prompt de comando aparecerá novamente para você digitar outro comando. Se você deseja executar o programa novamente, pressione a seta para cima para recuperar o comando anterior digitado e pressione enter para executá-lo novamente, em vez de digitar o nome do arquivo todas as vezes.

Use IDLE

O IDLE é um editor de programa simples que é instalado com o Python. Entre outros recursos, ele pode executar seus programas em uma janela. Clique com o botão direito do mouse no seu .pyarquivo e escolha "Editar no IDLE". Quando o seu programa aparecer no editor, pressione F5 ou escolha "Executar módulo" no menu "Executar". Seu programa será executado em uma janela que permanece aberta após o término do programa e na qual você pode inserir comandos Python para serem executados imediatamente.

Weeble
fonte
O IDLE está instalado no Windows? Rodar Ocioso ou inativo no meu terminal fica vazio.
vgoff
1
O IDLE é instalado com o Python no Windows. Ele aparece como um atalho no menu Iniciar e como uma associação de arquivos .py, mas acho que não há nenhum comando 'inativo' adicionado ao seu caminho por padrão. Se você quiser iniciá-lo a partir da linha de comando, você pode executarpythonw -m idlelib.idle
Weeble
Isso explica tudo. Eu apenas toco no Windows para ganhar dinheiro, não como um sistema operacional. Eu diria que sua seção "Usar IDLE" é tendenciosa. Você deve mencionar a seletividade, talvez.
vgoff
3
Eu não tenho certeza se entendi. A pergunta era específica do Windows. Ele fala sobre um "pop-up do DOS". O IDLE é instalado como parte do Python, mas alguns distribuidores podem separá-lo. Por exemplo, no Ubuntu, parece que você precisa instalá-lo como um pacote separado. A resposta já está sugerindo uma abordagem diferente da solicitada pelo pesquisador, por isso prefiro não acrescentar mais tangentes. FWIW Uso o Linux em casa e só uso o Windows onde preciso trabalhar.
21713 Weeble
DOS sendo um acrônimo para vários sistemas operacionais intimamente relacionados que dominaram o mercado compatível com PC IBM entre 1981 e 1995, ou até cerca de 2000, incluindo o Microsoft Windows parcialmente baseado nas versões 95, 98 e Millennium Edition.
vgoff
7

A solução da Timmerman funciona muito bem ao executar o código, mas se você não deseja obter Undefined nameerros ao usar pyflakes ou um linter similar, pode usar o seguinte:

try:
    import __builtin__
    input = getattr(__builtin__, 'raw_input')
except (ImportError, AttributeError):
    pass
jmagnusson
fonte
Eh, eu ainda estou recebendo muitos erros em pylint: Redefining built-in 'input' (redefined-builtin), Unable to import '__builtin__' (import-error), Invalid constant name "input" (invalid-name).
perfil completo de Babken Vardanyan
O @BabkenVardanyan pylint é notoriamente rigoroso quando se trata de estilo de código. Eu recomendaria, flake8ou pyflakesnão, o dia todo, com avisos sem sentido.
precisa saber é o seguinte
6

Aqui está um pedaço de código que eu coloquei nos meus scripts que não quero executar no ambiente py2 / 3-agnóstico:

# Thank you, python2-3 team, for making such a fantastic mess with
# input/raw_input :-)
real_raw_input = vars(__builtins__).get('raw_input',input)

Agora você pode usar real_raw_input. É muito caro, mas curto e legível. O uso de entrada bruta geralmente custa muito tempo (aguardando entrada), portanto não é importante.

Em teoria, você pode até atribuir raw_input em vez de real_raw_input, mas pode haver módulos que verifiquem a existência de raw_input e se comportem de acordo. É melhor ficar do lado seguro.

ChewbaccaKL
fonte
Eu recebo isso quando tentei: inputcons = vars ( builtins ) .get ('raw_input', input) TypeError: argumento vars () deve ter atributo dict
0

Provavelmente não é a melhor solução, mas antes de vir para cá, fiz isso rapidamente para continuar trabalhando sem ter uma rápida pausa nos estudos.

def raw_input(x):
  input(x)

Então, quando executo raw_input('Enter your first name: ')o script em que estava trabalhando, ele o captura como o input()faria.

Pode haver uma razão para não fazer isso, que eu ainda não encontrei!

Danijel-James W
fonte
7
Por que não apenas raw_input = input?
Tonypdmtr