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
我该怎么做才能解决这个问题?
- 嗯,我得到了名称错误:当我试图使用您的代码时,没有定义名称"原始输入"。你不明白吗?
- 查看docs.python.org/library/2to3.html和docs.python.org/3.0/whatsnew/3.0.html
- 在python 3中已经发生了很大的变化,所以您可能不应该使用一本2.5版的书(这本书真的很旧)。
- 原始输入被重命名为python 3中的输入
raw_input()改为input()。
来自http://docs.python.org/dev/py3k/whatsnew/3.0.html
- 最初有一个函数input(),它的作用类似于当前的eval(input())。这是在Python缺乏安全意识时遗留下来的。这一变化简化了语言。另请参阅"导入此"以获得更深入的解释。比起进化的语言,你更喜欢死语言吗?周围有很多这样的人。
- 我也在学习python,发现了input()和raw_input()之间的一个区别。a = input()将接受用户输入并将其放入正确的类型。例如:如果用户键入5,那么a中的值为整数5。a = raw_input()将接受用户输入并将其作为字符串。例如:如果用户键入5,那么a中的值是字符串"5",而不是整数。我想这对像我这样的Python新手来说可能是个好消息。
- @是的,这在python 2中是正确的。但在python 3中,这种行为发生了变化,input执行了python 2中原始输入的操作。
- @巴尔法:刚刚核实。你是对的。我有python 2.7(不能编辑答案来提到…)
- @从python 2移动到3的meawoppl注定要崩溃。这并不意味着必须如此。一种语言可以在不死亡和不改变函数签名的情况下进化。如果您没有全局函数,它会有所帮助。从其他语言的一些事后诸葛亮开始。等等。移除功能也不在桌面上。
- @Dlamblin python于1991年首次发布。input()很少使用——空白会引发异常。python有一个自动化的工具来执行类似这样的代码转换。这个函数的存在是为了让脚本编写更容易一些。除了shell I/O原语和基本类型之外,python只有很少的全局变量。
这在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:")) |
- 我在这种方法中遇到了范围问题。用调用函数顶部的global input修复了它。
- 这对我来说似乎有点干净:import __builtin__; input = getattr(__builtin__, 'raw_input', input)。
- python 3没有名为__builtin__的模块。
- @mbarkhau:太全球化了。如果你称一个图书馆为不期望的图书馆怎么办?在python 3中,__builtin__被重命名为builtins。这两个都可以在cpython中作为__builtins__提供。
- 当在python 2.7.2中导入时,getattr(__builtins__, 'raw_input', input)返回默认值。
- @J.F.:1)这个回答/评论线程中讨论的所有更改都是当前模块的本地更改,尽管我认为您可以全局修改__builtins__,2)如果您在2.x库代码中调用input(),则会遇到更大的问题。
- @凯文:1)是的。我假设(错误地)builtins被修改了2)使用input()是否是一个好主意并不重要。修改builtins是个坏主意。
解决这一问题的可靠方法是
1
| from six.moves import input |
第六个是一个模块,它可以修补2/3常见代码基础痛点中的许多痛点。
- 好主意…如果执行from six.moves import input as raw_input,则可以在脚本中保留raw_input,并使用两个Python版本运行。
在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>_ |
要运行程序,请键入以下内容(替换脚本名):
…然后按回车键。(如果出现"python"不是可识别命令的错误,请参阅http://showmedo.com/videotutorials/video?name=960000&fromseriesid=96)程序运行完成后,无论是否成功完成,窗口将保持打开状态,命令提示将再次出现,供您键入其他命令。如果您想再次运行您的程序,您可以按向上箭头调用您输入的上一个命令,然后按Enter再次运行它,而不必每次都输入文件名。
闲置使用
idle是一个简单的程序编辑器,随python一起安装。它还可以在窗口中运行程序。右键单击您的.py文件并选择"在空闲状态下编辑"。当程序出现在编辑器中时,按F5键或从"运行"菜单中选择"运行模块"。程序将在一个窗口中运行,该窗口在程序结束后保持打开状态,您可以在该窗口中输入要立即运行的python命令。
- 空闲是否与Windows一起安装?在我的终端中运行空闲或空闲会变成空的。
- 在Windows上用python安装了idle。它在"开始"菜单中显示为快捷方式,并作为.py文件的文件关联,但我认为默认情况下没有任何"空闲"命令添加到您的路径中。如果您想从命令行启动它,可以运行pythonw -m idlelib.idle。
- 这就解释了。我只是触摸窗户赚钱,而不是作为一个操作系统。然后我会说你的"使用空闲"部分是有偏见的。也许你应该提到选择性。
- 我不确定我明白。这个问题是Windows特有的。它说的是一个"DOS弹出窗口"。idle是作为python的一部分安装的,但有些分发服务器可能会将其分离出来。例如,在Ubuntu中,似乎必须将其作为一个单独的包安装。答案已经表明了一种不同于提问者要求的方法,所以我不想再增加更多的切线。fwiw我在家里使用Linux,只在需要工作的地方使用Windows。
- DOS是几个密切相关的操作系统的缩写,这些操作系统在1981年至1995年间或2000年左右(包括部分基于DOS的Microsoft Windows 95、98和Millennium版本)在IBM PC兼容市场占据主导地位。
Timmerman的解决方案在运行代码时效果很好,但是如果您不想在使用Pyflakes或类似的linter时出现Undefined name错误,可以使用以下方法代替:
1 2 3 4 5
| try:
import __builtin__
input = getattr(__builtin__, 'raw_input')
except (ImportError, AttributeError):
pass |
- 嗯,皮林特的错误还很多:Redefining built-in 'input' (redefined-builtin)、Unable to import '__builtin__' (import-error)、Invalid constant name"input" (invalid-name)。
- @在代码样式方面,babkenvardanyan-pylint是出了名的严格。我建议你使用flake8或pyflakes,这样你一整天都不会听到毫无意义的警告。
下面是我在脚本中放入的一段代码,我不想在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) |
现在您可以使用真正的"原始"输入。它很贵,但又短又可读。使用原始输入通常花费时间(等待输入),因此它并不重要。
理论上,您甚至可以分配原始输入而不是实际的原始输入,但是可能有一些模块检查原始输入的存在并相应地执行操作。最好站在安全的一边。
- 我在尝试时会得到这个:inputcons=vars(builtins).get('raw_input',input)typeerror:vars()参数必须具有dict属性
也许不是最好的解决办法,但在我来这里之前,我只是临时做了这个,以便继续工作而不需要很快地从学习中解脱出来。
1 2
| def raw_input(x):
input(x) |
然后,当我运行我正在编写的脚本raw_input('Enter your first name: ')时,它会像input()一样捕获它。
也许有理由不这么做,因为我还没有遇到!