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

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

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

Что мне делать, чтобы это исправить?


person Lonnie Price    schedule 05.06.2009    source источник
comment
хм, я получаю NameError: имя raw_input не определено, когда я пытаюсь использовать ваш код. разве у тебя не получается то же самое?   -  person SilentGhost    schedule 05.06.2009
comment
Ознакомьтесь с docs.python.org/library/2to3.html и docs.python.org/3.0/whatsnew/3.0.html   -  person MatrixFrog    schedule 07.06.2009
comment
В Python 3 многое изменилось, поэтому, вероятно, вам не стоит пытаться освоить его, используя книгу для 2.5 (которая действительно устарела).   -  person Niklas B.    schedule 06.09.2011
comment
raw_input был переименован в input в python 3   -  person krystan honour    schedule 15.02.2015
comment
Получение ошибки http 401 при переходе по ссылке Oauth2   -  person Big Ian    schedule 08.02.2020


Ответы (9)


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

Из второго пункта Что нового в Python 3.0, раздел "Встроенные".

person balpha    schedule 05.06.2009
comment
Изначально существовала функция input (), которая действовала примерно как текущий eval (input ()). Это было пережитком того времени, когда Python меньше заботился о безопасности. Это изменение упростило язык. См. Также импорт этого для более глубокого объяснения. Вы бы предпочли мертвый язык развивающемуся? Таких вокруг полно. - person meawoppl; 10.04.2014
comment
Я тоже изучаю питон и нашел одно различие между input() и raw_input(). a = input() примет пользовательский ввод и поместит его в правильный тип. Например: если пользователь вводит 5, то значение в a является целым числом 5. a = raw_input() принимает вводимые пользователем данные и помещает их в виде строки. Например: если пользователь вводит 5, то значение в a - это строка «5», а не целое число. Подумал, что это может быть хорошая информация для новичков в Python, таких как я. - person Vishnu Narang; 05.03.2016
comment
@VishnuNarang Да, это правильно в Python 2. Но в Python 3 это поведение изменилось, и input выполняет то же самое, что raw_input в Python 2. - person balpha; 05.03.2016
comment
@balpha: Только что проверено. Ты прав. У меня python 2.7 (не могу отредактировать ответ, чтобы упомянуть об этом ...) - person Vishnu Narang; 05.03.2016
comment
@meawoppl Переход с Python 2 на 3 должен был нарушить работу. Это не значит, что так должно было быть. Язык может развиваться, не умирая и не меняя сигнатуры функции. Это помогает, если у вас нет глобальных функций. Начните с оглядки назад с других языков. И т.д. Не стоит забывать и об удалении функций. - person dlamblin; 25.09.2017
comment
@dlamblin Python был впервые выпущен в 1991 году. input() использовался редко - пустое пространство вызывало исключение. У Python есть автоматизированный инструмент для выполнения подобных преобразований кода. Функция присутствует, чтобы немного упростить создание сценариев. Помимо примитивов ввода-вывода оболочки и основных типов, python имеет несколько глобальных переменных. - person noɥʇʎԀʎzɐɹƆ; 18.07.2018

Это работает в Python 3.x и 2.x:

# Fix Python 2.x.
try: input = raw_input
except NameError: pass
print("Hi " + input("Say something: "))
person Cees Timmerman    schedule 06.09.2011
comment
Я получал проблема области с этим подходом. Исправлено с global input в верхней части вызывающей функции. - person kevlar1818; 14.08.2013
comment
Мне это кажется немного чище: import __builtin__; input = getattr(__builtin__, 'raw_input', input) - person mbarkhau; 03.10.2013
comment
В Python 3 нет модуля с именем __builtin__. - person Cees Timmerman; 04.10.2013
comment
@mbarkhau: это слишком глобально. Что, если вы вызовете библиотеку, которая этого не ожидает? __builtin__ переименован в builtins в Python 3. Оба они доступны как __builtins__ в CPython. - person jfs; 25.03.2014
comment
getattr(__builtins__, 'raw_input', input) возвращает значение по умолчанию при импорте в Python 2.7.2. - person Cees Timmerman; 26.03.2014
comment
@JF: 1) Все изменения, обсуждаемые в этом потоке ответов / комментариев, являются локальными для текущего модуля, хотя вы можете глобально изменить __builtins__, я полагаю, и 2) если вы вызываете input() в коде библиотеки 2.x, вы есть проблемы посерьезнее. - person Kevin; 15.01.2015
comment
@Kevin: 1) да. Я предположил (ошибочно), что builtins изменен 2) Не имеет значения, является ли использование input() хорошей идеей. Изменять builtins - плохая идея. - person jfs; 15.01.2015

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

