Niezrozumiałe zachowanie print z end=''

Niezrozumiałe zachowanie print z end=''
RG
  • Rejestracja:około 5 lat
  • Ostatnio:około 16 godzin
  • Lokalizacja:Sardine, Italy
  • Postów:187
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:

Kopiuj
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

MA
  • Rejestracja:około 5 lat
  • Ostatnio:prawie 2 lata
  • Postów:134
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:

Kopiuj
import sys
...
def f_postep(b_p,s_t,b_wl):
	...
	sys.stdout.flush()  # opróżnianie bufora standardowego wyjścia STDOUT
	return
...
RG
Naprowadziłeś mnie i jest jeszcze argument print('Text', end='', flush=True) Może się komuś przyda.
JV
  • Rejestracja:ponad 6 lat
  • Ostatnio:3 miesiące
  • Postów:242
0

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

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

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

OtoKamil
Kolega nie szuka biblioteki, tylko powodu dlaczego jego kod nie działa
RG
Dokładnie, ale sprawdziłem też tqdm i daje fajne efekty. Dzięki.

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.