Як використовувати raw_input в Python 3


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

Я використовую Python 3.1 і не можу змусити raw_input"заморозити" спливаючі вікна дос. Книга, яку я читаю, призначена для Python 2.5, і я використовую Python 3.1

Що мені робити, щоб це виправити?


1
хм, я отримую NameError: ім'я 'raw_input' не визначено, коли я намагаюся використовувати ваш код. ви не отримаєте те ж саме?
SilentGhost


9
У Python 3 багато чого змінилося, тому, ймовірно, ви не повинні намагатися освоїти це за допомогою книги для 2,5 (яка насправді стара).
Ніклас Б.

5
raw_input було перейменовано на вхід у python 3
krystan honor

Отримання помилки http 401, коли я переходжу за посиланням Oauth2
Великий Ян

Відповіді:


1011

Починаючи з Python 3, raw_input()було перейменовано в input().

З нового в Python 3.0, розділ Builtins, другий елемент.


56
Спочатку був функція input (), яка діяла щось на зразок поточного eval (input ()). Це було залишення від того, коли Python був менш захищений від безпеки. Зміна спростила мову. Дивіться також "імпортувати це" для більш глибокого пояснення. Чи віддаєте перевагу мертвій мові тій, що розвивається? Тих навколо багато.
meawoppl

9
Я також вивчаю пітон і знайшов одну різницю між input()і raw_input(). a = input()візьме користувальницьку інформацію та введе її у правильний тип. Напр .: якщо користувач вводить 5, то значення в цілому aчисло 5. a = raw_input()прийме введення користувача і поставить його як рядок. Напр .: якщо користувач вводить 5, то значення в aрядку "5", а не ціле число. Думав, що це може бути хорошою інформацією для новачків у пітоні, як я.
Вішну Наранг

10
@VishnuNarang Так, це правильно в Python 2. Але в Python 3 така поведінка змінилася, і введення робить те, що raw_input зробив у Python 2.
balpha

4
@balpha: Просто перевірено. Ви праві. У мене python 2.7 (не можу редагувати відповідь, щоб сказати, що ...)
Vishnu Narang

3
@meawoppl Перехід від python 2 до 3 мав бути зламаним. Це не означає, що це мало бути. Мова може розвиватися без вмирання та без зміни функції підпису. Це допомагає, якщо у вас немає глобальних функцій. Почніть з деякого огляду з інших мов. І т.д. Видалення функцій також не виходить зі столу.
dlamblin

117

Це працює в Python 3.x та 2.x:

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

4
З цим підходом я отримував проблему масштабу . Виправлено це global inputза допомогою вгорі функції виклику.
kevlar1818

1
Мені це здається трохи чистішим: import __builtin__; input = getattr(__builtin__, 'raw_input', input)
mbarkhau

3
У Python 3 немає модуля з іменем __builtin__.
Cees Timmerman

@mbarkhau: це занадто глобально. Що робити, якщо ви телефонуєте в бібліотеку, яка цього не очікує? __builtin__перейменовано builtinsв Python 3. Обидва доступні, як __builtins__у CPython.
jfs

3
getattr(__builtins__, 'raw_input', input)повертає за замовчуванням при імпорті в Python 2.7.2.
Cees Timmerman

45

Надійний спосіб вирішити це

from six.moves import input

Шість - модуль, який здійснює патч на багатьох 2/3 загальних больових точок базового коду.


1
Гарна ідея ... і якщо ви це зробите from six.moves import input as raw_input, ви можете тримати raw_inputу своєму сценарії та запускати, використовуючи обидві версії Python.
eddy85br

15

Як зазначають інші, raw_inputфункція була перейменована inputв Python 3.0, і вам справді краще послужити більш сучасну книгу, але я хочу зазначити, що є кращі способи побачити вихід вашого сценарію .

З вашого опису, я думаю, що ви використовуєте Windows, ви зберегли .pyфайл і потім двічі клацніть по ньому, щоб запустити його. Спливаюче вікно термінала закривається, як тільки програма закінчується, тому ви не бачите, який був результат вашої програми. Щоб вирішити цю проблему, ваша книга рекомендує додати raw_input/ inputзаяву, щоб зачекати, поки користувач натисне кнопку. Однак, як ви вже бачили, якщо щось піде не так, як-от помилка у вашій програмі, це твердження не буде виконано, і вікно закриється, а ви не зможете побачити, що пішло не так. Можливо, вам буде простіше використовувати командний рядок або IDLE.

Використовуйте командний рядок

Коли ви дивитесь у вікно папки, яке містить вашу програму Python, утримуйте клавішу зсуву та клацніть правою кнопкою миші в будь-якому місці білого фону вікна. Меню, яке з'явиться, повинно містити запис "Відкрити вікно команд тут". (Я думаю, що це працює в Windows Vista та Windows 7.) Це відкриє вікно командного рядка, яке виглядає приблизно так:

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

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

