Niezrozumiałe zachowanie print z end=''

0

Witam

Napisałem sobie programik w którym postęp działania miał być przedstawiony w formie krzyżyka dopisywanego jeden za drugim.
Wycinek wygląda tak:

import time

b_postep=True

def f_postep(b_p,s_t,b_wl):
	"""
	Funkcja pokazujaca postep
	postep - włączam wypisywanie lub wyłączamy
	s_text - do wyswietlenia
	b_w_linii - True lub False, w linii (end='') lub moze przejsc do nastepnej linii
	"""
	if not b_p:
		return
	time.sleep(0.5)
	if b_wl:
		print(s_t, end='')
	else:
		print(s_t)
	return

f_postep(b_postep,'',False) ####################
f_postep(b_postep,'Generuję strony html\'a ',True) ###############
f_postep(b_postep,'#',True) ################
f_postep(b_postep,'#',True) ################
f_postep(b_postep,'#',True) ################
f_postep(b_postep,'#',True) ################
f_postep(b_postep,'#',True) ################
f_postep(b_postep,'#',False) ###############

Za pomocą zmiennej b_postep True/False włączam sobie ten "efekt". w funkcji dodałem time.sleep(), żeby było coś widać bo bez działa za szybko.
No i właśnie nie robi kroczków tylko od razu na końcu wypisuje wszystkie krzyżyki w jednym skoku. Dlaczego. Można jakąś podpowiedź.
Gdy odrzucimy end='' to wypisuje krok po kroku, ale jeden pod drugim.

Pozdrawiam
Radek Głębicki

0

Zazwyczaj STDOUT w konsoli jest buforowany (stdin,stderr - też, można przestawić ten stan na niebuforowaną, konfigurując konsolę, co zmniejsza jej wydajność).
Oznacza to, że najczęściej tekst jest wyświetlany dopiero po napotkaniu znaku nowej linii "\n".
Rozwiązanie:

import sys
...
def f_postep(b_p,s_t,b_wl):
	...
	sys.stdout.flush()  # opróżnianie bufora standardowego wyjścia STDOUT
	return
...
0

Do paska postępu można wykorzystać moduł tqdm:

$ pip install tqdm
import tqdm, time
for i in tqdm.tqdm(range(100)):
    time.sleep(0.01)

więcej na https://github.com/tqdm/tqdm

1 użytkowników online, w tym zalogowanych: 0, gości: 1