Wie verwende ich raw_input in Python 3?

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

Ich verwende Python 3.1 und kann raw_inputdas Dos-Popup nicht "einfrieren". Das Buch, das ich lese, ist für Python 2.5 und ich verwende Python 3.1

Was soll ich tun, um das zu beheben?

Lonnie Price
quelle
1
hm, ich erhalte NameError: Der Name 'raw_input' ist nicht definiert, wenn ich versuche, Ihren Code zu verwenden. Verstehst du nicht dasselbe?
SilentGhost
9
In Python 3 hat sich viel geändert, daher sollten Sie wahrscheinlich nicht versuchen, es mit einem Buch für 2.5 (das wirklich alt ist) zu beherrschen.
Niklas B.
5
raw_input wurde umbenannt in Eingabe in Python 3
krystan honor
Ich erhalte einen http 401-Fehler, wenn ich dem Oauth2-Link folge
Big Ian

Antworten:

1011

Beginnend mit Python 3 raw_input()wurde in umbenannt input().

Aus den Neuerungen in Python 3.0, Abschnitt Builtins, zweites Element.

balpha
quelle
56
Es gab ursprünglich eine Funktion input (), die so etwas wie die aktuelle Auswertung (input ()) wirkte. Es war ein Überbleibsel aus der Zeit, als Python weniger sicherheitsbewusst war. Die Änderung vereinfachte die Sprache. Siehe auch "Importieren" für eine ausführlichere Erklärung. Würden Sie eine tote Sprache einer sich entwickelnden vorziehen? Es gibt viele davon.
Meawoppl
9
Ich lerne auch Python und habe einen Unterschied zwischen input()und festgestellt raw_input(). a = input()nimmt die Benutzereingabe und fügt sie in den richtigen Typ ein. Beispiel: Wenn der Benutzer 5 eingibt, ist der Wert in aeine Ganzzahl 5. a = raw_input()Die Benutzereingabe wird als Zeichenfolge eingefügt. Beispiel: Wenn der Benutzer 5 eingibt, ist der Wert in adie Zeichenfolge '5' und keine Ganzzahl. Ich dachte, es könnte eine gute Information für Neulinge in Python wie mich sein.
Vishnu Narang
10
@ VishnuNarang Ja, das ist in Python 2 richtig. Aber in Python 3 hat sich dieses Verhalten geändert, und die Eingabe macht das, was raw_input in Python 2 getan hat.
balpha
4
@balpha: Nur verifiziert. Du hast Recht. Ich habe Python 2.7 (Ich kann die Antwort nicht bearbeiten, um zu erwähnen, dass ...)
Vishnu Narang
3
@meawoppl Der Wechsel von Python 2 zu 3 sollte brechen. Das heißt nicht, dass es sein musste. Eine Sprache kann sich entwickeln, ohne zu sterben und ohne die Funktionssignatur zu ändern. Es hilft, wenn Sie keine globalen Funktionen haben. Beginnen Sie mit einem Rückblick aus anderen Sprachen. Das Entfernen von Funktionen ist ebenfalls nicht vom Tisch.
Dlamblin
117

Dies funktioniert in Python 3.x und 2.x:

# Fix Python 2.x.
try: input = raw_input
except NameError: pass
print("Hi " + input("Say something: "))
Cees Timmerman
quelle
4
Ich hatte ein Problem mit dem Umfang dieses Ansatzes. Es wurde mit einem global inputam oberen Rand der aufrufenden Funktion behoben.
kevlar1818
1
Das scheint mir ein bisschen sauberer zu sein: import __builtin__; input = getattr(__builtin__, 'raw_input', input)
mbarkhau
3
Python 3 hat kein Modul mit dem Namen __builtin__.
Cees Timmerman
@mbarkhau: es ist zu global. Was ist, wenn Sie eine Bibliothek aufrufen, die dies nicht erwartet? __builtin__wird builtinsin Python 3 umbenannt . Beide sind wie __builtins__in CPython verfügbar .
JFS
3
getattr(__builtins__, 'raw_input', input)Gibt beim Import in Python 2.7.2 die Standardeinstellung zurück.
Cees Timmerman
45

