kesalahan input () - NameError: name '...' tidak ditentukan

220

Saya mendapatkan kesalahan saat mencoba menjalankan skrip sederhana ini:

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

Katakanlah saya mengetik "Bung", kesalahan yang saya dapatkan adalah:

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

Saya menjalankan skrip ini dengan Python 2.7.

chillpenguin
sumber
12
Apakah Anda yakin itu Python 3.3? Saya berharap inputuntuk berperilaku seperti ini, tetapi hanya di 2.7. Apa isinya saat Anda menjalankan python --versiondari command prompt? Atau, bagaimana jika Anda menulis import sys; print(sys.version)di awal skrip Anda?
Kevin
1
Anda tidak menjalankan Python 3. Anda menjalankan Python 2, entah bagaimana (saya tidak terbiasa dengan aplikasi "Python Launcher" ini)
Wooble
1
Letakkan sebagai baris pertama import sysdan sebagai baris kedua print(sys.version_info)untuk memastikan versi yang Anda gunakan.
Hyperboreus
1
Saya melakukan apa yang dikatakan Kevin dan itu adalah versi 2.7.5! Saya tidak yakin bagaimana. Saya mengunduh dan menginstal versi 3.3, dalam folder aplikasi saya ada folder yang disebut "Python 3.3" di dalam folder itu ada aplikasi yang disebut "Python Launcher" dan saya menjalankan skrip saya dengan menyeret dan menjatuhkannya ke aplikasi Python Launcher . Kenapa saya masih menggunakan 2.7 ketika saya menggunakan aplikasi launcher 3.3?
chillpenguin
2
@chillpenguin: lihat dialog Preferensi untuk Peluncur Python. Rupanya itu tidak default untuk menjalankan versi yang diinstal dengan, yang ... bodoh. (Saya tidak pernah menggunakannya sendiri; Saya menemukan menggunakan Terminal lebih baik ...)
Wooble

Jawaban:

265

TL; DR

inputberfungsi dalam Python 2.7, mengevaluasi apa pun yang Anda masukkan, sebagai ekspresi Python. Jika Anda hanya ingin membaca string, gunakan raw_inputfungsi dalam Python 2.7, yang tidak akan mengevaluasi string baca.

Jika Anda menggunakan Python 3.x, raw_inputtelah diubah namanya menjadi input. Mengutip catatan rilis Python 3.0 ,

raw_input()diubah namanya menjadi input(). Yaitu, input()fungsi baru membaca garis dari sys.stdindan mengembalikannya dengan garis baru tertinggal dilucuti. Ini memunculkan EOFErrorjika input dihentikan sebelum waktunya. Untuk mendapatkan perilaku lama input(), gunakaneval(input())


Dalam Python 2.7 , ada dua fungsi yang dapat digunakan untuk menerima input pengguna. Yang satu inputdan yang lainnya raw_input. Anda bisa memikirkan hubungan di antara mereka sebagai berikut

input = eval(raw_input)

Pertimbangkan potongan kode berikut untuk memahami ini dengan lebih baik

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

inputmenerima string dari pengguna dan mengevaluasi string dalam konteks Python saat ini. Ketika saya mengetik dudesebagai input, ia menemukan bahwa dudeterikat dengan nilai thefourtheyedan hasil evaluasi menjadi thefourtheyedan yang ditugaskan input_variable.

Jika saya memasukkan sesuatu yang tidak ada dalam konteks python saat ini, itu akan gagal 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

Pertimbangan keamanan dengan Python 2.7 input:

Karena tipe pengguna apa pun yang dievaluasi, itu menimbulkan masalah keamanan juga. Misalnya, jika Anda telah memuat osmodul dalam program Anda import os, dan kemudian pengguna mengetik

os.remove("/etc/hosts")

ini akan dievaluasi sebagai ekspresi pemanggilan fungsi oleh python dan itu akan dieksekusi. Jika Anda menjalankan Python dengan hak istimewa yang ditingkatkan, /etc/hostsfile akan dihapus. Lihat, betapa berbahayanya itu?

