当我尝试运行这个简单的python脚本时出现错误:
input_variable = input ("Enter your name: ")
print ("your name is" + input_variable)
让我说我输入“dude”,我得到的错误是:
line 1, in <module>
input_variable = input ("Enter your name: ")
File "<string>", line 1, in <module>
NameError: name 'dude' is not defined
我正在运行Mac OS X 10.9.1,我正在使用安装python 3.3附带的Python Launcher应用程序来运行脚本。
编辑:我意识到我以2.7的方式运行这些脚本。我想真正的问题是我如何使用3.3版运行我的脚本?我想如果我将我的脚本拖放到我的应用程序文件夹中的Python 3.3文件夹内的Python Launcher应用程序之上,它将使用3.3启动我的脚本。我想这个方法仍然用2.7启动脚本。那么我该如何使用3.3?
答案 0 :(得分:240)
<强> TL; DR 强>
Python 2.7中的 input
函数,作为Python表达式计算您输入的内容。如果您只是想读取字符串,那么在Python 2.7中使用raw_input
函数,它不会评估读取字符串。
如果您使用的是Python 3.x,则raw_input
已重命名为input
。引用Python 3.0 release notes,
raw_input()
已重命名为input()
。也就是说,新的input()
函数从sys.stdin
读取一行,并在删除尾随换行符的情况下返回该行。如果输入提前终止,它会引发EOFError
。要获取input()
的旧行为,请使用eval(input())
在Python 2.7 中,有两个函数可用于接受用户输入。一个是input
,另一个是raw_input
。您可以将它们之间的关系想象如下
input = eval(raw_input)
考虑以下代码来更好地理解
>>> dude = "thefourtheye"
>>> input_variable = input("Enter your name: ")
Enter your name: dude
>>> input_variable
'thefourtheye'
input
接受来自用户的字符串,并在当前Python上下文中计算字符串。当我输入dude
作为输入时,它会发现dude
绑定到值thefourtheye
,因此评估结果变为thefourtheye
,并将其分配给input_variable
}。
如果我输入当前python上下文中不存在的其他内容,那么NameError
将会失败。
>>> input("Enter your name: ")
Enter your name: dummy
Traceback (most recent call last):
File "<input>", line 1, in <module>
File "<string>", line 1, in <module>
NameError: name 'dummy' is not defined
使用Python 2.7的input
安全注意事项:
由于评估了任何用户类型,因此也会产生安全问题。例如,如果您已使用os
在程序中加载了import os
模块,则用户输入
os.remove("/etc/hosts")
这将被python评估为函数调用表达式,它将被执行。如果您使用提升的权限执行Python,则将删除/etc/hosts
文件。看,它有多危险?
为了证明这一点,让我们再次尝试执行input
函数。
>>> dude = "thefourtheye"
>>> input("Enter your name: ")
Enter your name: input("Enter your name again: ")
Enter your name again: dude
现在,当执行input("Enter your name: ")
时,它等待用户输入,并且用户输入是有效的Python函数调用,因此也会调用它。这就是我们再次看到Enter your name again:
提示的原因。
所以,你最好使用raw_input
函数,比如这个
input_variable = raw_input("Enter your name: ")
如果需要将结果转换为其他类型,则可以使用适当的函数转换raw_input
返回的字符串。例如,要将输入读取为整数,请使用int
函数,如this answer中所示。
在python 3.x 中,只有一个函数可以获取用户输入,称为input
,相当于Python 2.7的raw_input
。< / p>
答案 1 :(得分:49)
您正在运行Python 2,而不是Python 3.为了在Python 2中运行,请使用raw_input
。
input_variable = raw_input ("Enter your name: ")
print ("your name is" + input_variable)
答案 2 :(得分:14)
由于您是为Python 3.x编写的,因此您需要使用以下命令开始编写脚本:
#!/usr/bin/env python3
如果您使用:
#!/usr/bin/env python
默认为Python 2.x.如果没有任何东西以#!(又名shebang)开头,这些就会出现在脚本的第一行。
如果您的脚本只是以:
开头#! python
然后您可以将其更改为:
#! python3
虽然这种较短的格式只能被少数程序识别,例如启动器,所以它不是最佳选择。
前两个示例使用得更为广泛,有助于确保您的代码可以在任何安装了Python的计算机上运行。
答案 3 :(得分:6)
您应该使用raw_input
,因为您使用的是python-2.7。在变量上使用input()
时(例如:s = input('Name: ')
),它将在Python环境中执行命令,而不保存您在变量(s
)上写的内容并创建错误如果你写的东西没有定义。
raw_input()
将正确保存您在变量上写的内容(例如:f = raw_input('Name : ')
),并且不会在Python环境中执行它而不会产生任何可能的错误:
input_variable = raw_input('Enter Your Name : ')
print("Your Name Is : " + (input_variable))
答案 4 :(得分:4)
对于python 3及以上
nodes =
26 12 6 2
它将解决pycharm IDE上的问题 如果你在网站上完全解决hackerrank然后使用:
s = raw_input()
答案 5 :(得分:3)
input_variable = input ("Enter your name: ")
print ("your name is" + input_variable)
您必须使用单引号或双引号输入
Ex:'dude' -> correct
dude -> not correct
答案 6 :(得分:2)
对于可能遇到此问题的其他任何人,即使您在脚本的开头包含#!/usr/bin/env python3
,如果文件不可执行,也会忽略shebang。
确定您的文件是否可执行:
./filename.py
-bash: ./filename.py: Permission denied
,请运行chmod a+x filename.py
./filename.py
如果您已经将Kevin import sys; print(sys.version)
包括在内,那么您现在可以看到该脚本正由python3解释
答案 7 :(得分:2)
你可以这样做:
x = raw_input("enter your name")
print "your name is %s " % x
或:
x = str(input("enter your name"))
print "your name is %s" % x
答案 8 :(得分:2)
我们使用的是同时适用于 python 2和python 3
的以下内容#Works in Python 2 and 3:
try: input = raw_input
except NameError: pass
print(input("Enter your name: "))
答案 9 :(得分:0)
你可以改变你在IDE中使用的python,如果你已经下载了python 3.x,那么切换起来应该不会太难。但是你的脚本在python 3.x上运行正常,我只想改变
print ("your name is" + input_variable)
到
print ("your name is", input_variable)
因为使用逗号,它会在your name is
和用户输入的内容之间打印一个空格。 AND:如果您使用的是2.7,请使用raw_input
而不是输入。
答案 10 :(得分:0)
以前的贡献很好。
let Vector2 = geometer.Vector2Impl;
Enter your name: Joe ('Hi ', 'Joe', <type 'str'>) Hi Joe, bye Your name: Joe Joe
谢谢!
答案 11 :(得分:0)
我还遇到了一个应该与python 2.7和3.7兼容的模块的问题
我发现要解决的问题正在导入:
from six.moves import input
这固定了两个口译员的可用性
您可以了解有关六个库here
的更多信息答案 12 :(得分:0)
有两种方法可以解决这些问题,
第一个简单,无需更改代码
通过Python3运行脚本,
如果您仍想在python2上运行,
运行python脚本后,输入输入时请记住
string
,则只需使用“ input go with double-quote”输入即可,它将在python2.7和第二种方法是更改代码
使用下面的导入并运行任何版本的python
from six.moves import input
raw_input()
函数而不是input()
函数进行任何导入str()
之类的str(input())
函数对代码进行处理,然后将其分配给任何变量 错误提示:
未定义名称'dude'
即对于python'dude'在这里成为变量,并且没有分配任何python定义的类型的值
,所以只有它哭了,就像婴儿一样,因此,如果我们定义'dude'变量并分配任何值并传递给它,它将可以,但这不是我们想要的,因为我们不知道用户将输入什么,而且我们还希望捕获用户的输入。
有关这些方法的事实:
input()
函数:此函数按原样使用您输入的输入的值和类型,而无需修改其类型。
raw_input()
函数:此函数将您提供的输入明确转换为字符串类型,
注意:
input()方法中的漏洞在于 任何人都可以访问访问输入值的变量 只需使用变量或方法的名称即可。
答案 13 :(得分:0)
答案 14 :(得分:0)
这是一个与Python 2.7和Python 3+兼容的输入函数:
(@Hardian稍作修改的答案)以避免UnboundLocalError: local variable 'input' referenced before assignment
错误
def input_compatible(prompt=None):
try:
input_func = raw_input
except NameError:
input_func = input
return input_func(prompt)