You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

PyCharm运行控制台多进度条显示异常问题求助

PyCharm社区版运行控制台tqdm多进程进度条换行问题解决方法

问题背景

使用multiprocessing和tqdm实现的多进程进度条代码,在VS Code中可正常显示动态更新的多进度条,但在Windows系统的PyCharm社区版**运行控制台(Run Console)**中,进度条每次更新都会换行,仅在所有任务结束后才会显示完整内容;而在PyCharm的终端(Terminal)中运行则完全正常。

示例代码如下:

import multiprocessing
import time
import random
from tqdm import tqdm

# Define n at the start of the file
n = 20

def worker(queue, argument):
    """Function to be executed by each process."""
    description = f"Worker {argument}"

    # Define a random number of operations for this worker
    num_operations = random.randint(10, 100)

    for _ in range(num_operations):
        # Perform some task
        time.sleep(random.uniform(0.05, 0.5))  # Random sleep between 50ms and 500ms
        # Send update to the main process along with the total operations count
        queue.put((description, 1, num_operations))

if __name__ == "__main__":
    # Create queue
    queue = multiprocessing.Queue()

    # Create the processes
    processes = [multiprocessing.Process(target=worker, args=(queue, i)) for i in range(n)]

    # Create progress bars
    progress_bars = {}

    # Define distinct colors for each bar
    colors = ['red', 'green', 'blue', 'yellow', 'magenta', 'cyan', 'white', 'black']

    # Start the processes
    for p in processes:
        p.start()

    total_updates = 0
    total_operations = 0
    while total_updates < total_operations or total_operations == 0:
        description, increment, total = queue.get()

        if description not in progress_bars:
            # Assign a color to the progress bar
            color = colors[len(progress_bars) % len(colors)]
            # Initialize progress bar if not done yet
            progress_bars[description] = tqdm(total=total, desc=description, bar_format='{desc}: {percentage:3.0f}%|{bar}| {n_fmt}/{total_fmt}', colour=color)
            total_operations += total

        progress_bars[description].update(increment)
        total_updates += increment

    # Join the processes
    for p in processes:
        p.join()

    for pb in progress_bars.values():
        pb.close()

原因分析

PyCharm的运行控制台默认并非交互式终端,对tqdm依赖的ANSI控制码支持不足——tqdm正是通过ANSI控制码实现进度条的动态刷新(不换行重绘);而PyCharm的终端是标准交互式环境,能够正确解析这些控制码,所以运行正常。

解决方案

方法1:启用运行控制台的终端模拟(推荐)

通过修改PyCharm的运行配置,让输出控制台模拟终端环境:

  1. 点击PyCharm右上角运行按钮旁的下拉菜单,选择Edit Configurations
  2. 在弹出的窗口中,找到当前使用的Python运行配置
  3. 切换到Execution标签页,勾选Emulate terminal in output console选项
  4. 点击Apply保存配置,重新运行代码即可

方法2:强制tqdm使用标准输出

在初始化tqdm时,指定输出到标准输出:

import sys
# 替换原tqdm初始化代码
progress_bars[description] = tqdm(
    total=total,
    desc=description,
    bar_format='{desc}: {percentage:3.0f}%|{bar}| {n_fmt}/{total_fmt}',
    colour=color,
    file=sys.stdout
)

此方法对部分场景有效,但优先级低于方法1。

验证

修改配置或代码后重新运行,进度条将在PyCharm运行控制台中动态更新,不再出现换行问题。

内容的提问来源于stack exchange,提问作者Mefitico

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.21 03:55:41