Bu basit python betiğini çalıştırmaya çalıştığımda bir hata alıyorum:
input_variable = input ("Enter your name: ")
print ("your name is" + input_variable)
Diyelim ki "dude" yazıyorum, aldığım hata şu:
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 çalıştırıyorum ve betiği çalıştırmak için python 3.3 yüklemesiyle birlikte gelen Python Launcher uygulamasını kullanıyorum.
Düzenleme: Bu betikleri bir şekilde 2.7 ile çalıştırdığımı fark ettim. Sanırım asıl soru, betiklerimi 3.3 sürümü ile nasıl çalıştıracağım? Komut dosyalarımı uygulamalar klasörümdeki Python 3.3 klasörünün içinde bulunan Python Launcher uygulamasının üzerine sürükleyip bırakırsam, komut dosyalarımı 3.3 kullanarak başlatacağını düşündüm. Sanırım bu yöntem betikleri hala 2.7 ile başlatıyor. Peki 3.3'ü nasıl kullanabilirim?
TL;DR
Python 2.7'deki input
fonksiyonu, girdiğiniz her şeyi bir Python ifadesi olarak değerlendirir. Eğer sadece karakter dizilerini okumak istiyorsanız, Python 2.7'deki raw_input
fonksiyonunu kullanın, bu fonksiyon okunan karakter dizilerini değerlendirmez.
Eğer Python 3.x kullanıyorsanız, raw_input
ismi input
olarak değiştirilmiştir. Python 3.0 sürüm notlarından alıntı](https://docs.python.org/3.0/whatsnew/3.0.html#builtins),
raw_input()
işlevinin adıinput()
olarak değiştirildi. Yani, yeniinput()
fonksiyonusys.stdin
den bir satır okur ve sondaki yeni satır çıkarılmış olarak döndürür. Girdi zamanından önce sonlandırılırsaEOFError
yükseltir. input()fonksiyonunun eski davranışını elde etmek için
eval(input())` kullanın
Python 2.7'de, kullanıcı girdilerini kabul etmek için kullanılabilecek iki fonksiyon vardır. Biri input
ve diğeri raw_input
. Bunlar arası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 string kabul eder ve bu stringi geçerli Python bağlamında değerlendirir. Girdi olarak
dudeyazdığımda,
dudedeğerinin
thefourtheyedeğerine bağlı olduğunu bulur ve böylece değerlendirme sonucu
thefourtheyeolur ve bu
input_variable` değerine atanır.
Mevcut python bağlamında olmayan başka bir şey girersem, NameError
başarısız olacaktır.
>>> 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'nin input
özelliği ile ilgili güvenlik hususları:
Kullanıcı ne yazarsa yazsın değerlendirildiğinden, güvenlik sorunlarını da beraberinde getirir. Örneğin, programınıza import os
ile os
modülünü yüklediyseniz ve kullanıcı
os.remove("/etc/hosts")
bu python tarafından bir fonksiyon çağrısı ifadesi olarak değerlendirilecek ve çalıştırılacaktır. Eğer Python'u yüksek yetkilerle çalıştırıyorsanız, /etc/hosts
dosyası silinecektir. Gördünüz mü, ne kadar tehlikeli olabilir?
Bunu göstermek için `input' fonksiyonunu 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("Adınızı girin: ")
çalıştırıldığında, kullanıcı girdisini bekler ve kullanıcı girdisi geçerli bir Python işlevi çağrısıdır ve bu nedenle bu da çağrılır. Bu yüzden Adınızı tekrar girin:
komutunu tekrar görüyoruz.
Bu nedenle, aşağıdaki gibi raw_input
işlevini kullanmanız daha iyi olur
input_variable = raw_input("Enter your name: ")
Sonucu başka bir türe dönüştürmeniz gerekiyorsa, raw_input
tarafından döndürülen dizeyi dönüştürmek için uygun işlevleri kullanabilirsiniz. Örneğin, girdileri tamsayı olarak okumak için, bu cevap adresinde gösterildiği gibi int
fonksiyonunu kullanın.
Python 3.x'te, kullanıcı girdilerini almak için tek bir fonksiyon vardır ve bu da Python 2.7'deki raw_input
a eşdeğer olan input
olarak adlandırılır.
Python 3 değil, Python 2 çalıştırıyorsunuz. Bunun Python 2'de çalışması için raw_input
kullanın.
input_variable = raw_input ("Enter your name: ")
print ("your name is" + input_variable)
Python 3.x için yazdığınızdan, kodunuza şu şekilde başlamak isteyeceksiniz:
#!/usr/bin/env python3
Eğer kullanıyorsanız:
#!/usr/bin/env python
Bunlar, #! (shebang olarak da bilinir) ile başlayan bir şey yoksa, betiğinizin ilk satırına gider.
Senaryolarınız sadece ile başlarsa:
#! python
O zaman şu şekilde değiştirebilirsiniz:
#! python3
Bu kısa biçimlendirme yalnızca başlatıcı gibi birkaç program tarafından tanınsa da, 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ğlamaya yardımcı olacaktır.