Come uso raw_input in Python 3


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

Sto usando Python 3.1 e non riesco raw_inputa "congelare" il pop-up dos. Il libro che sto leggendo è per Python 2.5 e sto usando Python 3.1

Cosa devo fare per risolvere questo problema?


1
hm, sto ottenendo NameError: il nome 'raw_input' non è definito quando sto cercando di usare il tuo codice. non ottieni lo stesso?
SilentGhost,


9
In Python 3 sono cambiate molte cose, quindi probabilmente non dovresti provare a padroneggiarlo usando un libro per 2.5 (che è davvero vecchio).
Niklas B.

5
raw_input è stato rinominato per essere inserito in python 3
krystan honor

Ricevi un errore http 401 quando seguo il link Oauth2
Big Ian

Risposte:


1011

A partire da Python 3, è raw_input()stato rinominato in input().

Da Novità In Python 3.0, sezione builtin seconda voce.


56
Inizialmente c'era una funzione input () che si comportava in modo simile all'attuale eval (input ()). È stato un residuo di quando Python era meno attento alla sicurezza. La modifica ha semplificato la lingua. Vedi anche "importa questo" per una spiegazione più approfondita. Preferiresti una lingua morta a una che si evolve? Ce ne sono molti in giro.
meawoppl

9
Sto imparando anche Python e ho trovato una differenza tra input()e raw_input(). a = input()prenderà l'input dell'utente e lo inserirà nel tipo corretto. Ad esempio: se l'utente digita 5, il valore in aè intero 5. a = raw_input()prenderà l'input dell'utente e lo inserirà come una stringa. Ad esempio: se l'utente digita 5, il valore in aè stringa '5' e non un numero intero. Ho pensato che potesse essere una buona informazione per i neofiti di Python come me.
Vishnu Narang

10
@VishnuNarang Yep, corretto in Python 2. Ma in Python 3, questo comportamento è cambiato e l'input fa quello che ha fatto raw_input in Python 2.
balpha

4
@balpha: appena verificato. Hai ragione. Ho python 2.7 (Non riesco a modificare la risposta per dire che ...)
Vishnu Narang

3
@meawoppl Il passaggio da Python 2 a 3 avrebbe dovuto essere interrotto. Non significa che doveva essere. Una lingua può evolversi senza morire e senza cambiare la firma della funzione. Aiuta se non hai funzioni globali. Inizia con il senno di poi altre lingue. Ecc. La rimozione delle funzioni non è nemmeno fuori dalla tabella.
dlamblin,

117

Funziona con Python 3.xe 2.x:

# Fix Python 2.x.
try: input = raw_input
except NameError: pass
print("Hi " + input("Say something: "))

4
Stavo ricevendo un problema di portata con questo approccio. Risolto il problema con a global inputnella parte superiore della funzione chiamante.
kevlar1818,

1
Mi sembra un po 'più pulito: import __builtin__; input = getattr(__builtin__, 'raw_input', input)
mbarkhau,

3
Python 3 non ha un modulo chiamato __builtin__.
Cees Timmerman,

@mbarkhau: è troppo globale. E se chiami una libreria che non se lo aspetta? __builtin__viene rinominato builtinsin Python 3. Entrambi sono disponibili come __builtins__in CPython.
jfs

3
getattr(__builtins__, 'raw_input', input)restituisce il valore predefinito quando importato in Python 2.7.2.
Cees Timmerman,

45

Un modo affidabile per affrontare questo è

from six.moves import input

six è un modulo che corregge molti dei 2/3 punti deboli della base di codice comune.


1
Buona idea ... e se lo fai from six.moves import input as raw_input, puoi mantenere lo raw_inputscript ed eseguire usando entrambe le versioni di Python.
eddy85br,

15

Come altri hanno indicato, la raw_inputfunzione è stata rinominata inputin Python 3.0 e sarebbe davvero meglio essere servito da un libro più aggiornato, ma voglio sottolineare che ci sono modi migliori per vedere l'output del tuo script .

Dalla tua descrizione, penso che stai usando Windows, hai salvato un .pyfile e quindi fai doppio clic su di esso per eseguirlo. La finestra del terminale che si apre si chiude non appena termina il programma, quindi non è possibile vedere quale sia stato il risultato del programma. Per risolvere questo, il tuo libro consiglia di aggiungere un'istruzione raw_input/ inputper attendere fino a quando l'utente preme invio. Tuttavia, come hai visto, se qualcosa va storto, come un errore nel tuo programma, quell'istruzione non verrà eseguita e la finestra si chiuderà senza che tu sia in grado di vedere cosa è andato storto. Potrebbe essere più semplice utilizzare un prompt dei comandi o IDLE.

Utilizzare un prompt dei comandi

