Kod doğru bir şekilde cmd ekranda yazdırılmıyor

from time import sleep

data="Hello World"
for i in data:
	sleep(0.1)
	print(i,end="")
print()

Öncelikle merhabalar,
Başka bir programda kullandığım kodların cmd komut isteminde istediğim şekilde çalışmadığını farkettim. Yukarıdaki kod basitleştirilmiş bir modellemedir.
Sublime Text’de yazdığım yukarıdaki kodu program içinde çalıştırınca sleep(0.1) komutu gerçekleşiyor. Yani her harf sonrası 0.1 sn. bekliyor. Fakat cmd komut isteminde çalıştırınca bu işlev gerçekleşmiyor. Ekranda boş bir şekilde tüm harfleri yazdırıyormuş gibi bekliyor (ama yazdırmıyor) o süre bitince hepsini birden ekrana basıyor. Yani tek tek basma işlemi gerçekleşmiyor.
Ben bu farklılığın neden olduğunu ve çözümünü öğrenmek istiyorum. İnternetten baktım ama bir şey elde edemedim.
Yardımcı olacaklara şimdiden teşekkürler.
[Video ekleyemedim, ekran fotoğrafı ekledim ama durumu iyi açıkladığımı düşünüyorum]
[Forumda ilk sorum umarım doğru şekilde sormuşumdur]

Buffer’daki ciktiyi flush etmeniz lazim, yani her bir print(i, end="") kismindan sonra sys.stdout.flush() kullanin, veya print(i, end="", flush=True)

Orada olay soyle gerceklesiyor. Sondaki print fonksiyonu calistirilana kadar sys.stdout’a yapilan girisler buffer’da bekletiliyor, o yuzden len(data)*0.1 saniye sonra buffer tek seferde yazdiriliyor.

2 Beğeni

Merhabalar,

Sorunuzu cok dogru bir sekilde sormussunuz, tesekkurler.

Bahsettiginiz olayin sebebi, bir programin stdout’a yazdigi seylerin –herhangi bir dosyaya yazilan herhangi bir sey gibi– buffer’lanabilmesi. Dosya kapatilincaya kadar gorunur olma zorunlulugunun olmamasi. stdout dosyasi genelde program kapandiginda kapandigi icin ciktilarin cikmasi program sonunu bulabiliyor. Daha fazla arastirmak icin “stdout buffering” aratabilirsiniz.

Cikti dogrudan terminal ise genelde buffering yok, karakterler yazildiklari gibi gozukuyorlar.

Araya giren programlar bazen girdilerini ve/veya ciktilarini buffer’liyorlar.

Buffering cogunlukla satir bazli yapiliyor—\n yazdirmak buffer’in bosaltilmasini sagliyor. (Hatta bununla ilgili C veya POSIX gibi bir standartta bir seyler okumustum gibi hatirliyorum)

Ciktiyi satir bazli yapabilirsiniz (end='\n'). Bu cogu zaman en dogal “cozum” ama her cikti icin mantikli degil.

stdout’un buffer’ini flush edebilirsiniz (sys.stdout.flush()). Bu en kolay cozum fakat programi yazanin kullanandan daha cok sey bildigini ima ettigi icin en dogru cozum degil.

Aradaki program(lar)a girdilerini/ciktilarini buffer etmemeyi soyleyebilirsiniz. Kullanilan aletlerin istenildikleri sekilde kullanildiklarini bildigimiz ve kod tarafinda kullanim sekli varsaymadigimiz icin en dogru cozum bu.

Ilk iki cozumun calisma garantisi yok. Ucuncunun var, fakat o da her zaman mumkun degil.
¯\(ツ)

Bu arada python’un kendisi de bir suredir ciktilari buffer’liyor. -u paslamak lazim.

3 Beğeni

Açıklamalarınız için çok teşekkürler. Yeni bir şey öğrenmiş oldum. İnternetten buffering ile ilgi araştırma yapıcam. Sorunumu şimdilik " print(i, end="", flush=True) " kullanarak çözdüm.

İyi Çalışmalar diliyorum…