Как использовать raw_input в Python 3

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

Я использую Python 3.1 и не могу raw_input"заморозить" всплывающее окно dos. Книга, которую я читаю, предназначена для 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
Большой Ян

Ответы:

1012

Начиная с Python 3, raw_input()был переименован в input().

Из того, что нового в Python 3.0, второй раздел раздела Встроенные .

balpha
источник
56
Первоначально была функция input (), которая действовала примерно так же, как текущая eval (input ()). Это был пережиток, когда Python был менее озабочен безопасностью. Изменение упростило язык. Смотрите также «импортировать это» для более глубокого объяснения. Вы бы предпочли мертвый язык тому, который развивается? Таких вокруг много.
meawoppl
9
Я также изучаю Python и нашел одно различие между input()и raw_input(). a = input()примет ввод пользователя и введет его в правильный тип. Например: если пользователь вводит 5, то значение в aявляется целым числом 5. a = raw_input()будет принимать пользовательский ввод и помещать его в виде строки. Например: если пользователь вводит 5, то значение в aэто строка «5», а не целое число. Подумал, что это может быть хорошей информацией для новичков в питоне, как я.
Вишну Наранг
10
@VishnuNarang Да, это правильно в Python 2. Но в Python 3 это поведение изменилось, и input делает то же, что и raw_input в Python 2.
balpha
4
@balpha: Только что подтверждено. Ты прав. У меня есть Python 2.7 (не могу отредактировать ответ, чтобы упомянуть, что ...)
Вишну Наранг
3
@meawoppl Переход с Python 2 на 3 должен был быть сломан. Это не значит, что так должно быть. Язык может развиваться без смерти и без изменения сигнатуры функции. Это помогает, если у вас нет глобальных функций. Начните с некоторой ретроспективы с других языков. И т.д. Удаление функций также не исключено.
Дламблин
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__.
Сис Тиммерман
@mbarkhau: это слишком глобально. Что если вы называете библиотеку, которая этого не ожидает? __builtin__переименован builtinsв Python 3. Оба доступны как __builtins__в CPython.
Jfs
3
getattr(__builtins__, 'raw_input', input)возвращает значение по умолчанию при импорте в Python 2.7.2.
Сис Тиммерман
45

Надежный способ решения этой проблемы

from six.moves import input

six - это модуль, который исправляет многие из 2/3 общих болевых точек кода.

tacaswell
источник
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, удерживайте нажатой клавишу Shift и щелкните правой кнопкой мыши в любом месте белой области фона окна. Всплывающее меню должно содержать запись «Открыть окно команд здесь». (Я думаю, что это работает в 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

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

Используйте IDLE

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

Weeble
источник
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-совместимых ПК в период с 1981 по 1995 год, или примерно до 2000 года, включая частично основанные на DOS версии Microsoft Windows 95, 98 и Millennium Edition.
vgoff
7

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

try:
    import __builtin__
    input = getattr(__builtin__, 'raw_input')
except (ImportError, AttributeError):
    pass
jmagnusson
источник
Эх, я все еще получаю много ошибок в 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-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)

Теперь вы можете использовать real_raw_input. Это довольно дорого, но коротко и читабельно. Использование необработанного ввода обычно требует много времени (ожидание ввода), поэтому это не важно.

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

ChewbaccaKL
источник
Я получаю это, когда пытаюсь это сделать: inputcons = vars ( builtins ) .get ('raw_input', input) Аргумент TypeError: vars () должен иметь атрибут dict
0

Возможно, это не лучшее решение, но перед тем, как приехать сюда, я просто сделал это на лету, чтобы продолжать работать, не отрываясь от учебы.

def raw_input(x):
  input(x)

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

Может быть причина не делать этого, с которой я еще не сталкивался!

Даниэль-Джеймс W
источник
7
Почему не просто raw_input = input?
tonypdmtr