input() error - NameError: name '...' is not defined
input function in Python 2.7, evaluates whatever your enter, as a Python expression. If you simply want to read strings, then use
raw_input function in Python 2.7, which will not evaluate the read strings.
If you are using Python 3.x,
raw_input has been renamed to
input. Quoting the Python 3.0 release notes,
raw_input()was renamed to
input(). That is, the new
input()function reads a line from
sys.stdinand returns it with the trailing newline stripped. It raises
EOFErrorif the input is terminated prematurely. To get the old behavior of
input = eval(raw_input)
Consider the following piece of code to understand this better
"thefourtheye"input_variable = input("Enter your name: ")Enter your name: dude input_variable'thefourtheye'dude =
input accepts a string from the user and evaluates the string in the current Python context. When I type
dude as input, it finds that
dude is bound to the value
thefourtheye and so the result of evaluation becomes
thefourtheye and that gets assigned to
If I enter something else which is not there in the current python context, it will fail will the
input("Enter your name: ")Enter your name: dummyTraceback (most recent call last): File "<input>", line 1, in <module> File "<string>", line 1, in <module>NameError: name 'dummy' is not defined
Security considerations with Python 2.7's
Since whatever user types is evaluated, it imposes security issues as well. For example, if you have already loaded
os module in your program with
import os, and then the user types in
this will be evaluated as a function call expression by python and it will be executed. If you are executing Python with elevated privileges,
/etc/hosts file will be deleted. See, how dangerous it could be?
To demonstrate this, let's try to execute
input function again.
"thefourtheye"input("Enter your name: ")Enter your name: input("Enter your name again: ")Enter your name again: dudedude =
input("Enter your name: ") is executed, it waits for the user input and the user input is a valid Python function invocation and so that is also invoked. That is why we are seeing
Enter your name again: prompt again.
So, you are better off with
raw_input function, like this
input_variable = raw_input("Enter your name: ")
If you need to convert the result to some other type, then you can use appropriate functions to convert the string returned by
raw_input. For example, to read inputs as integers, use the
int function, like shown in this answer.
In python 3.x, there is only one function to get user inputs and that is called
input, which is equivalent to Python 2.7's
Since you are writing for Python 3.x, you'll want to begin your script with:
If you use:
It will default to Python 2.x. These go on the first line of your script, if there is nothing that starts with #! (aka the shebang).
If your scripts just start with:
Then you can change it to:
Although this shorter formatting is only recognized by a few programs, such as the launcher, so it is not the best choice.
The first two examples are much more widely used and will help ensure your code will work on any machine that has Python installed.