ข้อผิดพลาดของอินพุต () - NameError: ชื่อ '…' ไม่ได้ถูกกำหนดไว้


220

ฉันได้รับข้อผิดพลาดเมื่อพยายามเรียกใช้สคริปต์อย่างง่ายนี้:

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

ฉันกำลังเรียกใช้สคริปต์เหล่านี้ด้วย Python 2.7


12
คุณแน่ใจหรือว่าเป็น Python 3.3 ฉันคาดว่าinputจะทำตัวแบบนี้ แต่เฉพาะใน 2.7 มันพูดอะไรเมื่อคุณเรียกใช้python --versionจากพรอมต์คำสั่ง? อีกวิธีหนึ่งถ้าคุณเขียนimport sys; print(sys.version)ที่จุดเริ่มต้นของสคริปต์ของคุณ?
เควิน

1
คุณไม่ได้ใช้ Python 3 คุณกำลังใช้งาน Python 2 อยู่ดี (ฉันไม่คุ้นเคยกับแอพ "Python Launcher")
Wooble

1
ใส่เป็นบรรทัดแรกimport sysและบรรทัดที่สองprint(sys.version_info)เพื่อตรวจสอบว่าคุณใช้เวอร์ชันใดอยู่
Hyperboreus

1
ฉันทำสิ่งที่เควินพูดและเป็นรุ่น 2.7.5! ฉันไม่แน่ใจเหมือนกัน ฉันดาวน์โหลดและติดตั้งเวอร์ชั่น 3.3 ในโฟลเดอร์แอปพลิเคชันของฉันมีโฟลเดอร์ที่เรียกว่า "Python 3.3" ในโฟลเดอร์นั้นมีแอพที่เรียกว่า "Python Launcher" และฉันกำลังเรียกใช้สคริปต์ของฉันโดยการลากและวางลงในแอพ Python Launcher . ทำไมฉันถึงยังใช้ 2.7 เมื่อฉันใช้แอพเรียกใช้งาน 3.3
chillpenguin

2
@chillpenguin: ลองดูกล่องโต้ตอบ Preferences สำหรับ Python Launcher เห็นได้ชัดว่ามันไม่ได้เป็นค่าเริ่มต้นสำหรับการใช้งานเวอร์ชันที่ติดตั้งไว้ซึ่ง ... โง่ (ฉันไม่เคยใช้มันมาก่อนเลยฉันพบว่าการใช้ Terminal นั้นดีกว่า ... )
Wooble

คำตอบ:


265

TL; DR

inputฟังก์ชั่นใน Python 2.7 ประเมินสิ่งที่คุณป้อนเป็นนิพจน์ Python หากคุณต้องการอ่านสตริงให้ใช้raw_inputฟังก์ชันใน Python 2.7 ซึ่งจะไม่ประเมินค่าสตริงการอ่าน

หากคุณกำลังใช้งูหลาม 3.x, ได้รับการเปลี่ยนชื่อเป็นraw_input inputอ้างบันทึกประจำรุ่น Python 3.0 ,

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เป็น input ก็พบว่าdudeถูกผูกไว้กับค่าthefourtheyeและเพื่อให้ผลการประเมินจะกลายเป็นและที่ได้รับมอบหมายให้thefourtheyeinput_variable

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's 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ฟังก์ชันดังที่แสดงในคำตอบนี้

ในหลาม 3.xมีเพียงหนึ่งฟังก์ชั่นที่จะได้รับปัจจัยการผลิตของผู้ใช้และที่เรียกว่าinputซึ่งเทียบเท่ากับงูหลาม raw_input2.7


56

คุณกำลังเรียกใช้ Python 2 ไม่ใช่ Python 3 เพื่อให้สามารถใช้งาน Python 2 raw_inputได้

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

17

เนื่องจากคุณเขียน Python 3.x คุณจะต้องเริ่มต้นสคริปต์ด้วย:

#!/usr/bin/env python3

ถ้าคุณใช้:

#!/usr/bin/env python

มันจะเริ่มต้นเพื่อ Python 2.x สิ่งเหล่านี้จะอยู่ในบรรทัดแรกของสคริปต์ของคุณหากไม่มีสิ่งใดที่ขึ้นต้นด้วย#! (อาคาเช่)

หากสคริปต์ของคุณเริ่มต้นด้วย:

#! python

จากนั้นคุณสามารถเปลี่ยนเป็น:

#! python3

แม้ว่าการจัดรูปแบบที่สั้นกว่านี้จะได้รับการยอมรับโดยบางโปรแกรมเท่านั้นเช่นตัวเรียกใช้ดังนั้นจึงไม่ใช่ตัวเลือกที่ดีที่สุด

ตัวอย่างสองตัวอย่างแรกนั้นใช้กันอย่างแพร่หลายและจะช่วยให้แน่ใจว่ารหัสของคุณจะทำงานบนเครื่องที่ติดตั้ง Python


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))

5

สำหรับ python 3 ขึ้นไป

s = raw_input()

มันจะแก้ปัญหาใน pycharm IDE ถ้าคุณกำลังแก้ไขในเว็บไซต์ออนไลน์ว่าแฮ็คเกอร์แตรแล้วใช้:

s = input()

4

คุณสามารถทำได้:

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

หรือ:

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

1
raw_input แก้ไขปัญหาให้ฉัน
Spencer Goff

แต่ raw_input () ไม่สามารถใช้ได้ใน Python 3
carthurs

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

คุณต้องป้อนข้อมูลในเครื่องหมายคำพูดเดี่ยวหรือคู่

