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

Posted

技术标签:

【中文标题】程序在 python 中运行时如何打印到控制台? [复制]【英文标题】:How can I print to console while the program is running in python? [duplicate] 【发布时间】:2012-09-21 10:32:08 【问题描述】:

可能重复:How to flush output of Python print?

我有一个正在运行的算法需要一段时间,所以我想通过打印到控制台来跟踪它的进度。

比如:

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 shell 中运行编辑器的内容”)——它会等到程序完成后再输出。

Apparently it's not possible to flush stdout in the Wing IDE.

【问题讨论】:

那应该是打印 1,2,3,4,5,... 到控制台,那有什么问题呢? 您的示例不正是这样做的吗? 这在运行后打印? @CarlNorum - 不。在程序完成运行之前它不会打印,然后打印所有内容。 发布整个代码,以及你是如何执行它的。 【参考方案1】:
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()

【讨论】:

为什么是sys.stdout 而不是print @user1068446,它工作正常。你觉得有什么不同? 程序似乎已启动,然后等待大约 1-2 秒,然后打印整个列表。 @CarlNorum - 我刚刚在 linux 终端上运行它,它的行为符合我们的要求。当我在 Wing 101 IDE 中运行时——(输出到“Python Shell”)它会等到最后。 听起来 IDE 正在包装执行而不是刷新它的缓冲区。【参考方案2】:

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

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 计数,但进度线程只是每秒报告一次进度。

【讨论】:

【参考方案3】:

这已经在 SO 上讨论过了。

请检查:

How to flush output of Python print?

【讨论】:

您应该将问题标记为重复,而不是将其作为答案发布。

以上是关于程序在 python 中运行时如何打印到控制台? [复制]的主要内容,如果未能解决你的问题,请参考以下文章

在调试器中运行时中断下一个输出

在 VS Code 中运行时 Python 跳过函数

如何使用 python 为 Web 元素生成 Xpath(在我的脚本中运行时)?

找出python程序中运行时最耗时间的部分

logback :项目中运行时 控制台没有logback日志产生 ?

在 WPF .net core 5 中运行时更改应用程序文化时如何更新属性绑定