Я написал этот простой код на Python, потому что я хотел создать для меня какой-нибудь модуль индикатора выполнения с дополнительной функцией сбора печатных данных во время 'for' в buffor, чтобы позволить мне печатать значения во время цикла, даже если я использую эту панель как tqdm().Все отлично работает в терминале.
import builtins
import sys
import os
def prgssb(container):
# Defines length of the progress bar
prgssb_len = 10
class ContainerWithBar:
def __init__(self, container_to_copy):
self.container_len = len(container)
self.index = 0
self.copy_container_iter = iter(container_to_copy)
self.print_buffor = []
# Overrides the built-in 'print' function
self.print_bar = builtins.print
builtins.print = self.add_to_buffor
def __iter__(self):
return self
def __next__(self):
# Normalize the built-in 'print' function and prints content the buffor
if self.index == self.container_len:
builtins.print = self.print_bar
print('\n*** Buffored data:')
for arg_data in self.print_buffor:
print(arg_data[0], end='', file=arg_data[1], flush=arg_data[2])
print('\n*** End of buffored data')
raise StopIteration
# Calculates properties of the progress bar
self.index += 1
iter_progress = round(self.index / self.container_len * prgssb_len)
percentage = round(self.index / self.container_len * 100)
element_progress_padding = 2 + len(str(self.container_len)) - len(str(self.index))
bar_content = '[' + '▓' * iter_progress + '░' * (prgssb_len - iter_progress) + ']' + f'{percentage:4d}%' + \
' ' * element_progress_padding + str(self.index) + '/' + str(self.container_len)
# Adjusts properties if script is running in the terminal
if os.isatty(0):
bar_content = '\r' + bar_content
# Prints the progress bar
self.print_bar('\b' * len(bar_content) + bar_content, end='')
return next(self.copy_container_iter)
def add_to_buffor(self, *objects, sep=' ', end='\n', file=sys.stdout, flush=False):
arg_str = ''
arg_index = 0
for arg in objects:
if arg_index == len(objects) - 1:
separator = ''
else:
separator = sep
arg_str += str(arg)
arg_str += separator
arg_index += 1
arg_str += end
arg_data = (arg_str, file, flush)
self.print_buffor.append(arg_data)
return ContainerWithBar(container)
Ну, это хорошо работало на другом ПК, либо в терминале pycharm, либо в интерпретаторе, но когда я запускаю его сейчас, это ведет себя очень странно.Он выводит дополнительную строку в интерпретаторе из ниоткуда вместо удаления старого бара.И да, ничего интересного, другой терминал, консоль, что угодно.Но суть в том, что символ '\ b' работает отлично, если я использую его в тестовой функции следующим образом:
from progress_bar import prgssb
from time import sleep
a = {}
for x in range(4):
a[x] = x
for x in prgssb(a):
sleep(1)
print(x, '\b' * 2, end='')
Я переопределяю функцию 'print' в этом коде, чтобы это было такЯ хочу, если кто-то использует это во время цикла.И если этого недостаточно, интерпретатор также выводит '\ b', даже если тот же метод, созданный мной, используется в тестовом файле следующим образом:
from progress_bar import prgssb
from time import sleep
a = {}
for x in range(4):
a[x] = x
b = prgssb(a)
for x in b:
sleep(1)
b.print_bar(x, '\b' * 2, end='')
Теперь действительно кажется, что все об этомметод self.print_bar находится внутри класса.Я не уверен, должно ли это работать так.Мне бы очень хотелось, чтобы был хороший индикатор прогресса, который правильно отображается повсеместно, кстати, я не знаю, возможно ли это вообще, но я действительно ценю любую помощь в этом вопросе, потому что я застрял в этой точке на некоторое время.
Также теперь я вижу, что этот скрипт не печатается правильно в не Pycharm Python-интерпретаторе, но в терминале CMD все еще в порядке.Что же тогда не так с интерпретатором Python и почему у него такое разное поведение на разных ПК?