Jak korzystać z raw_input w Pythonie 3


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

Korzystam z języka Python 3.1 i nie mogę uzyskać raw_input„zamrożenia” wyskakującego okna dos. Książka, którą czytam, dotyczy Python 2.5 i używam Python 3.1

Co powinienem zrobić, aby to naprawić?


1
hm, otrzymuję NameError: nazwa „raw_input” nie jest zdefiniowana, gdy próbuję użyć twojego kodu. nie dostajesz tego samego?
SilentGhost,


9
W Pythonie 3 wiele się zmieniło, więc prawdopodobnie nie powinieneś próbować go opanowywać za pomocą książki dla 2.5 (która jest naprawdę stara).
Niklas B.,

5
raw_input został przemianowany na input w python 3
krystan honor

Otrzymuję błąd http 401, gdy podążam za linkiem Oauth2
Big Ian

Odpowiedzi:


1011

Począwszy od Python 3, raw_input() zmieniono jego nazwę na input().

Od Co nowego W Python 3.0, sekcja Wbudowane druga pozycja.


56
Pierwotnie istniała funkcja input (), która działała podobnie do bieżącej eval (input ()). Było to pozostałością po tym, jak Python był mniej świadomy bezpieczeństwa. Zmiana uprościła język. Zobacz także „zaimportuj to”, aby uzyskać głębsze wyjaśnienie. Czy wolisz martwy język niż ten, który ewoluuje? Jest ich mnóstwo.
meawoppl

9
Uczę się również pytona i znalazłem jedną różnicę między input()i raw_input(). a = input()weźmie dane wejściowe użytkownika i umieści je we właściwym typie. Np .: jeśli użytkownik wpisze 5, wówczas wartość w ajest liczbą całkowitą 5. a = raw_input()pobierze dane wejściowe użytkownika i umieści je jako ciąg znaków. Np .: jeśli użytkownik wpisze 5, wówczas wartością w ajest ciąg „5”, a nie liczba całkowita. Pomyślałem, że może to być dobra informacja dla początkujących w Pythonie, takich jak ja.
Wisznu Narang

10
@VishnuNarang Tak, to jest poprawne w Pythonie 2. Ale w Pythonie 3 to zachowanie się zmieniło i dane wejściowe robią to, co raw_input w Pythonie 2.
balpha

4
@balpha: Właśnie zweryfikowano. Masz rację. Mam Python 2.7 (Nie mogę edytować odpowiedzi, aby wspomnieć, że ...)
Wisznu Narang

3
@meawoppl Przejście z Pythona 2 do 3 miało się zepsuć. To nie znaczy, że tak musiało być. Język może ewoluować bez umierania i bez zmiany sygnatury funkcji. Pomaga, jeśli nie masz funkcji globalnych. Zacznij od pewnej perspektywy z innych języków. Itd. Usuwanie funkcji nie jest poza stołem.
dlamblin

117

Działa to w Pythonie 3.xi 2.x:

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

4
Z tym podejściem miałem problem z zasięgiem . Naprawiono go global inputu góry funkcji wywoływania.
kevlar1818,

1
Wydaje mi się to trochę czystsze: import __builtin__; input = getattr(__builtin__, 'raw_input', input)
mbarkhau

3
Python 3 nie ma nazwanego modułu __builtin__.
Cees Timmerman,

@mbarkhau: jest zbyt globalny. Co jeśli nazwiesz bibliotekę, która się tego nie spodziewa? __builtin__zmieniono nazwę na builtinsPython 3. Oba są dostępne jak __builtins__w CPython.
jfs

3
getattr(__builtins__, 'raw_input', input)zwraca wartość domyślną po zaimportowaniu do Python 2.7.2.
Cees Timmerman

45

Niezawodny sposób na rozwiązanie tego problemu

from six.moves import input

six to moduł, który załatuje wiele z 2/3 wspólnych punktów bazowych kodu.


1
Dobry pomysł ... a jeśli tak from six.moves import input as raw_input, możesz zachować raw_inputskrypt i uruchomić go używając obu wersji Pythona.
eddy85br

15

Jak wskazali inni, raw_inputzmieniono nazwę funkcji nainput Python 3.0, a naprawdę lepiej byłoby skorzystać z bardziej aktualnej książki, ale chcę podkreślić, że istnieją lepsze sposoby na sprawdzenie wyniku działania skryptu .

Z twojego opisu, myślę, że używasz systemu Windows, zapisałeś .pyplik, a następnie kliknij go dwukrotnie, aby go uruchomić. Wyskakujące okno terminala zamyka się natychmiast po zakończeniu programu, więc nie można zobaczyć, jaki był wynik programu. Aby rozwiązać ten problem, książka zaleca dodanie raw_input/input instrukcji , aby poczekać, aż użytkownik naciśnie klawisz Enter. Jednak, jak widzieliście, jeśli coś pójdzie nie tak, jak na przykład błąd w twoim programie, to instrukcja nie zostanie wykonana, a okno zamknie się, nie będziesz w stanie zobaczyć, co poszło źle. Łatwiejsze może być użycie wiersza polecenia lub IDLE.

Użyj wiersza polecenia

