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

如何在Python Rich的Layout中嵌入表格并解决ANSI代码异常问题

问题:Rich库表格放入Layout后显示ANSI代码且颜色失效

尝试用Python的Rich库将表格放入Layout布局框时,输出出现大量类似ANSI代码的字符,列设置的颜色属性也未生效。直接打印表格显示正常,但放入Layout占位符后就异常。

原代码

from re import X
import psycopg2
from rich.console import Console
from rich.table import Table
from rich import box
from rich.layout import Layout
from rich import print as rprint

layout = Layout()
layout.split_column(
    Layout(name="upper"),
    Layout(name="lower")
)

connection = psycopg2.connect(user="enterprisedb",
                                  password="xxxx",
                                  host="xx.xx.xxx.170",
                                  port="5444",
                                  database="edb")
cursor = connection.cursor()
def imp_file_layout():
    table1 = Table(title="FILE LOCATIONS")
    table1.add_column("FILE_NAME", style="cyan", no_wrap=True)
    table1.add_column("LOCATION", style="magenta")
    directory_detail_Query = "select name,setting from pg_settings where name in ('data_directory','config_file','hba_file');"
    cursor.execute(directory_detail_Query)
    directory_records = cursor.fetchall()
    for row in directory_records:
        table1.add_row(*list(row))
    console=Console(markup=False)
    with console.capture() as capture:
        console.print(table1)
    return capture.get()


x=imp_file_layout();
layout["lower"].update(x)

rprint(layout)

cursor.close()
connection.close()

异常输出

╰───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯
[3m                      FILE LOCATIONS                       [0m
┏━━━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┓
┃[1m [0m[1mFILE_NAME     [0m[1m [0m┃[1m [0m[1mLOCATION                              [0m[1m [0m┃
┡━━━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┩
│[36m [0m[36mconfig_file   [0m[36m [0m│[35m [0m[35m/var/lib/edb/as14/data/postgresql.conf[0m[35m [0m│
│[36m [0m[36mdata_directory[0m[36m [0m│[35m [0m[35m/var/lib/edb/as14/data                [0m[35m [0m│
│[36m [0m[36mhba_file      [0m[36m [0m│[35m [0m[35m/var/lib/edb/as14/data/pg_hba.conf    [0m[35m [0m│
└────────────────┴────────────────────────────────────────┘

解决方法

问题根源在于你用console.capture()把表格转换成了带ANSI转义的字符串,而Layout可以直接接收Rich的可渲染对象(比如Table实例),不需要转成字符串。另外markup=False也会干扰样式渲染。

修改步骤:

  • 删除console.capture()相关的代码,直接返回Table对象
  • 移除多余的console=Console(markup=False)行

修改后的代码:

from re import X
import psycopg2
from rich.table import Table
from rich.layout import Layout
from rich import print as rprint

layout = Layout()
layout.split_column(
    Layout(name="upper"),
    Layout(name="lower")
)

connection = psycopg2.connect(user="enterprisedb",
                                  password="xxxx",
                                  host="xx.xx.xxx.170",
                                  port="5444",
                                  database="edb")
cursor = connection.cursor()
def imp_file_layout():
    table1 = Table(title="FILE LOCATIONS")
    table1.add_column("FILE_NAME", style="cyan", no_wrap=True)
    table1.add_column("LOCATION", style="magenta")
    directory_detail_Query = "select name,setting from pg_settings where name in ('data_directory','config_file','hba_file');"
    cursor.execute(directory_detail_Query)
    directory_records = cursor.fetchall()
    for row in directory_records:
        table1.add_row(*list(row))
    # 直接返回表格对象,无需捕获字符串
    return table1


x=imp_file_layout();
layout["lower"].update(x)

rprint(layout)

cursor.close()
connection.close()

这样修改后,Layout会正确渲染表格的样式,不会再显示ANSI代码,列的颜色也能正常生效。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.11 07:50:50