Python'da print fonksiyonunun flush parametresi

import pyautogui, sys

print('Press Ctrl-C to quit.')

try:

    while True:

        x, y = pyautogui.position()

        positionStr = 'X: ' + str(x).rjust(4) + ' Y: ' + str(y).rjust(4)

        print(positionStr, end='')

        print('\b' * len(positionStr), end='', flush=True)

except KeyboardInterrupt:

    print('\n')

Burdaki “flush” ne işe yarıyor ? İnternetten araştırdım fakat kaynaklar ingilizce. Yeni öğrenciyim pek anlaşılır birşey çıkartamadım

Flush parametresi (aynı zamanda metot olarak da kullanılabilir) True-False(boolean) değerlerini alır. Öntanımlı değeri false’tır ve tamponda bekletir veriyi. True değerini verirsek bekletmez. Basit tanımı bu ve aynı zamanda yazbel belgelerinde geçiyor.

Şurada çok güzel bir örnek ile anlatılmış.

Saolun fakat burada herhangi bir dosyaya yazmamış. Verileri sürekli ekrana yazdırıyor niye tampona bekletmiş ki ? O kısmı kaldırınca çıktıda hiçbir değişiklik olmadı.

f = open("deneme.txt", "w")#dosyamızı write kipinde actık
print("deneme yazısı", file=f, flush=False)#print'in cıktısını değiştirip flush parametresine false verdik(tamponda bekletiyoruz)
#oluşan dosyanın içeriğini kontrol ettiğinde boş olduğunu "deneme yazısı" yazılmadığını görebilirsin
print("şimdi yazsın", file=f, flush=True)
#ve şimdi dosyayı kontrol ettiğimde alt alta sıralı bir şekilde "deneme yazısı" ve "şimdi yaz" satırları gözükmekte
f.close()

eğer bu kodları cmd veya terminalde calıştırırsanız daha iyi fark edebilirsiniz, normalde dosya kapatılana kadar tamponda bekletilir veriler, ama dosya kapanmadan verileri dosyaya eklemek isterseniz flush parametresi (veya aynı zamanda os.write fonksiyonunda metot olarak gecer) kullanılabilirsizin

Emin olun bende dökümantasyonları ıkuyabiliyorum. Aynı yeri bende okudum. Fakat sorumu okumadan cevap veriyorsunuz galiba. Teşekkür ederim yinede ama aradığım cevap kesinlikle bu değil soruyu okursanız anlarsınız

Anlatamadığım için kusura bakmayın. Şöyle açıklayayım, flush parametresi’ni print fonksiyonuyla terminal veya cmd çıktısı için kullanmak gereksiz, genelde dosya objesi için kullanılır.

Ciktinin nereye oldugunu python’in bilmesinin (kolay ve kesin) bir yolu yok. Bu yuzden manasi anlik olan ciktilarin, ozellikle \n ile bitmiyorlarsa, flush kullanmasi iyi bir aliskanlik.

2 Beğeni

Aksine, bekletmeden direkt yazdırıyor.

Sanırım flush’ın tam olarak ne iş yaptığını anladınız. O halde buradaki kodları açıklamaya geçebiliriz. Daha iyi anlayabilmek için örnekler üzerinden ilerleyelim:

Normal şartlarda end parametresinin varsayılan değeri olan \n kaçış dizisi sisteme, belirli tampondaki verileri flush etmesini söylüyor. Ancak burada, bu kodu yazan arkadaş koordinatların alt alta yazılmaması için end değerini boş bir karakter yapmış.Ardından bunu, toparlamak için flush parametresini kullanmış. Peki flush parametresini kaldırdığımız halde, veriler neden bastırılıyor? Çünkü döngü, yeni bir kademeye/adıma geçmeden önce verilerin flush edilmesini engelleyecek hiçbir şey yok. Yani flush parametresi kullanılmasa da tampon boşaltılacak.
Örnek verelim:

import pyautogui, sys, time

print('Press Ctrl-C to quit.')

