【问题标题】:How to maintain Bash output formatting in python REPL如何在 python REPL 中维护 Bash 输出格式
【发布时间】:2013-05-16 21:12:51
【问题描述】:

我有一个 python 脚本,它在 bash shell 周围创建了一个薄包装器。它通过 subprocess 模块包装 bash 调用,获取输出,并对其进行一些处理。

我的输出包含换行符“\n”,但没有其他颜色或空格格式(即制表符)。

在 Ipython 中,您可以直接执行 shell 内置命令,例如“ls”。输出的格式(带有颜色和间距)几乎与直接从 bash shell 执行“ls”命令的输出相同。

知道 Ipython 如何模仿 shell 输出格式吗?它们是特殊的外壳不同的命令吗?

如果您不熟悉 Ipython,有什么想法可以在我的 python 脚本的 REPL 中重新创建 bash 格式,而无需为不同的命令创建显式映射和逻辑?

谢谢

【问题讨论】:

    标签: python bash shell ipython


    【解决方案1】:

    我在这里可能是错的,但我不认为 ipython 在这里做 任何事情

    当您键入 !ls 时,这将输出到 ls。在我的系统上,我只看到一个纯黑白的每行一个文件列表,就像我将ls 重定向到一个文件然后在该文件上执行cat 一样。即使 ls 在我的 bash shell 中别名为 ls -FG!ls 也会忽略它。

    所以,如果你得到任何花哨的格式,那是因为你已经配置了 ls(例如,通过 env 变量)来做一些花哨的事情。

    但是,ipython 和您的代码之间可能有一点不同:我相信 ipython 只是让子进程打印到其标准输出。但是您正在捕获该标准输出并手动将其路由到您自己的输出。这意味着 bash 及其所有子进程将能够判断其 stdout 不是 TTY,并可能相应地更改其输出。

    因此,您不能只将 bash 的标准输出重定向到管道,您必须将其重定向到 pty,或其他类似 TTY 的东西。

    【讨论】:

    • 是的,你完全正确。我刚刚用 subprocess.call 试了一下,它的格式正确。对我来说很愚蠢。谢谢!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-04-21
    • 1970-01-01
    • 2020-02-22
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多