lỗi đầu vào () - NameError: tên '' 'không được xác định


219

Tôi gặp lỗi khi tôi cố chạy tập lệnh đơn giản này:

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

Giả sử tôi gõ "anh chàng", lỗi tôi gặp là:

line 1, in <module>
input_variable = input ("Enter your name: ")
File "<string>", line 1, in <module>
NameError: name 'dude' is not defined

Tôi đang chạy các kịch bản này với Python 2.7.


12
Bạn có chắc là Python 3.3 không? Tôi sẽ mong đợi inputhành xử theo cách này, nhưng chỉ trong 2.7. Nó nói gì khi bạn chạy python --versiontừ một dấu nhắc lệnh? Ngoài ra, nếu bạn viết import sys; print(sys.version)ở đầu kịch bản thì sao?
Kevin

1
Bạn không chạy Python 3. Bạn đang chạy Python 2, bằng cách nào đó (Tôi không quen với ứng dụng "Python Launcher" này)
Wooble

1
Đặt dòng đầu tiên import sysvà dòng thứ hai print(sys.version_info)để xác định phiên bản bạn đang sử dụng.
Hyperboreus

1
Tôi đã làm những gì Kevin nói và đó là phiên bản 2.7.5! Tôi không chắc làm thế nào. Tôi đã tải xuống và cài đặt phiên bản 3.3, trong thư mục ứng dụng của tôi có một thư mục có tên "Python 3.3" bên trong thư mục đó có một ứng dụng có tên là "Python Launcher" và tôi đang chạy các tập lệnh của mình bằng cách kéo và thả chúng vào ứng dụng Python Launcher . Tại sao tôi vẫn đang sử dụng 2.7 khi tôi đang sử dụng ứng dụng launcher 3.3?
chillpenguin

2
@chillpenguin: kiểm tra hộp thoại Preferences cho Python Launcher. Rõ ràng nó không mặc định để chạy phiên bản mà nó đã được cài đặt, điều này thật ... ngu ngốc. (Tôi chưa bao giờ sử dụng nó cho mình; tôi thấy sử dụng Terminal tốt hơn ...)
Wooble

Câu trả lời:


265

TL; DR

inputhàm trong Python 2.7, đánh giá bất cứ thứ gì bạn nhập, dưới dạng biểu thức Python. Nếu bạn chỉ đơn giản muốn đọc các chuỗi, thì hãy sử dụng raw_inputhàm trong Python 2.7, nó sẽ không đánh giá các chuỗi đọc.

Nếu bạn đang sử dụng Python 3.x, raw_inputđã được đổi tên thành input. Trích dẫn ghi chú phát hành Python 3.0 ,

raw_input()đã được đổi tên thành input(). Đó là, input()hàm mới đọc một dòng từ sys.stdinvà trả về nó với dòng mới bị tước. Nó tăng EOFErrornếu đầu vào bị chấm dứt sớm. Để có được hành vi cũ của input(), sử dụngeval(input())


Trong Python 2.7 , có hai hàm có thể được sử dụng để chấp nhận đầu vào của người dùng. Một là inputvà một là raw_input. Bạn có thể nghĩ về mối quan hệ giữa chúng như sau

input = eval(raw_input)

Hãy xem xét đoạn mã sau để hiểu rõ hơn về điều này

>>> dude = "thefourtheye"
>>> input_variable = input("Enter your name: ")
Enter your name: dude
>>> input_variable
'thefourtheye'

inputchấp nhận một chuỗi từ người dùng và đánh giá chuỗi trong bối cảnh Python hiện tại. Khi tôi nhập dudelàm đầu vào, nó thấy rằng dudenó bị ràng buộc với giá trị thefourtheyevà do đó, kết quả đánh giá trở thành thefourtheyevà được gán cho input_variable.

Nếu tôi nhập một cái gì đó không có trong bối cảnh python hiện tại, nó sẽ thất bại 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

Cân nhắc bảo mật với Python 2.7 input:

Vì bất kỳ loại người dùng nào được đánh giá, nó cũng áp đặt các vấn đề bảo mật. Ví dụ: nếu bạn đã tải osmô-đun trong chương trình của mình import os, và sau đó người dùng nhập vào