try:

    while True:

        x, y = pyautogui.position()

        positionStr = 'X: ' + str(x).rjust(4) + ' Y: ' + str(y).rjust(4)

        print(positionStr, end='')

        print('\b' * len(positionStr), end='')
        time.sleep(1)

except KeyboardInterrupt:

    print('\n')

Programı uyutmak, döngü her yeni kademeye/adıma geçtiğinde tampondaki verileri flush etmesini engelleyebilir. Ancak, döngü kırıldığında buna engel olacak hiçbir kod kalmıyor. Dolayısıyla en son değer, bastırılıyor. Bu kodları çalıştırdığınızda ekranda hiçbir şey göremeyeceksiniz. Çünkü döngü tam yeni bir adıma geçecek iken time.sleep(1) buna engel oluyor. Fakat döngü kırıldığında tamponun flush edilmesini engelleyecek hiçbir kod kalmıyor. Dolayısıyla en son değeri görebileceksiniz. Komut satırında deneyin.

Şimdi de program henüz uyutulmadan, tamponu flush edelim:

import pyautogui, sys, time

print('Press Ctrl-C to quit.')

try:

    while True:

        x, y = pyautogui.position()

        positionStr = 'X: ' + str(x).rjust(4) + ' Y: ' + str(y).rjust(4)

        print(positionStr, end='')

        print('\b' * len(positionStr), end='', flush=True)
        time.sleep(3)

except KeyboardInterrupt:

    print('\n')

Bu kez program çalıştırıldığı anda ilk değeri görebildiniz. Çünkü program henüz uyutulmadan tampondaki veriler flush ediliyor. Program daha sonra 3 saniye uyutuluyor.

Son bir örnek daha vermek istiyorum:

import time


print("Merhaba, günaydın.")
time.sleep(3)

Ekrana ‘Merhaba, günaydın.’ yazısı bastırılıp 3 saniye sonra program sonlandırılacak. Bunu engelleyelim; anlayacağınız üzere end parametresinin varsayılan değerini ( \n ) değiştirerek:

import time


print("Merhaba, günaydın.", end='')
time.sleep(3)

Bu kez 3 saniye bekleyip, program sonlandırıldığında ‘Merhaba, günaydın.’ yazısı bastırılacak. 3 saniye beklemesin, tamponu hemen flush etsin. O halde flush=True

import time


print("Merhaba, günaydın.", end='', flush=True)
time.sleep(3)

Ekrana yazı bastırılıp 3 saniye beklenecek, ardından program sonlandırılacak.

Umarım yeterince açıklayıcı anlatabilmişimdir. İyi çalışmalar dilerim.

1 Beğeni

Şu bilgi gayet değerliymiş.

Yeterince açıklayıcıydı teşekkürler.

2 Beğeni

Merhaba. Bu forumdaki ilk mesajım. Konu anlatımında bunu anlamamıştım.
end parametresinin default değeri ‘\n’ mi denmek isteniyor. Zaten end parametresi default olarak her yazının sonuna \n koysa ne olur? Koymasa ne olur?

Normal şartlarda end parametresinin varsayılan değeri olan \n kaçış dizisi sisteme, belirli tampondaki verileri flush etmesini söylüyor
Konu anlatımında bunu anlamamıştım. end parametresi

Bir de > flush parametresi PyCharm programında işe yarıyor mu ? Çok denememe rağmen emin olamadım. flush değerini False de versek aynı True da versek aynı. Her zaman PyCharm prog. play tuşuna basmamızla birlikte dosyanın içinde yazıları görebiliyoruz. .close() fonksiyonuna gerek kalmadan.

f = open(“deneme.txt”, “w”)#dosyamızı write kipinde actık
print(“deneme yazısı”, file=f, flush=False)#print’in cıktısını değiştirip flush parametresine false verdik(tamponda bekletiyoruz)
#oluşan dosyanın içeriğini kontrol ettiğinde boş olduğunu “deneme yazısı” yazılmadığını görebilirsin
print(“şimdi yazsın”, file=f, flush=True)
#ve şimdi dosyayı kontrol ettiğimde alt alta sıralı bir şekilde “deneme yazısı” ve “şimdi yaz” satırları gözükmekte
f.close()