Kiedy patrzysz na okno folderu zawierające program w Pythonie, przytrzymaj klawisz Shift i kliknij prawym przyciskiem myszy w dowolnym miejscu w białym obszarze okna. Wyskakujące menu powinno zawierać wpis „Otwórz tutaj okno poleceń”. (Myślę, że działa to w systemach Windows Vista i Windows 7.) Otworzy się okno wiersza polecenia, które wygląda mniej więcej tak:

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

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

Aby uruchomić program, wpisz następujące polecenie (zastępując nazwę skryptu):

    python myscript.py

... i naciśnij enter. (Jeśli pojawi się błąd, że „python” nie jest rozpoznanym poleceniem, zobacz http://showmedo.com/videotutorials/video?name=960000&fromSeriesID=96 ) Po zakończeniu działania programu, niezależnie od tego, czy zakończy się pomyślnie, czy nie, okno pozostanie otwarty, a wiersz polecenia pojawi się ponownie, aby wpisać inne polecenie. Jeśli chcesz ponownie uruchomić program, możesz nacisnąć strzałkę w górę, aby przywołać poprzednią komendę, którą wprowadziłeś i nacisnąć klawisz Enter, aby uruchomić ją ponownie, bez konieczności wpisywania nazwy pliku za każdym razem.

Użyj IDLE

IDLE to prosty edytor programów, który jest instalowany z Pythonem. Między innymi może uruchamiać twoje programy w oknie. Kliknij .pyplik prawym przyciskiem myszy i wybierz „Edytuj w IDLE”. Gdy twój program pojawi się w edytorze, naciśnij F5 lub wybierz „Uruchom moduł” z menu „Uruchom”. Twój program będzie działał w oknie, które pozostanie otwarte po zakończeniu programu, w którym możesz wpisać polecenia Pythona, aby uruchomić je natychmiast.


Czy IDLE jest zainstalowany w systemie Windows? Uruchomienie bezczynności lub bezczynności w moim terminalu jest puste.
vgoff,

1
IDLE jest instalowany z Pythonem w systemie Windows. Pojawia się jako skrót w menu Start i jako skojarzenie plików .py, ale nie sądzę, aby domyślnie dodawano jakieś polecenie „bezczynności” do ścieżki. Jeśli chcesz go uruchomić z wiersza poleceń, możesz uruchomićpythonw -m idlelib.idle
Weeble

To wyjaśnia to. Dotykam tylko systemu Windows, aby zarabiać pieniądze, a nie systemu operacyjnego. Powiedziałbym wtedy, że sekcja „Użyj IDLE” jest stronnicza. Być może powinieneś wspomnieć o selektywności.
vgoff,

3
Nie jestem pewien, czy rozumiem. Pytanie dotyczyło systemu Windows. Mówi o „wyskakującym okienku DOS”. IDLE jest instalowany jako część Pythona, ale niektórzy dystrybutorzy mogą go rozdzielić. Na przykład w Ubuntu wydaje się, że musisz zainstalować go jako oddzielny pakiet. Odpowiedź już sugeruje inne podejście niż pytał pytający, więc wolałbym nie dodawać do niego dalszych stycznych. FWIW Używam Linuksa w domu i używam Windowsa tylko tam, gdzie muszę do pracy.
Weeble

DOS jest akronimem kilku ściśle powiązanych systemów operacyjnych, które dominowały na rynku kompatybilnych komputerów IBM w latach 1981–1995 lub do około 2000 r., W tym częściowo opartych na DOS wersji Microsoft Windows 95, 98 i Millennium Edition.
vgoff,

7

Rozwiązanie Timmerman działa świetnie podczas uruchamiania kodu, ale jeśli nie chcesz otrzymywać Undefined namebłędów podczas używania płatków pyflake lub podobnego lintera, możesz zamiast tego użyć następujących:

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

Eh, ja wciąż się wiele błędów w pylint: Redefining built-in 'input' (redefined-builtin), Unable to import '__builtin__' (import-error), Invalid constant name "input" (invalid-name).
Babken Vardanyan

Pylint @BabkenVardanyan jest niezwykle surowy, jeśli chodzi o styl kodu. Polecam flake8albo pyflakestak, aby nie zająć cały dzień z bezsensownych ostrzeżeń.
jmagnusson,

6

Oto fragment kodu, który umieściłem w swoich skryptach, których nie chcę uruchamiać w środowisku 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)

Teraz możesz użyć real_raw_input. Jest dość drogi, ale krótki i czytelny. Korzystanie z surowych danych wejściowych jest zwykle czasochłonne (oczekiwanie na dane wejściowe), więc nie jest ważne.

Teoretycznie możesz nawet przypisać raw_input zamiast real_raw_input, ale mogą istnieć moduły, które sprawdzają istnienie raw_input i zachowują się odpowiednio. Lepiej pozostań po bezpiecznej stronie.


Otrzymuję to, gdy próbuję: inputcons = vars ( buildins ) .get ('raw_input', input) Argument TypeError: vars () musi mieć atrybut dict

0

Prawdopodobnie nie jest to najlepsze rozwiązanie, ale zanim tu przybyłem, zrobiłem to w locie, aby kontynuować pracę bez szybkiej przerwy w nauce.

def raw_input(x):
  input(x)

Potem, kiedy uruchamiam raw_input('Enter your first name: ')skrypt, nad którym pracowałem, rejestruje go tak, jak robiinput() by zrobił.

Może istnieć powód, aby tego nie robić, z którym jeszcze się nie spotkałem!


7
Dlaczego nie tylko raw_input = input?
tonypdmtr
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.