Щоб запустити свою програму, введіть наступне (замінивши ім'я сценарію):

    python myscript.py

... і натисніть клавішу Enter. (Якщо ви отримаєте помилку про те, що "python" не є розпізнаваною командою, див. Http://showmedo.com/videotutorials/video?name=960000&fromSeriesID=96 ) Коли ваша програма закінчується, незалежно від того, завершує вона успішно чи ні, вікно залишиться відкритим, і командний рядок знову з’явиться, щоб ви ввели іншу команду. Якщо ви хочете запустити свою програму ще раз, ви можете натиснути стрілку вгору, щоб згадати попередню команду, яку ви ввели, і натисніть клавішу Enter, щоб запустити її знову, замість того, щоб вводити ім'я файлу кожен раз.

Використовуйте IDLE

IDLE - це простий редактор програм, який встановлюється з Python. Серед інших функцій він може запускати ваші програми у вікні. Клацніть правою кнопкою миші на вашому .pyфайлі та оберіть "Редагувати в IDLE". Коли ваша програма з’явиться в редакторі, натисніть F5 або виберіть «Запустити модуль» у меню «Запустити». Ваша програма буде працювати у вікні, яке залишається відкритим після закінчення програми, і в яке ви можете ввести команди Python, щоб негайно запуститись.


Чи встановлено IDLE в Windows? Працюючи з простою або простою в моєму терміналі, виходить порожнім.
vgoff

1
IDLE встановлюється за допомогою Python у Windows. Це відображається як ярлик у меню "Пуск" і як асоціація файлів для файлів .py, але я не думаю, що до вашого шляху за замовчуванням додана команда "простою". Якщо ви хочете запустити його з командного рядка, можете запуститиpythonw -m idlelib.idle
Weeble

Це пояснює це. Я торкаюся тільки Windows, щоб заробити гроші, а не як ОС. Тоді я б сказав, що ваш розділ "Використовувати IDLE" тоді є необ'єктивним. Мабуть, вам слід згадати про вибірковість.
vgoff

3
Я не впевнений, що розумію. Питання стосувалося Windows. Це говорить про "спливаюче вікно DOS". IDLE встановлюється як частина Python, але деякі дистрибутори можуть відокремити його. Наприклад, в Ubuntu, здається, вам доведеться встановити його як окремий пакет. Відповідь вже пропонує інший підхід, ніж просив запитуючий, тому я краще не додаватиму до нього дотичних питань. FWIW Я використовую Linux вдома і використовую тільки Windows там, де мені доводиться працювати.
Weeble

DOS є абревіатурою для декількох тісно пов’язаних операційних систем, які домінували на сумісному ринку IBM PC між 1981 і 1995 роками, або приблизно до 2000 року, включаючи частково засновані на DOS версії Microsoft Windows 95, 98 та Millennium Edition.
vgoff

7

Рішення Timmerman чудово працює під час запуску коду, але якщо ви не хочете отримувати Undefined nameпомилки при використанні піфлаків або подібного вкладиша, замість цього ви можете використовувати наступне:

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

Ех, я все ще отримую багато помилок в pylint: Redefining built-in 'input' (redefined-builtin), Unable to import '__builtin__' (import-error), Invalid constant name "input" (invalid-name).
Бабкен Варданян

@BabkenVardanyan pylint сумно суворий, коли мова йде про стиль коду. Я б рекомендував flake8або pyflakesтак, щоб не зайняти весь день безглуздими застереженнями.
jmagnusson

6

Ось фрагмент коду, який я вклав у свої сценарії, які не хочу запускати в середовищі py2 / 3-агностик:

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

Тепер ви можете використовувати real_raw_input. Це досить дорого, але коротко і читабельно. Використання необробленого введення зазвичай дорого коштує (очікування введення), тому це не важливо.

Теоретично можна навіть призначити raw_input замість real_raw_input, але можуть бути модулі, які перевіряють існування raw_input та поводяться відповідно. Краще залишитися на безпечній стороні.


Я отримую це, коли я спробував це: inputcons = vars ( buildins ) .get ('raw_input', input) Аргумент TypeError: vars () повинен мати атрибут dict

0

Напевно, не найкраще рішення, але перш ніж я приїхав сюди, я просто зробив це на льоту, щоб продовжувати працювати, не маючи швидкої перерви в навчанні.

def raw_input(x):
  input(x)

Потім, коли я raw_input('Enter your first name: ')працюю над сценарієм, над яким я працював, він захоплює його як і ні input().

Може бути причина цього не робити, що я ще не натрапив на це!


7
Чому б не просто raw_input = input?
tonypdmtr
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.