Untuk mendemonstrasikan ini, mari kita coba menjalankan inputfungsi lagi.

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

Sekarang, ketika input("Enter your name: ")dieksekusi, ia menunggu input pengguna dan input pengguna adalah pemanggilan fungsi Python yang valid dan juga dipanggil. Itu sebabnya kami melihat Enter your name again:prompt lagi.

Jadi, Anda lebih baik dengan raw_inputfungsi, seperti ini

input_variable = raw_input("Enter your name: ")

Jika Anda perlu mengonversi hasilnya ke jenis lain, maka Anda dapat menggunakan fungsi yang sesuai untuk mengonversi string yang dikembalikan oleh raw_input. Misalnya, untuk membaca input sebagai bilangan bulat, gunakan intfungsi, seperti yang ditunjukkan dalam jawaban ini .

Dalam python 3.x , hanya ada satu fungsi untuk mendapatkan input pengguna dan itu disebut input, yang setara dengan Python 2.7 raw_input.

thethourtheye
sumber
56

Anda menjalankan Python 2, bukan Python 3. Agar ini berfungsi di Python 2, gunakan raw_input.

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

Karena Anda menulis untuk Python 3.x, Anda akan ingin memulai skrip Anda dengan:

#!/usr/bin/env python3

Jika Anda menggunakan:

#!/usr/bin/env python

Ini akan default ke Python 2.x. Ini ada di baris pertama skrip Anda, jika tidak ada yang dimulai dengan #! (alias shebang).

Jika skrip Anda baru mulai dengan:

#! python

Kemudian Anda dapat mengubahnya ke:

#! python3

Meskipun pemformatan yang lebih pendek ini hanya dikenali oleh beberapa program, seperti peluncur, jadi ini bukan pilihan terbaik.

Dua contoh pertama jauh lebih banyak digunakan dan akan membantu memastikan kode Anda akan berfungsi pada mesin apa pun yang memasang Python.

Zim
sumber
6

Anda harus menggunakan raw_inputkarena Anda menggunakan python-2.7. Saat Anda menggunakan input()variabel (misalnya s = input('Name: '):), itu akan menjalankan perintah ON lingkungan Python tanpa menyimpan apa yang Anda tulis pada variabel ( s) dan membuat kesalahan jika apa yang Anda tulis tidak didefinisikan.

raw_input()akan menyimpan dengan benar apa yang Anda tulis pada variabel (misalnya f = raw_input('Name : '):), dan itu tidak akan menjalankannya di lingkungan Python tanpa membuat kesalahan yang mungkin:

input_variable = raw_input('Enter Your Name : ')
print("Your Name Is  : " + (input_variable))
Skiller Dz
sumber
5

Untuk python 3 ke atas

s = raw_input()

itu akan menyelesaikan masalah pada pycharm IDE jika Anda memecahkan di situs online persis hackerrank kemudian gunakan:

s = input()
RAHUL KUMAR
sumber
4

Anda bisa melakukan:

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

atau:

x = str(input("enter your name"))
print "your name is %s" % x
Abdullah Baraka
sumber
1
raw_input memperbaiki masalah ini untuk saya
Spencer Goff
Tetapi raw_input () tidak tersedia dalam Python 3.
carthurs
4
input_variable = input ("Enter your name: ")
print ("your name is" + input_variable)

Anda harus memasukkan input dalam tanda kutip tunggal atau ganda

Ex:'dude' -> correct

    dude -> not correct
Parminder Singh
sumber
4

Saya juga mengalami masalah ini dengan modul yang seharusnya kompatibel untuk python 2.7 dan 3.7

apa yang saya temukan untuk memperbaiki masalah ini adalah mengimpor:

from six.moves import input

ini memperbaiki kegunaan bagi kedua penafsir

Anda dapat membaca lebih lanjut tentang enam perpustakaan di sini