Ein zuverlässiger Weg, dies zu beheben, ist

from six.moves import input

six ist ein Modul, das viele der 2/3 allgemeinen Codebasis-Schwachstellen korrigiert.

Tacaswell
quelle
1
Gute Idee ... und wenn Sie dies tun from six.moves import input as raw_input, können Sie raw_inputin Ihrem Skript bleiben und beide Python-Versionen verwenden.
eddy85br
15

Wie andere angegeben haben, wurde die raw_inputFunktion inputin Python 3.0 umbenannt, und Sie würden wirklich besser von einem aktuelleren Buch bedient werden, aber ich möchte darauf hinweisen, dass es bessere Möglichkeiten gibt, die Ausgabe Ihres Skripts zu sehen .

Nach Ihrer Beschreibung verwenden Sie Windows, haben eine .pyDatei gespeichert und doppelklicken darauf, um sie auszuführen. Das sich öffnende Terminalfenster wird geschlossen, sobald Ihr Programm endet, sodass Sie nicht sehen können, was das Ergebnis Ihres Programms war. Um dies zu lösen, empfiehlt Ihr Buch das Hinzufügen eines raw_input/input , um zu warten, bis der Benutzer die Eingabetaste drückt. Wie Sie jedoch gesehen haben, wird diese Anweisung nicht ausgeführt, wenn etwas schief geht, z. B. ein Fehler in Ihrem Programm, und das Fenster wird geschlossen, ohne dass Sie sehen können, was schief gelaufen ist. Möglicherweise ist es einfacher, eine Eingabeaufforderung oder IDLE zu verwenden.

Verwenden Sie eine Eingabeaufforderung

Wenn Sie sich das Ordnerfenster ansehen, das Ihr Python-Programm enthält, halten Sie die Umschalttaste gedrückt und klicken Sie mit der rechten Maustaste auf eine beliebige Stelle im weißen Hintergrundbereich des Fensters. Das sich öffnende Menü sollte den Eintrag "Befehlsfenster hier öffnen" enthalten. (Ich denke, das funktioniert unter Windows Vista und Windows 7.) Dadurch wird ein Eingabeaufforderungsfenster geöffnet, das ungefähr so ​​aussieht:

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

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

Geben Sie Folgendes ein, um Ihr Programm auszuführen (ersetzen Sie Ihren Skriptnamen):

    python myscript.py

