在python27的输入中使用变量会因语法问题而失败

在python27的输入中使用变量会因语法问题而失败,python,python-3.x,python-2.7,input,Python,Python 3.x,Python 2.7,Input,我有以下代码,可在py 27和36中使用: all_config_msgs = ['Okta App URL. E.g https://acme.okta.com/home/amazon_aws/b07384d113edec49eaa6/123: ','Organization username. E.g jane.doe@acme.com: '] config_details = [] for config_msg in all_config_msgs: config_details.

我有以下代码,可在py 27和36中使用:

all_config_msgs = ['Okta App URL. E.g https://acme.okta.com/home/amazon_aws/b07384d113edec49eaa6/123: ','Organization username. E.g jane.doe@acme.com: ']
config_details = []
for config_msg in all_config_msgs:
    config_details.append(input(config_msg))
在py 36和27中,我得到输入提示:

Okta应用程序URL。例如:

  • 在py 36中,我提出:
任何回复

它成功地实现了这一目标

  • 在py 27中,我提出:
任何回复

这与

config_details.append(input(config_msg))
File "<string>", line 1
https://acme.okta.com/home/amazon_aws/b07384d113edec49eaa6/123
     ^
SyntaxError: invalid syntax
config\u details.append(输入(config\u msg))
文件“”,第1行
https://acme.okta.com/home/amazon_aws/b07384d113edec49eaa6/123
^
SyntaxError:无效语法
仅供参考-在py 27中,如果我将响应设置为“any_reply” 但是我需要一种不用双引号的回答方式


我知道在py 27中,输入是在进行求值,但有什么好方法可以让输入提示符作为变量而不出现上述错误呢

在Python2.7上,您应该使用
raw\u输入

如果您想支持多个版本的Python,您可以创建自己的函数,该函数将同时适用于Python 2和Python 3:

def my_input():
    try:
        return raw_input()
    except NameError:
        return input()
您还可以利用库来解决兼容性问题:

from six.move import input

这将在Python2中使用
raw\u输入
,在Python3中使用
input

Denis的答案是正确的。您可以有条件地使用该函数。这在Python中是一种非常常见的模式,特别是当您关心跨版本兼容性时

try:
    my_input = raw_input
except NameError:
    my_input = input

all_config_msgs = ['Okta App URL. E.g https://acme.okta.com/home/amazon_aws/b07384d113edec49eaa6/123: ','Organization username. E.g jane.doe@acme.com: ']
config_details = []
for config_msg in all_config_msgs:
    config_details.append(my_input(config_msg))
在Python2.7和3.5中进行了测试和工作,但它也适用于您的版本

另一个有点争议的选项,因为有些人对更改全局名称感到奇怪,就是强制执行原始输入存在,或者定义它:

try:
    _ = raw_input
except NameError:
    raw_input = input
你可以用
为了解决兼容性问题,Python2.x相当于Python3的
input()
raw\u input()
。2.x
input()
只接受语法上有效的Python表达式。所以不能在input中执行吗?@Scooby
input()
在Python2中类似于
exec(raw\u input())
,我不相信url是标准的Python标记(不是可执行代码),所以您前面问题的答案可能是“否”。你需要按照答案的建议去做,或者从stdin中手动读取。这必须与27和36一起工作,所以我需要使用输入。然后你可以创建自己的输入函数来处理Python2和3。我将提供一个示例/I将执行
try:input=raw\u input,除了NameError:pass
,这样您就可以在程序中使用
input
。您不需要为异常中的
raw\u input
分配任何内容block@Jean-弗朗索瓦·法布一世刚刚添加了一个类似的例子。有些人对重新定义传统的内置名称感到奇怪,但我也更喜欢这样:D@Jean-弗朗索瓦·法布我不明白你的意思。你应该提供你的评论作为答案。读了所有这些,现在我认为它应该作为副本关闭。多年来,这个问题在这里被提出了一千次。