Почему интерпретатор Python сходит с ума от '\ b'? - PullRequest
0 голосов
/ 10 декабря 2018

Я написал этот простой код на 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 и почему у него такое разное поведение на разных ПК?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...