2014-01-14 38 views
107

我得到一個錯誤,當我嘗試運行這個簡單的Python腳本:輸入()錯誤 - NameError:名字「...」沒有定義

input_variable = input ("Enter your name: ") 
print ("your name is" + input_variable) 

可以說,我輸入‘花花公子’,我得到的錯誤是:

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的桌面應用。

編輯:我意識到我在某種程度上用2.7來運行這些腳本。我想真正的問題是如何在3.3版本上運行我的腳本?我想如果我將腳本拖放到我的應用程序文件夾中的Python 3.3文件夾內的Python Launcher應用程序的頂部,它將使用3.3啓動我的腳本。我想這個方法仍然會用2.7來啓動腳本。那麼我如何使用3.3?

+9

你確定它是Python 3.3?我希望'輸入'表現這種方式,但只有2.7。當你從命令提示符運行'python --version'時它說了什麼?另外,如果你寫'import sys;打印(sys.version)'在腳本的開頭? – Kevin

+1

你沒有運行的Python 3.您正在運行的Python 2,不知爲什麼(我不熟悉這個「Python的啓動器」應用程序) – geoffspear

+1

將作爲一線'進口sys'和第二行'打印(sys.version_info )'以確定您使用的是哪個版本。 – Hyperboreus

回答

33

您正在運行Python 2,而不是Python 3.爲了在Python 2中運行,請使用raw_input

input_variable = raw_input ("Enter your name: ") 
print ("your name is" + input_variable) 
195

TL; DR

input在Python 2.7的功能,評估無論你的進入,作爲一個Python表達式。如果你只是想讀取字符串,那麼在Python 2.7中使用raw_input函數,它不會評估讀取的字符串。

如果您使用的是Python 3.x,則raw_input已被重命名爲input。引述Python 3.0 release notes

raw_input() was renamed to input() . That is, the new input() function reads a line from sys.stdin and returns it with the trailing newline stripped. It raises EOFError if the input is terminated prematurely. To get the old behavior of input() , use 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

+10

我知道這個問題是dup,這就是爲什麼這裏有這麼幾張選票,但這是一個很好的答案。你解釋理論,舉一個我們新手可能沒有想到的東西的實際例子,並給出一個簡單的解決方案。謝謝。 –

+0

有趣的消除。作爲我新手到python,這啓發了我的想法;) –

8

既然你正在編寫Python的3.x的,你會想開始你的腳本:如果您使用

#!/usr/bin/env python3 

#!/usr/bin/env python 

它會默認爲Python的2.X 。如果沒有以#開頭的東西,那麼這些就會出現在腳本的第一行。(又名shebang)。

如果你的腳本只是開始:

#! python 

然後你就可以把它改成:

#! python3 

雖然這種短格式只被很少的程序,如發射器識別,所以這不是最好的選擇。

前兩個例子的使用更爲廣泛,它有助於確保您的代碼可以在安裝了Python的任何機器上工作。

2

對於任何可能遇到此問題的人來說,即使在腳本的開頭包含#!/usr/bin/env python3,如果文件不可執行,shebang也會被忽略。

要確定您的文件是否爲可執行文件:

  • 運行./filename.py命令行
  • ,如果你得到-bash: ./filename.py: Permission denied,運行chmod a+x filename.py
  • 運行./filename.py再次

如果您包括import sys; print(sys.version)正如凱文所建議的那樣,你現在會看到腳本正在被解釋d。通過python3

0

您可以更改Python中,你使用的是與你的IDE,如果你已經下載的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而不是輸入。

1

ü既可以做

x = raw_input("enter your name") 
print "your name is %s " % x 

x = str(input("enter your name")) 
print "your name is %s" % x 
+0

raw_input解決了我的問題給我 –

1

爲Python 3及以上

S =的raw_input()

它將解決上pycharm問題IDE 如果你是olving在線網站上完全hackerrank然後使用:

s = input() 
相關問題