input () hatası - NameError: name '…' tanımlanmamış


220

Bu basit komut dosyasını çalıştırmaya çalıştığımda bir hata alıyorum:

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

Diyelim ki "ahbap" yazıyorum, alıyorum hata:

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

Bu betikleri Python 2.7 ile çalıştırıyorum.


12
Python 3.3 olduğundan emin misiniz? inputBu şekilde davranmayı beklerdim , ama sadece 2.7'de. python --versionBir komut isteminden çalıştırdığınızda ne diyor ? Alternatif olarak, import sys; print(sys.version)senaryonuzun başına yazarsanız ne olur ?
Kevin

1
Python 3
kullanmıyorsunuz.

1
Hangi sürümü kullandığınızı belirlemek için ilk satır import sysve ikinci satır olarak koyun print(sys.version_info).
Hyperboreus

1
Kevin'in söylediklerini yaptım ve 2.7.5 sürümü! Nasıl olsa emin değilim. Sürüm 3.3'ü indirip yükledim, uygulamalar klasörümde "Python 3.3" adlı bir klasör var, bu klasörün içinde "Python Launcher" adlı bir uygulama var ve komut dosyalarımı Python Launcher uygulamasına sürükleyip bırakarak çalıştırıyorum . 3.3 başlatıcısı uygulamasını kullanırken neden hala 2.7 kullanıyorum?
chillpenguin

2
@chillpenguin: Python Launcher için Tercihler iletişim kutusuna bakın. Görünüşe göre, yüklü olduğu sürümü çalıştırmak varsayılan değil, yani ... aptal. (Ben hiç kullanmadım; Terminali kullanmak daha iyi ...)
Wooble

Yanıtlar:


265

TL; DR

inputPython 2.7'deki işlev, girdiğiniz her şeyi bir Python ifadesi olarak değerlendirir. Dizeleri okumak istiyorsanız raw_input, Python 2.7'de okuma dizelerini değerlendirmeyecek bir işlev kullanın .

Python 3.x kullanıyorsanız raw_input, olarak yeniden adlandırıldı input. Python 3.0 sürüm notlarından alıntı yapmak ,

raw_input()olarak yeniden adlandırıldı input(). Yani, yeni input()işlev bir satır okur sys.stdinve satır sonundaki yeni satır çıkarılır. EOFErrorGiriş zamanından önce sonlandırılırsa yükselir . Eski davranışını elde etmek input()içineval(input())


Python 2.7'de , kullanıcı girişlerini kabul etmek için kullanılabilecek iki işlev vardır. Biri inputdiğeri raw_input. Aralarındaki ilişkiyi aşağıdaki gibi düşünebilirsiniz

input = eval(raw_input)

Bunu daha iyi anlamak için aşağıdaki kod parçasını düşünün

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

inputkullanıcıdan bir dize kabul eder ve dizeyi geçerli Python bağlamında değerlendirir. Ben dudegirdi olarak yazdığımda dude, değere bağlı olduğunu thefourtheyeve böylece değerlendirmenin sonucu olur thefourtheyeve atanır bulur input_variable.

Geçerli python bağlamında olmayan başka bir şey girersem, başarısız olur 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'lerle ilgili güvenlik hususları input:

Hangi kullanıcı türü değerlendirilirse değerlendirilsin, güvenlik sorunları da getirir. Örneğin, osprogramınıza modülü önceden yüklediyseniz import osve kullanıcı

os.remove("/etc/hosts")

bu, python tarafından bir işlev çağrısı ifadesi olarak değerlendirilecek ve yürütülecektir. Yükseltilmiş ayrıcalıklarla Python yürütüyorsanız, /etc/hostsdosya silinecektir. Bakın, ne kadar tehlikeli olabilir?

Bunu göstermek için, inputfonksiyonu tekrar çalıştırmayı deneyelim .

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

Şimdi, input("Enter your name: ")yürütüldüğünde, kullanıcı girişini bekler ve kullanıcı girişi geçerli bir Python işlevi çağırmadır ve böylece çağrılır. Bu yüzden Enter your name again:tekrar istem görüyoruz .

Yani, raw_inputfonksiyonla daha iyi durumdasınız , böyle

input_variable = raw_input("Enter your name: ")

Sonucu başka bir türe dönüştürmeniz gerekiyorsa, döndürülen dizeyi dönüştürmek için uygun işlevleri kullanabilirsiniz raw_input. Örneğin, girdileri tamsayı olarak okumak için int, bu cevapta gösterildiği gibi işlevi kullanın .

Python 3.x'te , kullanıcı girişlerini almak için yalnızca bir işlev vardır ve buna inputPython 2.7'lere eşdeğer denir raw_input.


56

Python 3 değil Python 2 çalıştırıyorsunuz. Bunun için Python 2'de çalışmak için kullanın raw_input.

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

17

Python 3.x için yazdığınızdan, komut dosyanıza aşağıdakilerle başlamak istersiniz:

#!/usr/bin/env python3

Eğer kullanırsan:

#!/usr/bin/env python

Varsayılan olarak Python 2.x olacaktır. # İle başlayan bir şey yoksa, bunlar betiğinizin ilk satırına gider . (namı olarak da bilinir).

Komut dosyalarınız şununla başlıyorsa:

#! python

Ardından şu şekilde değiştirebilirsiniz:

#! python3

