在python 2和3中使用input/raw_input

218*_*218 40 python input python-2.x raw-input python-3.x

我想用以下问题设置用户提示:

save_flag is not set to 1; data will not be saved. Press enter to continue.
Run Code Online (Sandbox Code Playgroud)

input()适用于python3但不适用于python2.raw_input()适用于python2但不适用于python3.有没有办法做到这一点,以便代码兼容python 2和python 3?

Ash*_*ary 51

绑定raw_inputinput在Python 2:

try:
    input = raw_input
except NameError:
    pass
Run Code Online (Sandbox Code Playgroud)

现在input也将在Python 2中返回一个字符串.


如果您正在使用six编写2/3兼容代码,则six.input()可以raw_input()在Python 2和input()Python 3中找到它们.

  • 唉...... Pylint既是一种祝福又是一种诅咒.n00bs对Python的祝福,以帮助指导他们编写Python代码; 对高级Python charmers的诅咒,用于为完美有效的代码拍打它们.我认为Pylint在这种情况下是错误的,并且为了让一些工具满意而不得不使用`#pylint:disable`注释来解释你的代码. (4认同)
  • 当我尝试使用它时,我在之后使用`input`时会得到'UnboundLocalError:局部变量'输入'在赋值之前引用',即使它正在运行Python 3 (4认同)
  • Python 2.7上的Pylint不喜欢它:`重新定义内置'输入'(重新定义内置)` (3认同)
  • @ProQ那是因为你在函数/类中执行此操作.你需要在外面做,否则Python会认为你正在声明一个局部变量,如果有一个NameError它就没有值. (3认同)

jdb*_*org 9

我认为最好的办法是

import six

six.moves.input()
Run Code Online (Sandbox Code Playgroud)

......它将在2和3之间工作.


ems*_*sch 5

更新:此方法仅在您将来安装并且上面的答案更好且更通用时才有效.

这个备忘单中有另一种看起来更干净的方法:

# Python 2 and 3:
from builtins import input
Run Code Online (Sandbox Code Playgroud)

  • 在Python 2中:`ImportError:没有名为builtins的模块 (6认同)
  • 啊,我安装了未来的包,但没有意识到. (4认同)
  • 大多数现代python培训课程提供此代码来克服这个问题:`if hasattr(__ builtins __,'raw_input'):input = raw_input`(第二行在第一行下缩进).这里提供的答案不适用于iPacthon 2.7的Anaconda发行版,我也看到其他人报告此解决方案的问题.应该删除这个答案,这样人们就不会尝试使用它并遇到麻烦. (2认同)