如何在Python 3中使用raw_input


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版的书来掌握它(这确实很旧了)。
Niklas B.

5
raw_input已重命名为python 3中的输入
krystan荣誉

当我遵循Oauth2链接时遇到http 401错误
Big Ian

Answers:


1011

从Python 3开始,raw_input()已重命名为input()

摘自Python 3.0的新增功能,“内置”部分的第二项。


56
最初有一个函数input(),其功能类似于当前的eval(input())。这是Python缺乏安全意识时的遗留物。更改简化了语言。另请参阅“导入此内容”以获取更深入的说明。您会喜欢一种枯燥的语言而不是一种会发展的语言吗?周围有很多。
meawoppl 2014年

9
我也在学习python,发现input()和之间有一个区别raw_input()a = input()将接受用户输入并将其输入正确的类型。例如:如果用户键入5,则in中的a值为整数5。 a = raw_input()将采用用户输入并将其作为字符串输入。例如:如果用户键入5,则in中的值a是字符串'5',而不是整数。以为这对像我这样的python新手来说可能是个好信息。
Vishnu Narang

10
@VishnuNarang是的,这是在Python 2。但是在Python 3是正确的,这种行为改变,输入确实2.在Python的raw_input什么做
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调用函数顶部的a修复了该问题。
kevlar1818 2013年

1
对我来说,这似乎更清洁: import __builtin__; input = getattr(__builtin__, 'raw_input', input)
mbarkhau 2013年

3
Python 3没有名为的模块__builtin__
Cees Timmerman 2013年

@mbarkhau:太全球化了。如果您调用了一个不期望的库该怎么办?在Python 3中__builtin__被重命名为。在CPython中builtins都可用__builtins__
2014年

3
getattr(__builtins__, 'raw_input', input)在Python 2.7.2中导入时,返回默认值。
Cees Timmerman 2014年

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语句,直到用户按下Enter键。但是,正如您所看到的,如果出现问题(例如程序中的错误),则该语句将不会执行,并且在您看不到问题出在哪里之前,该窗口将关闭。您可能会发现使用命令提示符或IDLE更容易。

使用命令提示符

当您查看包含Python程序的文件夹窗口时,请按住shift键并右键单击窗口白色背景区域中的任意位置。弹出的菜单应包含“此处打开命令窗口”条目。(我认为这适用于Windows Vista和Windows7。)这将打开一个命令提示符窗口,如下所示:

    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命令以立即运行。


Windows是否安装了IDLE?运行IDLE或终端中的空闲状态为空。
vgoff

1
Windows上使用Python安装了IDLE。它在开始菜单中显示为快捷方式,并显示为.py文件的文件关联,但默认情况下,我认为路径中未添加任何“ idle”命令。如果您想从命令行启动它,可以运行pythonw -m idlelib.idle
Weeble 2013年

这就解释了。我只接触Windows来赚钱,而不是作为操作系统。然后,我会说您的“使用IDLE”部分存在偏见。您应该提到选择性。
vgoff 2013年

3
我不确定我是否理解。问题是特定于Windows的。它讨论了“ DOS弹出窗口”。IDLE是Python的一部分,但有些发行商可能会将其分开。例如,在Ubuntu中,您似乎必须将其作为单独的软件包安装。答案已经在暗示一种不同于提问者要求的方法,因此我宁愿不添加更多切线。FWIW我在家中使用Linux,而仅在需要工作的地方使用Windows。
2013年

DOS是1981年至1995年(或直到2000年左右)主导IBM PC兼容市场的几种密切相关的操作系统的缩写,包括部分基于DOS的Microsoft Windows版本95、98和Millennium Edition。
vgoff 2013年

7

Timmerman的解决方案在运行代码时效果很好,但是如果您不想Undefined name在使用pyflakes或类似的linter时出错,则可以使用以下代码:

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 2014年

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 =瓦尔(内建)获得(“的raw_input”,输入)类型错误:瓦尔()参数必须有字典属性

0

可能不是最好的解决方案,但是在我来这里之前,我只是在不停学习的情况下即时进行此操作以保持工作状态。

def raw_input(x):
  input(x)

然后,当我raw_input('Enter your first name: ')在我正在处理的脚本上运行时,它会捕获它input()

可能有一个原因,我还没有遇到呢!


7
为什么不只是raw_input = input呢?
tonypdmtr
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.