【问题标题】:How do I use raw_input in Python 3如何在 Python 3 中使用 raw_input
【发布时间】:2009-06-05 08:32:23
【问题描述】:
import sys
print(sys.platform)
print(2**100)
raw_input()

我使用的是 Python 3.1,无法让 raw_input“冻结”dos 弹出窗口。我正在阅读的书适用于 Python 2.5,而我正在使用 Python 3.1

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

【问题讨论】:

  • hm,当我尝试使用您的代码时,我收到 NameError: name 'raw_input' is not defined。你不也一样吗?
  • Python 3 发生了很大的变化,所以可能你不应该尝试使用 2.5 的书来掌握它(这真的很老了)。
  • raw_input 在 python 3 中被重命名为 input

标签: python python-3.x


【解决方案1】:

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

来自What’s New In Python 3.0, Builtins section第二条。

【讨论】:

  • 最初有一个函数 input(),其作用类似于当前的 eval(input())。这是 Python 缺乏安全意识时的遗留问题。这一变化简化了语言。另请参阅“导入此”以获得更深入的解释。你会喜欢一种死的语言而不是进化的语言吗?周围有很多这样的人。
  • 我也在学习 python,发现input()raw_input() 之间有一个区别。 a = input() 将接受用户输入并将其放入正确的类型中。例如:如果用户键入 5,那么a 中的值是整数 5。a = raw_input() 将接受用户输入并将其作为字符串。例如:如果用户键入 5,则 a 中的值是字符串 '5' 而不是整数。认为这对于像我这样的 python 新手来说可能是个好信息。
  • @VishnuNarang 是的,这在 Python 2 中是正确的。但在 Python 3 中,这种行为发生了变化,输入的作用与 Python 2 中的 raw_input 相同。
  • @balpha :刚刚验证。你是对的。我有 python 2.7(无法编辑答案以提及...)
  • @meawoppl 从 python 2 迁移到 3 意味着要崩溃。这并不意味着它必须是。一种语言可以在不消亡和不改变函数签名的情况下进化。如果您没有全局函数,它会有所帮助。从其他语言的一些后见之明开始。等等。删除功能也不是不可能的。
【解决方案2】:

这适用于 Python 3.x 和 2.x:

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

【讨论】:

  • 我通过这种方法获得了scope issue。在调用函数的顶部使用global input 修复它。
  • 这对我来说似乎有点干净:import __builtin__; input = getattr(__builtin__, 'raw_input', input)
  • Python 3 没有名为 __builtin__ 的模块。
  • @mbarkau:它太全球化了。如果你调用一个不期望它的库怎么办? __builtin__ 在 Python 3 中重命名为 builtins。两者在 CPython 中都可以作为 __builtins__ 使用。
  • getattr(__builtins__, 'raw_input', input) 在 Python 2.7.2 中导入时返回默认值。
【解决方案3】:

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

from six.moves import input

six 是一个修补许多 2/3 常见代码库痛点的模块。

【讨论】:

  • 好主意...如果您使用from six.moves import input as raw_input,您可以在脚本中保留raw_input 并使用两个Python 版本运行。
【解决方案4】:

正如其他人所指出的,raw_input 函数在 Python 3.0 中已重命名为 input,而且您确实会得到一本更新的书更好的服务,但我想指出的是查看脚本输出的更好方法。

根据您的描述,我认为您使用的是 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 )当您的程序完成运行时,无论它是否成功完成,窗口将保持打开状态并再次出现命令提示符供您使用键入另一个命令。如果你想再次运行你的程序,你可以按向上箭头来调用你之前输入的命令,然后按回车再次运行它,而不必每次都输入文件名。

使用空闲

IDLE 是一个简单的程序编辑器,随 Python 一起安装。除其他功能外,它还可以在窗口中运行您的程序。右键单击您的 .py 文件并选择“在 IDLE 中编辑”。当您的程序出现在编辑器中时,按 F5 或从“运行”菜单中选择“运行模块”。您的程序将在程序结束后保持打开的窗口中运行,您可以在其中输入 Python 命令立即运行。

【讨论】:

  • Windows 是否安装了 IDLE?在我的终端中运行 IDLE 或 idle 是空的。
  • IDLE 在 Windows 上随 Python 一起安装。它显示为开始菜单中的快捷方式和 .py 文件的文件关联,但我认为默认情况下没有任何“空闲”命令添加到您的路径中。如果你想从命令行启动它,你可以运行pythonw -m idlelib.idle
  • 这就解释了。我接触 Windows 只是为了赚钱,而不是作为操作系统。然后我会说你的“使用空闲”部分是有偏见的。也许你应该提到选择性。
  • 我不确定我是否理解。问题是特定于 Windows 的。它谈到了“DOS弹出窗口”。 IDLE 是作为 Python 的一部分安装的,但一些发行商可能会将其分开。例如,在 Ubuntu 中,您似乎必须将其安装为单独的软件包。答案已经暗示了与提问者所要求的方法不同的方法,所以我不想再添加更多的切线。 FWIW 我在家里使用 Linux,只在必须工作的地方使用 Windows。
  • DOS 是几个密切相关的操作系统的首字母缩写词,这些操作系统在 1981 年至 1995 年或直到 2000 年左右主导了 IBM PC 兼容市场,包括部分基于 DOS 的 Microsoft Windows 版本 95、98 和 Millennium Edition .
【解决方案5】:

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

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 在代码风格方面是出了名的严格。我会推荐flake8pyflakes,以免整天被无意义的警告占用。
【解决方案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 = vars(builtins).get('raw_input', input) TypeError: vars() argument must have dict 属性
【解决方案7】:

可能不是最好的解决方案,但在我来到这里之前,我只是为了继续工作而不需要从学习中快速休息。

def raw_input(x):
  input(x)

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

可能有理由不这样做,我还没有遇到过!

【讨论】:

  • 为什么不只是raw_input = input
【解决方案8】:

下面的呢?应该允许您在 Python2 和 Python3 中使用 raw_input 或 input 以及 Python2 的 raw_input 语义(也就是 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

【讨论】:

  • 哈哈。这是一个向后兼容的好技巧。
【解决方案9】:

另一种方法是创建一个新函数。

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 中运行的脚本和输入时,我会使用它

【讨论】:

    猜你喜欢
    • 2017-05-21
    • 2014-03-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-08-16
    相关资源
    最近更新 更多