os.remove("/etc/hosts")

điều này sẽ được đánh giá là một biểu thức gọi hàm bởi python và nó sẽ được thực thi. Nếu bạn đang thực thi Python với các đặc quyền nâng cao, /etc/hoststệp sẽ bị xóa. Hãy xem, nó nguy hiểm như thế nào?

Để chứng minh điều này, chúng ta hãy thử thực hiện inputlại chức năng.

>>> dude = "thefourtheye"
>>> input("Enter your name: ")
Enter your name: input("Enter your name again: ")
Enter your name again: dude

Bây giờ, khi input("Enter your name: ")được thực thi, nó chờ đầu vào của người dùng và đầu vào của người dùng là một lời gọi hàm Python hợp lệ và do đó cũng được gọi. Đó là lý do tại sao chúng ta đang thấy Enter your name again:nhắc nhở một lần nữa.

Vì vậy, bạn tốt hơn với raw_inputchức năng, như thế này

input_variable = raw_input("Enter your name: ")

Nếu bạn cần chuyển đổi kết quả sang một số loại khác, thì bạn có thể sử dụng các hàm thích hợp để chuyển đổi chuỗi được trả về raw_input. Ví dụ, để đọc các đầu vào dưới dạng số nguyên, hãy sử dụng inthàm, như thể hiện trong câu trả lời này .

Trong python 3.x , chỉ có một chức năng để nhận đầu vào của người dùng và được gọi input, tương đương với Python 2.7 raw_input.


56

Bạn đang chạy Python 2, không phải Python 3. Để điều này hoạt động trong Python 2, hãy sử dụng raw_input.

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

17

Vì bạn đang viết cho Python 3.x, bạn sẽ muốn bắt đầu tập lệnh của mình với:

#!/usr/bin/env python3

Nếu bạn dùng:

#!/usr/bin/env python

Nó sẽ mặc định là Python 2.x. Chúng đi trên dòng đầu tiên của tập lệnh của bạn, nếu không có gì bắt đầu bằng #! (còn gọi là shebang).

Nếu tập lệnh của bạn chỉ bắt đầu bằng:

#! python

Sau đó, bạn có thể thay đổi nó thành:

#! python3

Mặc dù định dạng ngắn hơn này chỉ được nhận ra bởi một vài chương trình, chẳng hạn như trình khởi chạy, vì vậy nó không phải là lựa chọn tốt nhất.

Hai ví dụ đầu tiên được sử dụng rộng rãi hơn nhiều và sẽ giúp đảm bảo mã của bạn sẽ hoạt động trên bất kỳ máy nào đã cài đặt Python.


6

Bạn nên sử dụng raw_inputvì bạn đang sử dụng python-2.7. Khi bạn sử dụng input()trên một biến (ví dụ s = input('Name: '):), nó sẽ thực thi lệnh BẬT môi trường Python mà không lưu những gì bạn đã viết trên biến ( s) và tạo ra lỗi nếu những gì bạn viết không được xác định.

raw_input()sẽ lưu chính xác những gì bạn đã viết trên biến (ví dụ f = raw_input('Name : '):) và nó sẽ không thực thi nó trong môi trường Python mà không tạo ra bất kỳ lỗi nào có thể xảy ra:

input_variable = raw_input('Enter Your Name : ')
print("Your Name Is  : " + (input_variable))

5

Dành cho trăn 3 trở lên

s = raw_input()

nó sẽ giải quyết vấn đề trên IDE pycharm nếu bạn đang giải quyết trên trang web trực tuyến chính xác là hackerrank thì hãy sử dụng:

s = input()

4

Bạn có thể làm:

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

hoặc là:

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

1
raw_input đã khắc phục sự cố cho tôi
Spencer Goff

Nhưng raw_input () không khả dụng trong Python 3.
carthurs

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

Bạn phải nhập đầu vào trong dấu ngoặc đơn hoặc dấu ngoặc kép

Ex:'dude' -> correct

    dude -> not correct

4

Tôi cũng gặp phải vấn đề này với một mô-đun được cho là tương thích với python 2.7 và 3.7

những gì tôi tìm thấy để khắc phục vấn đề đang nhập:

from six.moves import input