Merhaba, hoş geldiniz.

Evet, aynen öyle.

Sizin ihtiyacınıza göre değişir. Konsola veri yazdırdığınız neredeyse her zaman \n kaçış dizisini kullanmanız gerekir. Bir for döngüsü ile örnek verelim;

# `end` parametresinin olmadığını varsayalım;
for i in range(10):
	print(i, end="")
Output: 0123456789

# `end` parametresinin değeri değiştirilmemiş veya \n iken;
for i in range(10):
	print(i)
Output:
0
1
2
3
4
5
6
7
8
9

print() fonksiyonunun flush parametresinden bahsediyorsanız, bunun PyCharm ile bir alakası yok.

Bunda normal olmayan bir durum göremiyorum.

Evet, dosyaya veri yazdırmak için buna gerek yok zaten.

1 Beğeni

Koyarsa her yazının sonunda alt satıra inilir.
Koymazsa inilmez.

Cevaplar için teşekkür ederim.
Konu anlatımında, print(flush) parametresinde varsayılan değerin False olduğunu, biz .close() komutunu girene kadar print() içindeki yazılarımızın kaydetmek istediğimiz dosyaya yazılmadığı belirtilmiş. Ama .close() komutunu girmeden bakıyorum. flush değerini True da versek yazılar dosyaya yazılıyor, False de versek yazılıyor. PyCharm’da bu print(flush) komutunu çözemedim.

Güzel bir açıklama, şimdi daha iyi anlaşılıyor. Teşekkürler.

.close() metodu dosyaları kapatmak için mevcut, print() fonksiyonu ile bir alakası yok. Kafanızı karıştıran nokta burası.

1- Dosyalara veri yazdırabilmek için dosyayı kapatmak şart değil.
2- print() fonksiyonu bir gömülü fonksiyon, .close() kendisinin bir metodu değil.

Bir örnek vermek gerekirse:

print("Merhaba", file=open("dosya.txt", "w"))

Bu kodu çalıştırdığınızda, bu dosyanın bulunduğu dizinde dosya isminde bir .text dosyası oluşturulup içerisine “Merhaba” yazısı yazdırılacak.
Sizin dediğiniz gibi bu işlemi önlemeye çalışalım, hemen yazmasın. dosya.txt'in içeriğini silip şu kodu çalıştırın:

print("Merhaba", file=open("dosya.txt", "w"), end="")

Önceki çalıştırmada end parametresinin değerini değiştirmediğimiz için 2 satırlık alan kullanılmıştı. Bu kez 1 satır kullanıldı, alt satıra geçilmediği için. Yine istediğimizi elde edemedik, veriler dosyaya yazdırılıyor. Peki, flush parametresinin değerini False yapalım. dosya.txtin içeriğini temizleyip şu kodu çalıştırın:

print("Merhaba", file=open("dosya.txt", "w"), end="", flush=False)

Sonuç değişmedi, yine de dosyaya veriler yazıldı. Bunun sebebi, programın kapanması veya yapması gereken işin bitmesi. Bilgiler boşuna ram’de tutulup, sistemi yormasın diye program kapandıktan sonra (veya işlem tamamlandıktan sonra) bu dosyanın ram’de tuttuğu veriler için ‘sifon çekilir’ (flush).

1 Beğeni

Cevaplar için uğraşıyorsunuz. Açıklıyorsunuz. Çok teşekkürler.

1 Beğeni

Rica ederim, iyi çalışmalar :blush:

Benim gordugum kadariyla, close fonksiyonu cagrildiginda dosyaya yazildigi belirtilmis (dogru), cagrilmadiginda yazilmadigi belirtilmemis.

PyCharm’in kendisi, hatta python da cozemiyor. Cozebilmek icin isletim sistemi cekirdegine, dosya sistemi surucusune kadar inmek lazim. Hatta “elektrik kesilince bilgiler niye gitti” dersen hard disk firmware’ine kadar da devam edersin.

3 Beğeni