Elad L.
sumber
3

Kami menggunakan yang berikut ini yang berfungsi baik python 2 dan python 3

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

Bagi siapa pun yang mungkin mengalami masalah ini, ternyata itu bahkan jika Anda menyertakannya #!/usr/bin/env python3 di awal skrip Anda, shebang diabaikan jika file tidak dapat dieksekusi.

Untuk menentukan apakah file Anda dapat dieksekusi:

  • lari ./filename.pydari baris perintah
  • jika Anda bisa -bash: ./filename.py: Permission denied, jalankanchmod a+x filename.py
  • jalankan ./filename.pylagi

Jika Anda memasukkan import sys; print(sys.version)seperti yang disarankan Kevin, sekarang Anda akan melihat bahwa skrip sedang ditafsirkan oleh python3

otomatis
sumber
2

Kontribusi baik yang sebelumnya.

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: "))
Masukkan nama Anda: Joe
('Hai', 'Joe', <type 'str'>)
Hai Joe, selamat tinggal 

Nama Anda: Joe
Joe

Terima kasih!

Joe Llerena
sumber
1

Ada dua cara untuk memperbaiki masalah ini,

  • Pertama adalah sederhana tanpa perubahan kode yang
    menjalankan skrip Anda oleh Python3,
    jika Anda masih ingin menjalankan python2 maka setelah menjalankan skrip python Anda, ketika Anda memasukkan input perlu diingat

    1. jika Anda ingin masuk stringmaka mulailah mengetik dengan "input sesuai dengan tanda kutip ganda" dan itu akan bekerja di python2.7 dan
    2. jika Anda ingin memasukkan karakter maka gunakan input dengan kutipan tunggal seperti 'input Anda masuk ke sini'
    3. jika Anda ingin memasukkan nomor bukan masalah, Anda cukup mengetik nomornya
  • Cara kedua adalah dengan perubahan kode,
    gunakan impor di bawah ini dan jalankan dengan versi python apa pun

    1. from six.moves import input
    2. Gunakan raw_input()fungsi alih-alih input()fungsi dalam kode Anda dengan impor apa pun
    3. membersihkan kode Anda dengan str()fungsi seperti str(input())dan kemudian menetapkan ke variabel apa pun

Seperti yang disiratkan kesalahan :
nama 'dude' tidak didefinisikan yaitu untuk python 'dude' menjadi variabel di sini dan itu tidak memiliki nilai apa pun dari jenis yang didefinisikan python ditugaskan
jadi hanya menangis seperti bayi jadi jika kita mendefinisikan variabel 'dude' dan menetapkan nilai apa pun dan lolos, itu akan berhasil tetapi bukan itu yang kita inginkan karena kita tidak tahu apa yang akan dimasukkan pengguna dan terlebih lagi kita ingin menangkap input pengguna.

Fakta tentang metode ini:
input() function : Fungsi ini mengambil nilai dan tipe input yang Anda masukkan apa adanya tanpa mengubah jenisnya.
raw_input() fungsi: Fungsi ini secara eksplisit mengubah input yang Anda berikan menjadi tipe string,

Catatan:
Metode kerentanan dalam input () terletak pada fakta bahwa variabel yang mengakses nilai input dapat diakses oleh siapa saja hanya dengan menggunakan nama variabel atau metode.

Naval Kishor Jha
sumber
0

Anda dapat mengubah python mana yang Anda gunakan dengan IDE, jika Anda sudah mengunduh python 3.x itu tidak akan terlalu sulit untuk beralih. Tapi skrip Anda berfungsi dengan baik di python 3.x, saya hanya akan berubah

print ("your name is" + input_variable)

untuk

print ("your name is", input_variable)

Karena dengan koma ia mencetak dengan spasi putih di antara your name isdan apa pun yang dimasukkan pengguna. DAN: jika Anda menggunakan 2.7, gunakan saja raw_inputalih-alih input.

Cleve Green
sumber