Print fonksiyonunun "file" parametresinde sorun var

Herkese merhaba,
Fırat Özdil’in python 3 kitabında print fonksiyonunun file parametresi için verilen

print("Tahir olmak da ayıp değil", "Zühre olmak da", file=sys.stdout)

kodunu çalıştırınca hata alıyorum (sayfa 63). Anladığım kadarıyla sys tanımlı değil diyor. Kullandığım sitem ubuntu 16.04 ve anaconda python 3.6 paketlerini kullanıyorum.

Traceback (most recent call last):
File “/home/orion/Dropbox/PROGRAMLAMA/Python_Projects/Python-3_F_Ozdil_Notlar/FirstSteps.py”, line 1, in
print(“Tahir olmak da ayıp değil”, “Zühre olmak da”, file=sys.stdout)
NameError: name ‘sys’ is not defined

Hem kabuktan denedim hem de Pycharm IDE ile denedim. ancak kodun başına

import sys
print("Tahir olmak da ayıp değil", "Zühre olmak da", file=sys.stdout)

yazarsam çalışıyor.

Sorum şu:
Bu farklılık python sürümünden mi kaynaklanıyor? Ya da kitabın bu bölümüne “import sys” komutu eklenmesi mi gerekiyor?

Merhaba, bahsettiğiniz 63. sayfada yazan şu:

O sayfada anlatılmak istenen yazdığınız kodun Python tarafından nasıl algılandığı, yoksa elbette import sys yapmadan sys.stdout yazarsanız hata alırsınız.

Kitabın o bölümüne import sys yazmak gerekmiyor çünkü yazar sys modülüyle bir işlem yapmamış orada, sadece file kısmına neler yazılabileceğini ve herhangi bir şey yazılmadığı taktirde de Python’ın file parametresini nasıl algıladığını anlatmış.

1 Beğeni

Öncelikle cevabınız için çok teşekkür ederim. Bu kitabın anlatımını çok beğendim. Çalışmaya devam ederken print fonksiyonunun flush parametresiyle ilgili şöyle bir sorunla karşılaştım.

Pycharm IDE kullanarak,

flush parametresine flush=False verdiğimde de dosyayı kapatmadığım halde yani örneğin dosya.close() yazmasam da dosyaya yazıyor.

Daha açık olarak örneğin Pycharm ile (interpreter ayarlarında “anaconda3 python 3.6.1” var. Ayrıca sistemin varsayılanı python 3.5.2 yi de denedim)

dosya = open("deneme.txt", "w")
print("Merhaba Dünya yazdım", file=dosya, flush=False)

kodunu çalıştırınca, kapatmamı beklemesi gerekirken dosyaya yazıyor.

Tabi kitabın anlatımı etkileşimli kabuk üzerinden yapılmış. Ben de terminalden python etkileşimli kabuğunu açarak bu kodları yazdığımda kitapta anlatıldığı gibi dosya.close() olarak kapatmamı bekliyor. Ya da flush=True dediğimde kapatmadan direkt yazıyor. Yani sorun yok.

İnternette araştırma yaptım, birçok python 3 üzerine yazılmış kitabı da inceledim. Print fonksiyonunun parametresi olan flush parametresinden bahseden pek yok. Yani Pycharm IDE kullanınca neden böyle oluyor anlayamadım.

Tekrar merhaba, bu konuyu yazdığınız kodlar üzerinden anlatmaya çalışayım:

import time
dosya = open("deneme.txt", "w")
print("Merhaba Dünya yazdım", file=dosya, flush=False)
time.sleep(5)

Yukarıdaki kodu çalıştırdığınız zaman, yazdığınız yazı dosyaya 5 saniye sonra yazılacaktır. Halbuki flush=True yapılırsa, hemen yazdırır.