Bu daha kısa biçimlendirme yalnızca başlatıcı gibi birkaç program tarafından tanınmasına rağmen, en iyi seçim değildir.

İlk iki örnek çok daha yaygın olarak kullanılmaktadır ve kodunuzun Python yüklü herhangi bir makinede çalışmasını sağlayacaktır.


6

Kullanmalısınız raw_inputçünkü python-2.7 kullanıyorsunuz. Bir input()değişken (örneğin s = input('Name: '):) üzerinde kullandığınızda, değişken ( s) üzerine yazdıklarınızı kaydetmeden Python ortamında AÇIK komutunu yürütür ve yazdıklarınız tanımlanmamışsa bir hata oluşturur.

raw_input()değişkene yazdıklarınızı doğru bir şekilde kaydeder (örneğin f = raw_input('Name : '):) ve olası bir hata oluşturmadan Python ortamında yürütmez:

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

5

Python 3 ve üstü için

s = raw_input()

Çevrimiçi sitede tam olarak hackerrank çözdüyseniz, pycharm IDE'deki sorunu çözecektir:

s = input()

4

Bunlardan birini yapabilirsiniz:

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

veya:

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

1
raw_input benim için sorunu düzeltti
Spencer Goff

Ancak raw_input (), Python 3'te mevcut değildir.
carthurs

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

Girdiyi tek veya çift tırnak içine girmelisiniz

Ex:'dude' -> correct

    dude -> not correct

4

Python 2.7 ve 3.7 ile uyumlu olması gereken bir modülle de bu sorunla karşılaştım.

sorunu düzeltmek için buldum ithal oldu:

from six.moves import input

bu her iki tercüman için de kullanılabilirliği düzeltti

altı kütüphane hakkında daha fazla bilgiyi buradan edinebilirsiniz


3

Hem python 2 hem de python 3 ile çalışan aşağıdakileri kullanıyoruz

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

2

Bu sorunla karşılaşabilecek herkes #!/usr/bin/env python3için, komut dosyanızın başına ekleseniz bile, dosya çalıştırılabilir değilse shebang'ın yok sayıldığı ortaya çıkar.

Dosyanızın yürütülebilir olup olmadığını belirlemek için:

  • ./filename.pykomut satırından çalıştır
  • alırsan -bash: ./filename.py: Permission deniedkoşchmod a+x filename.py
  • ./filename.pytekrar koş

Eğer girdiyseniz import sys; print(sys.version)Kevin önerildiği gibi, artık komut python3 tarafından yorumlanır edildiğini göreceksiniz


2

Öncekilere iyi katkılar.

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: "))
İsminizi girin: Joe
('Merhaba', 'Joe', <str 'yazın>>)
Merhaba Joe, hoşçakal 

İsminiz: Joe
Joe

Teşekkürler!


1

Bu sorunları çözmenin iki yolu vardır,

  • 1. hala
    kodunuzu Python3 tarafından çalıştırılan kod değişikliği olmadan basittir ,
    eğer hala python2 üzerinde çalıştırmak istiyorsanız, sonra python komut dosyanızı çalıştırdıktan sonra, giriş girerken unutmayın

    1. girmek istiyorsanız string"input çift tırnak işareti " yazarak yazmaya başlayın ve python2.7 ve
    2. karakter girmek istiyorsanız, girdiyi 'girdiniz buraya gelir' gibi tek bir alıntı ile kullanın
    3. sayı girmek istemiyorsanız sorun değil
  • 2. yol kod değişiklikleri
    ile aşağıdaki alma kullanın ve python herhangi bir sürümü ile çalıştırın

    1. from six.moves import input
    2. Kullanım raw_input()yerine işlevini input()herhangi ithalat ile Kodunuzdaki fonksiyonu
    3. kodunuzu aşağıdaki str()gibi bir işlevle sterilize edin str(input())ve ardından herhangi bir değişkene atayın

Hatadan da anlaşılacağı gibi :
'dude' adı tanımlanmamıştır, yani python 'dude' için burada değişken olur ve herhangi bir python tanımlı tür değerine sahip değildir,
bu yüzden sadece bebek gibi ağlıyor, böylece bir 'dude' değişkeni tanımlar ve herhangi bir değer atarsak ve ona geçmek, işe yarayacak, ancak kullanıcının ne gireceğini bilmediğimizden ve bunun yanı sıra kullanıcı girdisini yakalamak istediğimizden de öyle değil.

Bu yöntem hakkında gerçek:
input() fonksiyon: Bu fonksiyon girdiğiniz girişin değerini ve türünü değiştirmeden değiştirir.
raw_input() işlevi: Bu işlev, verdiğiniz girdiyi açıkça dizgiye dönüştürür,

Not:
input () yöntemindeki güvenlik açığı, giriş değerine erişen değişkenin yalnızca değişken veya yöntem adı kullanılarak herkes tarafından erişilebilir olmasından kaynaklanır.


0

IDE'nizle hangi python'u kullandığınızı değiştirebilirsiniz, python 3.x'i zaten indirdiyseniz, geçiş yapmak çok zor olmamalıdır. Ama betiğin python 3.x üzerinde iyi çalışıyor, sadece değiştirirdim

print ("your name is" + input_variable)

için

print ("your name is", input_variable)

Çünkü virgülle, arada your name isve kullanıcının girdiği herhangi bir boşlukta yazdırır . VE: 2.7 kullanıyorsanız raw_inputgiriş yerine sadece kullanın .

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.