我如何在Python 3中使用raw_input

How do I use raw_input in Python 3

1
2
3
4
import sys
print(sys.platform)
print(2**100)
raw_input()

我使用的是python 3.1,无法让raw_input"冻结"DOS弹出窗口。我正在读的书是针对python 2.5的,我使用的是python 3.1

我该怎么做才能解决这个问题?


raw_input()改为input()

来自http://docs.python.org/dev/py3k/whatsnew/3.0.html


这在python 3.x和2.x中有效:

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


解决这一问题的可靠方法是

1
from six.moves import input

第六个是一个模块,它可以修补2/3常见代码基础痛点中的许多痛点。


在python 3.xx中,您只需要input(),而不是raw_input()


正如其他人所指出的,在python 3.0中,raw_input函数已被重命名为input,并且您可以更好地使用一本更新的书,但是我想指出,有更好的方法来查看脚本的输出。

根据您的描述,我认为您使用的是Windows,您已经保存了一个.py文件,然后双击它来运行它。当程序结束时,弹出的终端窗口会立即关闭,因此您无法看到程序的结果。为了解决这个问题,您的书建议添加一个raw_input/input语句,等待用户按Enter键。但是,正如您所看到的,如果发生了一些错误,例如程序中的错误,那么该语句将不会被执行,窗口将关闭,而您无法看到发生了什么错误。您可能会发现使用命令提示或空闲更容易。

使用命令提示

当您查看包含python程序的文件夹窗口时,按住shift并右键单击窗口白色背景区域中的任意位置。弹出的菜单应该包含一个条目"open command window here"。(我认为这适用于Windows Vista和Windows 7。)这将打开一个命令提示窗口,其外观如下:

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

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

要运行程序,请键入以下内容(替换脚本名):

1
    python myscript.py

…然后按回车键。(如果出现"python"不是可识别命令的错误,请参阅http://showmedo.com/videotutorials/video?name=960000&fromseriesid=96)程序运行完成后,无论是否成功完成,窗口将保持打开状态,命令提示将再次出现,供您键入其他命令。如果您想再次运行您的程序,您可以按向上箭头调用您输入的上一个命令,然后按Enter再次运行它,而不必每次都输入文件名。

闲置使用

idle是一个简单的程序编辑器,随python一起安装。它还可以在窗口中运行程序。右键单击您的.py文件并选择"在空闲状态下编辑"。当程序出现在编辑器中时,按F5键或从"运行"菜单中选择"运行模块"。程序将在一个窗口中运行,该窗口在程序结束后保持打开状态,您可以在该窗口中输入要立即运行的python命令。


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

1
2
3
4
5
try:
    import __builtin__
    input = getattr(__builtin__, 'raw_input')
except (ImportError, AttributeError):
    pass


下面是我在脚本中放入的一段代码,我不想在PY2/3不可知论环境中运行:

1
2
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)

现在您可以使用真正的"原始"输入。它很贵,但又短又可读。使用原始输入通常花费时间(等待输入),因此它并不重要。

理论上,您甚至可以分配原始输入而不是实际的原始输入,但是可能有一些模块检查原始输入的存在并相应地执行操作。最好站在安全的一边。


也许不是最好的解决办法,但在我来这里之前,我只是临时做了这个,以便继续工作而不需要很快地从学习中解脱出来。

1
2
def raw_input(x):
  input(x)

然后,当我运行我正在编写的脚本raw_input('Enter your first name: ')时,它会像input()一样捕获它。

也许有理由不这么做,因为我还没有遇到!