Sizin yazdığınız kodların altında çalışan başka kodlar olmadığı için program hemen sonlanıyor ve siz yazının dosyaya yazdırılmış olduğunu görüyorsunuz. Ancak kodlarınızın altında daha başka işlemler tanımlanmış olsaydı ve bu işlemlerin gerçekleşmesi biraz zaman alsaydı, bütün işlemler gerçekleştikten sonra dosyaya yazı yazılırdı. flush=True yazsaydık o zaman alttaki kodlara geçmeden yazdırma işlemi o satırda gerçekleşirdi.

1 Beğeni

Öncelikle verdiğiniz jet hızında cevabınız için çok teşekkür ederim.
Yazdığınız

import time
dosya = open("deneme.txt", "w")
print("Merhaba Dünya yazdım", file=dosya, flush=False)
time.sleep(5),

Pycharm da dediğiniz gibi 5 saniye sonra yazdı. Ancak aynı kodu etkileşimli kabuğa yazınca olmadı. Yani dosya.close()
komutunu vermeden yazmıyor. IDE ile etkileşimli kabuk arasında neden böyle farklar oluyor. Bu biraz can sıkıcı. Ayrıca başlangıç düzeyinde yazılmış Amazonda satılan hit yabancı python 3 kitaplarında neden print fonksiyonun flush parametresinden bahsedilmiyor. Bu da garibime gitti.

Etkileşimli kabukta bir satır yazdıktan sonra enter tuşuna basıp diğer satıra geçiyorsunuz. enter tuşuna bastığınız zaman kod hemen çalıştırılmaya başlıyor.

Diyelim cmd’ye şöyle bir şey yazdınız.

dosya = open("deneme.txt", "w")
print("Hello", file=dosya, flush=False)

şayet exit() veya dosya.close() yazmazsanız, yazdığınız yazılar tamponda bekletilir.

PyCharm’da ise bir betik dosyası çalıştırıyorsunuz ve dosya son kod satırını görene kadar çalışır, şayet siz programın devam etmesini sağlayacak bir kod yazmadıysanız son satırı da okur ve program sonlanır. Programın sonlandığı zamanda da tamponda bekletilen yazı dosyaya yazdırılır.

Kabuk üzerine kodlarınızı yazdığınızda ise, kabuk sizden birşeyler yazmanızı bekler, enter tuşuna basınca yazdığınız kodlara hemen tepki verir. Ve sizden yeni kodlar girmenizi bekler, PyCharm gibi sonlanmaz. Yukarıdaki kodu çalıştırırsınız; ancak yazının dosyaya yazılabilmesi için ya dosyayı ya da kabuğu kapatmanız gerekir.

1 Beğeni

Bir sorunla karşılaştığımda hazırcılık olmasın diye iyice araştırmadan soru sormuyorum.

Vakit ayırıp cevapladığınız için çok teşekkür ederim emeğinize sağlık.

Rica ederim, tabi ki sorular soracaksınız. Umarım cevapların size faydası dokunmuştur. İyi günler dilerim.

1 Beğeni

Mesela “deneme.txt” isminde bir tane metin belgesi oluşturalım. Metin belgesinin içine aşağıdaki kodları yazalım:

import time
dosya = open("test.txt", "w")
print("Merhaba Dünya yazdım", file=dosya, flush=False)
time.sleep(10)

Sonra dosyayı kaydedip. dosyanın bulunduğu dizinde cmd’yi açalım. Kabuğa python deneme.txt yazalım. Kabuk; bu sefer PyCharmda olduğu gibi programı çalıştırır ve sonlandırır. Bu 10 saniye içinde test.txt dosyasına yazı yazılmaz.

1 Beğeni

Bu çok iyi oldu. Kabuktan bu şekilde dosyayı çalıştırabilmeyi bilmiyordum. Python da çok yeniyim ama gerçekten çok sevdim. Hele sizin gibi Yardımsever arkadaşlar olması çok güzel. Zaten ilerledikçe başka sorularım da olacak. İleride ben de sizin gibi diğer arkadaşlara yardımcı olmak istiyorum. Tekrar çok teşekkür ederim.

Rica ederim, kolay gelsin, iyi akşamlar dilerim.