Ex:'dude' -> correct

    dude -> not correct

4

ฉันยังพบปัญหานี้กับโมดูลที่คาดว่าจะเข้ากันได้สำหรับ python 2.7 และ 3.7

สิ่งที่ฉันพบเพื่อแก้ไขปัญหาคือการนำเข้า:

from six.moves import input

นี่เป็นการแก้ไขการใช้งานของทั้งสองล่าม

คุณสามารถอ่านเพิ่มเติมเกี่ยวกับห้องสมุดทั้งหกที่นี่


3

เราใช้สิ่งต่อไปนี้ที่ใช้งานได้ทั้งpython 2 และ python 3

#Works in Python 2 and 3:
try: input = raw_input
except NameError: pass
print(input("Enter your name: "))

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)ตามที่เควินแนะนำคุณจะเห็นว่าสคริปต์กำลังถูกตีความโดย python3


2

มีส่วนร่วมที่ดีก่อนหน้านี้

import sys; print(sys.version)

def ingreso(nombre):
    print('Hi ', nombre, type(nombre))

def bienvenida(nombre):
    print("Hi "+nombre+", bye ")

nombre = raw_input("Enter your name: ")

ingreso(nombre)
bienvenida(nombre)

#Works in Python 2 and 3:
try: input = raw_input
except NameError: pass
print(input("Your name: "))
ใส่ชื่อของคุณ: โจ
('Hi', 'Joe', <type 'str'>)
สวัสดีโจลาก่อน 

ชื่อของคุณ: Joe
โจ

ขอบคุณ!


1

มีสองวิธีในการแก้ไขปัญหาเหล่านี้

  • ขั้นแรกง่าย ๆ โดยไม่ต้องเปลี่ยนรหัสที่
    ใช้งานสคริปต์ของคุณโดย Python3
    ถ้าคุณยังต้องการที่จะรันบน python2หลังจากนั้นก็รันสคริปต์ python ของคุณเมื่อคุณป้อนอินพุตโปรดจำไว้

    1. ถ้าคุณต้องการที่จะป้อนstringแล้วเพียงแค่เริ่มพิมพ์ด้วย "ป้อนไปด้วยคำพูดสองครั้ง" และมันจะทำงานใน python2.7 และ
    2. หากคุณต้องการป้อนตัวอักษรให้ใช้ข้อความที่มีเครื่องหมายคำพูดเดี่ยวเช่น 'อินพุตของคุณอยู่ที่นี่'
    3. หากคุณต้องการป้อนหมายเลขไม่ใช่ปัญหาคุณเพียงพิมพ์หมายเลข
  • วิธีที่สองคือการเปลี่ยนแปลงรหัส
    ใช้การนำเข้าด้านล่างและเรียกใช้กับงูหลามรุ่นใด ๆ

    1. from six.moves import input
    2. ใช้raw_input()ฟังก์ชั่นแทนinput()ฟังก์ชั่นในรหัสของคุณด้วยการนำเข้าใด ๆ
    3. ฆ่าเชื้อรหัสของคุณด้วยstr()ฟังก์ชั่นที่ชอบstr(input())แล้วกำหนดให้กับตัวแปรใด ๆ

ตามที่แสดงถึงข้อผิดพลาด :
ชื่อ 'เพื่อน' ไม่ได้ถูกกำหนดเช่นสำหรับงูใหญ่ 'เพื่อน' กลายเป็นตัวแปรที่นี่และมันไม่มีค่าใด ๆ ของงูหลามกำหนดประเภทที่ได้รับมอบหมาย
ดังนั้นร้องไห้เหมือนเด็กดังนั้นถ้าเรากำหนดตัวแปร 'เพื่อน' และกำหนดค่าใด ๆ และผ่านไปมันจะทำงาน แต่นั่นไม่ใช่สิ่งที่เราต้องการในขณะที่เราไม่ทราบว่าผู้ใช้จะป้อนอะไรและยิ่งกว่านั้นเราต้องการที่จะจับการป้อนข้อมูลของผู้ใช้

ความจริงเกี่ยวกับวิธีการเหล่านี้:
input()ฟังก์ชั่น:ฟังก์ชั่นนี้จะใช้ค่าและประเภทของอินพุตที่คุณป้อนตามที่มันเป็นโดยไม่ต้องแก้ไขมันพิมพ์
raw_input() ฟังก์ชั่น: ฟังก์ชั่นนี้จะแปลงอินพุตที่คุณกำหนดให้เป็นสตริงประเภทอย่างชัดเจน

หมายเหตุ:
ช่องโหว่ในวิธีการป้อนข้อมูล () อยู่ในความจริงที่ว่าทุกคนสามารถเข้าถึงตัวแปรของการเข้าถึงค่าของอินพุตโดยใช้ชื่อตัวแปรหรือวิธีการ


0

คุณสามารถเปลี่ยนไพ ธ อนที่คุณใช้กับ IDE ของคุณได้ถ้าคุณได้ดาวน์โหลดไพ ธ อนแล้ว 3.x ไม่ควรเปลี่ยนยากเกินไป แต่สคริปต์ของคุณทำงานได้ดีบน python 3.x ฉันแค่เปลี่ยน

print ("your name is" + input_variable)

ถึง

print ("your name is", input_variable)

เพราะด้วยเครื่องหมายจุลภาคมันพิมพ์ด้วยช่องว่างในระหว่างyour name isและสิ่งที่ผู้ใช้ป้อน และ: หากคุณใช้ 2.7 เพียงใช้raw_inputแทนการป้อนข้อมูล

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.