Как я могу печатать на консоли, пока программа работает на Python?

Возможный дубликат:
Как очистить вывод Печать на Python?

У меня есть алгоритм, который требует времени, поэтому я хочу отслеживать, как далеко он прошел, печатая на консоли.

Так что-то вроде:

import sys

def myMethod():
    i = 0
    while (i<1000000):
        i = i+1
        output_str = str(i) + "\n"
        sys.stdout.write(output_str)  # same as print
        sys.stdout.flush()

myMethod()

Как я могу получить этот отпечаток во время его работы, а не в конце?

Изменить, решение: - опубликован измененный код. Этот код отлично работает, когда вы запускаете его в терминале Linux, используя

 python filename.py

Но когда я запускаю его в Wing 101 IDE - нажав зеленую кнопку воспроизведения («Запустить содержимое редактора в оболочке python») - он ждет, пока программа не будет завершена, перед выводом.

Очевидно, в Wing IDE невозможно очистить стандартный вывод.


person dwjohnston    schedule 30.09.2012    source источник
comment
Это должно выводить 1,2,3,4,5, ... на консоль, так в чем проблема?   -  person nneonneo    schedule 30.09.2012
comment
Разве это не именно то, что уже делает ваш пример?   -  person Carl Norum    schedule 30.09.2012
comment
Это печатается после запуска?   -  person mjgpy3    schedule 30.09.2012
comment
@CarlNorum - Нет. Он не печатает, пока программа не завершит работу, а затем распечатывает все.   -  person dwjohnston    schedule 30.09.2012
comment
Опубликуйте весь код и то, как вы его выполняете.   -  person Burhan Khalid    schedule 30.09.2012
comment
Похоже, ваша IDE считывает всю информацию в память перед ее сбросом.   -  person Carl Norum    schedule 30.09.2012


Ответы (3)


Это то, для чего нужны потоки. У вас может быть одновременно запущен рабочий поток и поток выполнения:

import time
from threading import Thread

class WorkerThread(Thread):
    def __init__(self, value=0):
        super(WorkerThread, self).__init__()

        self.value = value

    def run(self):
        while self.value < 1000:
            self.value += 1
            time.sleep(0.01)

class ProgressThread(Thread):
    def __init__(self, worker):
        super(ProgressThread, self).__init__()

        self.worker = worker

    def run(self):
        while True:
            if not self.worker.is_alive():
                print 'Worker is done'
                return True

            print 'Worker is at', self.worker.value
            time.sleep(1.0)

if __name__ == '__main__':
    worker = WorkerThread()
    progress = ProgressThread(worker)

    worker.start()
    progress.start()

    progress.join()

Результат команды:

Worker is at 1
Worker is at 99
Worker is at 197
Worker is at 295
Worker is at 394
Worker is at 492
Worker is at 590
Worker is at 689
Worker is at 787
Worker is at 885
Worker is at 983
Worker is done

Обратите внимание, что рабочий поток подсчитывает 1 очень быстро, но поток выполнения просто сообщает о ходе выполнения каждую секунду.

person Blender    schedule 30.09.2012

Это уже обсуждалось на SO.

Пожалуйста, проверьте:

Как очистить вывод печати Python?

person sureshvv    schedule 30.09.2012
comment
Вы должны пометить вопрос как повторяющийся, а не публиковать его как ответ. - person Burhan Khalid; 30.09.2012

person    schedule
comment
Почему sys.stdout вместо print? - person Blender; 30.09.2012
comment
@ user1068446, работает нормально. Что вы видите в другом? - person Carl Norum; 30.09.2012
comment
Программа запускается, затем ждет 1-2 секунды, затем распечатывает весь список. - person dwjohnston; 30.09.2012
comment
@CarlNorum - Я только что запустил его в терминале Linux, и он ведет себя так, как мы хотим. Когда я запускаю Wing 101 IDE - (выводит в «Python Shell»), он ждет до конца. - person dwjohnston; 30.09.2012
comment
звучит так, как будто IDE оборачивает выполнение, а не очищает буфер. - person monkut; 30.09.2012
comment
@Blender Я использую здесь sys.stdout.write (), чтобы было более понятно, почему используется sys.stdout.flush (). - person monkut; 30.09.2012