from six.moves import input

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

person tacaswell    schedule 28.07.2015
comment
Хорошая идея ... и если вы сделаете from six.moves import input as raw_input, вы можете оставить raw_input в своем скрипте и запускать его с использованием обеих версий Python. - person eddy85br; 14.12.2018

Как указывали другие, функция 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 для немедленного запуска.

person Weeble    schedule 23.02.2012
comment
IDLE установлен с Windows? Запуск IDLE или простоя в моем терминале оказывается пустым. - person vgoff; 06.08.2013
comment
IDLE устанавливается вместе с Python в Windows. Он отображается как ярлык в меню «Пуск» и как ассоциация файлов для файлов .py, но я не думаю, что к вашему пути по умолчанию добавлена ​​какая-либо команда «idle». Если вы хотите запустить его из командной строки, вы можете запустить pythonw -m idlelib.idle - person Weeble; 06.08.2013
comment
Что объясняет его. Я прикасаюсь к Windows только для заработка, а не как к ОС. Тогда я бы сказал, что ваш раздел Use IDLE тогда предвзят. Пожалуй, стоит упомянуть избирательность. - person vgoff; 06.08.2013
comment
Я не уверен, что понимаю. Вопрос был специфичен для Windows. Он говорит о всплывающем окне DOS. IDLE устанавливается как часть Python, но некоторые дистрибьюторы могут отделять его. Например, в Ubuntu кажется, что вам нужно установить его как отдельный пакет. Ответ уже предлагает другой подход, чем просил спрашивающий, поэтому я бы не стал добавлять к нему дополнительные касательные. FWIW Я использую Linux дома и использую Windows только там, где мне нужно по работе. - person Weeble; 06.08.2013
comment
DOS является аббревиатурой нескольких тесно связанных операционных систем, которые доминировали на рынке совместимых с IBM PC в период с 1981 по 1995 год или примерно до 2000 года, включая частично основанную на DOS версию Microsoft Windows 95, 98 и Millennium Edition. - person vgoff; 06.08.2013

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

try:
    import __builtin__
    input = getattr(__builtin__, 'raw_input')
except (ImportError, AttributeError):
    pass
person jmagnusson    schedule 20.08.2013
comment
Эх, я все еще получаю много ошибок в pylint: Redefining built-in 'input' (redefined-builtin), Unable to import '__builtin__' (import-error), Invalid constant name "input" (invalid-name). - person Babken Vardanyan; 09.08.2014
comment
@BabkenVardanyan pylint известен своей строгостью, когда дело касается стиля кода. Я бы порекомендовал flake8 или pyflakes, чтобы не отнимать весь день бессмысленными предупреждениями. - person jmagnusson; 11.08.2014

Вот фрагмент кода, который я вставил в свои сценарии, который я не хочу запускать в среде, не зависящей от 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 и ведут себя соответствующим образом. Лучше перестраховаться.

person ChewbaccaKL    schedule 22.09.2014
comment
Я получил это, когда попробовал: inputcons = vars (builtins) .get ('raw_input', input) TypeError: аргумент vars () должен иметь атрибут dict - person ; 17.05.2016

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

def raw_input(x):
  input(x)

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

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

person Danijel-James W    schedule 25.08.2017
comment
Почему не просто raw_input = input? - person tonypdmtr; 12.05.2019

Как насчет следующего? Должен позволить вам использовать либо raw_input, либо input как в Python2, так и в Python3 с семантикой raw_input Python2 (также известной как семантика ввода Python3)

# raw_input isn't defined in Python3.x, whereas input wasn't behaving like raw_input in Python 2.x
# this should make both input and raw_input work in Python 2.x/3.x like the raw_input from Python 2.x 
try: input = raw_input
except NameError: raw_input = input
person George Birbilis    schedule 10.07.2020
comment
РЖУ НЕ МОГУ. Это отличный прием для обеспечения обратной совместимости. - person Qumber; 29.09.2020

по-другому вы можете сделать это так, создав новую функцию.

import platform
def str_input(str=''):
    py_version = platform.python_version() # fetch the python version currently in use
    if int(py_version[0]) == 2:
       return raw_input(str) # input string in python2
    if int(py_version[0]) == 3:
       return input(str) # input string in python3

как использовать:

str_input("Your Name: ")

Я использую это, когда хочу создавать сценарии и входные данные, которые можно запускать в python2 и python3.

person Zeerx7 v    schedule 08.07.2021