程序在python中运行时如何打印到控制台?

dwj*_*ton 9 python console stdout wing-ide

可能重复:
如何刷新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()
Run Code Online (Sandbox Code Playgroud)

如何在运行时打印此打印件,而不是在最后?

编辑,解决方案: - 发布修改后的代码.当你在linux终端上运行它时,这段代码工作正常

 python filename.py
Run Code Online (Sandbox Code Playgroud)

但是当我在Wing 101 IDE中运行它时 - 按下绿色播放按钮('运行python shell中编辑器的内容') - 它等待程序完成后再输出.

显然,在Wing IDE中刷新stdout是不可能的.

mon*_*kut 7

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()
Run Code Online (Sandbox Code Playgroud)

  • 为什么`sys.stdout`而不是`print`? (2认同)

Ble*_*der 5

这就是线程的用途。您可以同时运行一个工作线程和一个进度线程:

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()
Run Code Online (Sandbox Code Playgroud)

命令的输出是:

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
Run Code Online (Sandbox Code Playgroud)

请注意,工作线程计数1非常快,但进度线程只是每秒报告进度。