... und drücken Sie die Eingabetaste. (Wenn Sie die Fehlermeldung erhalten, dass "Python" kein erkannter Befehl ist, lesen Sie http://showmedo.com/videotutorials/video?name=960000&fromSeriesID=96. ) Wenn Ihr Programm ausgeführt wird, wird das Fenster unabhängig davon abgeschlossen, ob es erfolgreich abgeschlossen wurde oder nicht bleibt geöffnet und die Eingabeaufforderung wird erneut angezeigt, damit Sie einen anderen Befehl eingeben können. Wenn Sie Ihr Programm erneut ausführen möchten, können Sie den Aufwärtspfeil drücken, um den zuvor eingegebenen Befehl abzurufen, und die Eingabetaste drücken, um es erneut auszuführen, anstatt jedes Mal den Dateinamen eingeben zu müssen.

Verwenden Sie IDLE

IDLE ist ein einfacher Programmeditor, der mit Python installiert wird. Unter anderem können Ihre Programme in einem Fenster ausgeführt werden. Klicken Sie mit der rechten .pyMaustaste auf Ihre Datei und wählen Sie "Im Leerlauf bearbeiten". Wenn Ihr Programm im Editor angezeigt wird, drücken Sie F5 oder wählen Sie "Modul ausführen" aus dem Menü "Ausführen". Ihr Programm wird in einem Fenster ausgeführt, das nach dem Ende Ihres Programms geöffnet bleibt und in dem Sie Python-Befehle eingeben können, die sofort ausgeführt werden sollen.

Weeble
quelle
Ist IDLE unter Windows installiert? Das Ausführen von IDLE oder Idle in meinem Terminal ist leer.
VGoff
1
IDLE wird mit Python unter Windows installiert. Es wird als Verknüpfung im Startmenü und als Dateizuordnung für .py-Dateien angezeigt, aber ich glaube nicht, dass Ihrem Pfad standardmäßig ein Befehl "Leerlauf" hinzugefügt wurde. Wenn Sie es von der Kommandozeile aus starten möchten, können Siepythonw -m idlelib.idle
Weeble
Das erklärt es. Ich berühre nur Windows, um Geld zu verdienen, nicht als Betriebssystem. Ich würde dann sagen, dass Ihr Abschnitt "IDLE verwenden" dann voreingenommen ist. Sie sollten vielleicht die Selektivität erwähnen.
VGoff
3
Ich bin mir nicht sicher ob ich das verstehe. Die Frage war Windows-spezifisch. Es handelt sich um ein "DOS-Popup". IDLE wird als Teil von Python installiert, aber einige Distributoren können es trennen. In Ubuntu müssen Sie es beispielsweise als separates Paket installieren. Die Antwort schlägt bereits einen anderen Ansatz vor als der, nach dem der Fragesteller gefragt hat, daher möchte ich ihm lieber keine weiteren Tangenten hinzufügen. FWIW Ich benutze Linux zu Hause und benutze Windows nur dort, wo ich arbeiten muss.
Weeble
DOS ist eine Abkürzung für mehrere eng verwandte Betriebssysteme, die zwischen 1981 und 1995 oder bis etwa 2000 den IBM PC-kompatiblen Markt beherrschten, einschließlich der teilweise DOS-basierten Microsoft Windows-Versionen 95, 98 und Millennium Edition.
VGoff
7

Die Lösung von Timmerman funktioniert hervorragend, wenn der Code ausgeführt wird. Wenn Sie jedoch Undefined namebei der Verwendung von Pyflakes oder einem ähnlichen Linter keine Fehler erhalten möchten, können Sie stattdessen Folgendes verwenden:

try:
    import __builtin__
    input = getattr(__builtin__, 'raw_input')
except (ImportError, AttributeError):
    pass
jmagnusson
quelle
Eh, ich bin immer noch viele Fehler in Pylint bekommen: Redefining built-in 'input' (redefined-builtin), Unable to import '__builtin__' (import-error), Invalid constant name "input" (invalid-name).
Babken Vardanyan
@BabkenVardanyan pylint ist notorisch streng, wenn es um den Codestil geht. Ich würde empfehlen , flake8oder pyflakes, um nicht alle Tages mit sinnlose Warnungen in Anspruch nehmen.
jmagnusson
6

Hier ist ein Teil des Codes, den ich in meine Skripte eingefügt habe und den ich nicht in einer py2 / 3-agnostischen Umgebung ausführen möchte:

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

Jetzt können Sie real_raw_input verwenden. Es ist ziemlich teuer, aber kurz und lesbar. Die Verwendung von Roheingaben ist normalerweise zeitaufwändig (Warten auf Eingaben), daher ist dies nicht wichtig.

Theoretisch können Sie sogar raw_input anstelle von real_raw_input zuweisen. Möglicherweise gibt es jedoch Module, die das Vorhandensein von raw_input überprüfen und sich entsprechend verhalten. Es ist besser, auf der sicheren Seite zu bleiben.

ChewbaccaKL
quelle
Ich erhalte dies, als ich es versuchte: inputcons = vars ( builtins ) .get ('raw_input', input) Das Argument TypeError: vars () muss das dict- Attribut haben
0

Wahrscheinlich nicht die beste Lösung, aber bevor ich hierher kam, habe ich dies im laufenden Betrieb gemacht, um weiter zu arbeiten, ohne eine kurze Pause vom Studium zu machen.

def raw_input(x):
  input(x)

Wenn ich dann raw_input('Enter your first name: ')das Skript ausführe, an dem ich gearbeitet habe, erfasst es es wie gewohnt input().

Es kann einen Grund geben, dies nicht zu tun, auf den ich noch nicht gestoßen bin!

Danijel-James W.
quelle
7
Warum nicht einfach raw_input = input?
Tonypdmtr