Quando stai guardando la finestra della cartella che contiene il tuo programma Python, tieni premuto MAIUSC e fai clic con il pulsante destro del mouse in un punto qualsiasi dell'area dello sfondo bianco della finestra. Il menu che si apre dovrebbe contenere una voce "Apri finestra di comando qui". (Penso che funzioni su Windows Vista e Windows 7.) Si aprirà una finestra del prompt dei comandi simile a questa:

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

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

Per eseguire il programma, digitare quanto segue (sostituendo il nome dello script):

    python myscript.py

... e premi Invio. (Se viene visualizzato l'errore che "python" non è un comando riconosciuto, consultare http://showmedo.com/videotutorials/video?name=960000&fromSeriesID=96 ) Al termine dell'esecuzione del programma, indipendentemente dal fatto che si completi o meno, la finestra rimarrà aperto e verrà visualizzato di nuovo il prompt dei comandi per digitare un altro comando. Se si desidera eseguire nuovamente il programma, è possibile premere la freccia su per richiamare il comando precedente immesso e premere Invio per eseguirlo nuovamente, anziché dover digitare il nome del file ogni volta.

Usa IDLE

IDLE è un semplice editor di programmi che viene installato con Python. Tra le altre funzionalità, puoi eseguire i tuoi programmi in una finestra. Fai clic con il pulsante destro del mouse sul .pyfile e scegli "Modifica in IDLE". Quando il tuo programma appare nell'editor, premi F5 o scegli "Esegui modulo" dal menu "Esegui". Il programma verrà eseguito in una finestra che rimane aperta al termine del programma e in cui è possibile immettere i comandi Python per l'esecuzione immediata.


IDLE è installato con Windows? L'esecuzione di IDLE o di inattività nel mio terminale risulta vuota.
vgoff

1
IDLE è installato con Python su Windows. Appare come una scorciatoia nel menu di avvio e come un'associazione di file per i file .py, ma non credo che ci sia alcun comando 'inattivo' aggiunto al tuo percorso per impostazione predefinita. Se si desidera avviarlo dalla riga di comando, è possibile eseguirepythonw -m idlelib.idle
Weeble

Questo lo spiega. Tocco solo Windows per fare soldi, non come sistema operativo. Vorrei quindi dire che la sezione "Usa IDLE" è quindi distorta. Dovresti menzionare la selettività, forse.
vgoff,

3
Non sono sicuro di capire. La domanda era specifica di Windows. Parla di un "popup DOS". IDLE è installato come parte di Python, ma alcuni distributori potrebbero separarlo. Ad esempio, in Ubuntu sembra che sia necessario installarlo come pacchetto separato. La risposta suggerisce già un approccio diverso da quello richiesto dall'interrogante, quindi preferirei non aggiungere ulteriori tangenti ad esso. FWIW Uso Linux a casa e uso Windows solo per lavoro.
Weeble,

DOS è l'acronimo di diversi sistemi operativi strettamente correlati che hanno dominato il mercato compatibile con PC IBM tra il 1981 e il 1995, o fino al 2000 circa, tra cui le versioni di Windows 95, 98 e Millennium Edition parzialmente basate su DOS.
vgoff

7

La soluzione di Timmerman funziona benissimo quando si esegue il codice, ma se non si desidera ottenere Undefined nameerrori quando si utilizzano pyflakes o una linter simile, è possibile utilizzare invece quanto segue:

try:
    import __builtin__
    input = getattr(__builtin__, 'raw_input')
except (ImportError, AttributeError):
    pass

Eh, sto ancora ricevendo un sacco di errori in pylint: Redefining built-in 'input' (redefined-builtin), Unable to import '__builtin__' (import-error), Invalid constant name "input" (invalid-name).
Babken Vardanyan,

Il pylint di @BabkenVardanyan è notoriamente rigoroso quando si tratta di stile del codice. Mi sento di raccomandare flake8o pyflakesin modo da non occupare tutto la giornata con avvisi senza senso.
jmagnusson,

6

Ecco un pezzo di codice che ho inserito nei miei script che non voglio eseguire in un ambiente py2 / 3-agnostic:

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

Ora puoi usare real_raw_input. È piuttosto costoso ma breve e leggibile. L'uso di input non elaborati di solito è costoso (in attesa di input), quindi non è importante.

In teoria, puoi anche assegnare raw_input invece di real_raw_input ma potrebbero esserci dei moduli che controllano l'esistenza di raw_input e si comportano di conseguenza. È meglio stare al sicuro.


Ottengo questo quando l'ho provato: inputcons = vars ( builtins ) .get ('raw_input', input) TypeError: l'argomento vars () deve avere l' attributo dict

0

Probabilmente non è la soluzione migliore, ma prima di venire qui ho fatto questo al volo per continuare a lavorare senza una breve pausa dallo studio.

def raw_input(x):
  input(x)

Quindi, quando eseguo raw_input('Enter your first name: ')lo script su cui stavo lavorando, lo cattura come input()farebbe.

Potrebbe esserci un motivo per non farlo, che non ho ancora incontrato!


7
Perché non solo raw_input = input?
tonypdmtr,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.