điều này đã cố định khả năng sử dụng cho cả hai phiên dịch viên

bạn có thể đọc thêm về sáu thư viện ở đây


3

Chúng tôi đang sử dụng những thứ sau đây hoạt động cả python 2 và python 3

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

2

Đối với bất kỳ ai khác có thể gặp phải vấn đề này, hóa ra ngay cả khi bạn đưa #!/usr/bin/env python3vào phần đầu của tập lệnh, shebang sẽ bị bỏ qua nếu tệp không thể thực thi được.

Để xác định xem tập tin của bạn có thực thi được hay không:

  • chạy ./filename.pytừ dòng lệnh
  • nếu bạn nhận được -bash: ./filename.py: Permission denied, chạychmod a+x filename.py
  • chạy ./filename.pylại

Nếu bạn đã bao gồm import sys; print(sys.version)như Kevin đề xuất, bây giờ bạn sẽ thấy rằng tập lệnh đang được python3 diễn giải


2

Đóng góp tốt những người trước.

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: "))
Nhập tên của bạn: Joe
('Xin chào', 'Joe', <loại 'str'>)
Chào Joe, tạm biệt 

Tên bạn là
Joe

Cảm ơn!


1

Có hai cách để khắc phục những vấn đề này,

  • Thứ nhất là đơn giản mà không cần thay đổi mã được
    chạy tập lệnh của bạn bởi Python3,
    nếu bạn vẫn muốn chạy trên python2 thì sau khi chạy tập lệnh python của bạn, khi bạn nhập dữ liệu đầu vào, hãy nhớ

    1. nếu bạn muốn nhập stringthì chỉ cần bắt đầu nhập xuống với "input đi kèm với trích dẫn kép" và nó sẽ hoạt động trong python2.7 và
    2. nếu bạn muốn nhập ký tự thì hãy sử dụng đầu vào với một trích dẫn như 'đầu vào của bạn ở đây'
    3. Nếu bạn muốn nhập số không phải là vấn đề, bạn chỉ cần nhập số
  • Cách thứ 2 là thay đổi mã,
    sử dụng thao tác nhập và chạy bên dưới với bất kỳ phiên bản python nào

    1. from six.moves import input
    2. Sử dụng raw_input()chức năng thay vì input()chức năng trong mã của bạn với bất kỳ nhập khẩu
    3. vệ sinh mã của bạn với str()chức năng như str(input())và sau đó gán cho bất kỳ biến nào

Như lỗi ngụ ý :
tên 'dude' không được xác định, nghĩa là python 'dude' trở thành biến ở đây và nó không có bất kỳ giá trị nào của loại python được xác định
nên chỉ có tiếng kêu như em bé nên nếu chúng ta xác định biến 'dude' và gán bất kỳ giá trị nào và vượt qua nó, nó sẽ hoạt động nhưng đó không phải là những gì chúng ta muốn vì chúng ta không biết người dùng sẽ nhập gì và hơn nữa chúng ta muốn nắm bắt đầu vào của người dùng.

Thực tế về các phương thức này:
input() function: Hàm này lấy giá trị và loại đầu vào bạn nhập như hiện tại mà không sửa đổi loại.
raw_input() Hàm: Hàm này chuyển đổi rõ ràng đầu vào bạn cung cấp thành chuỗi kiểu,

Lưu ý:
Lỗ hổng trong phương thức input () nằm ở chỗ biến số truy cập giá trị của đầu vào có thể được truy cập bởi bất kỳ ai chỉ bằng cách sử dụng tên của biến hoặc phương thức.


0

Bạn có thể thay đổi python nào bạn đang sử dụng với IDE của mình, nếu bạn đã tải xuống python 3.x thì không quá khó để chuyển đổi. Nhưng kịch bản của bạn hoạt động tốt trên python 3.x, tôi sẽ thay đổi

print ("your name is" + input_variable)

đến

print ("your name is", input_variable)

Bởi vì với dấu phẩy, nó in ra một khoảng trắng ở giữa your name isvà bất cứ thứ gì người dùng nhập vào. VÀ: nếu bạn đang sử dụng 2.7, chỉ sử dụng raw_inputthay vì nhập liệu.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.