我有一个python脚本,在bash shell周围创建一个瘦包装器。它通过子进程模块包装bash调用,获取输出,并对其进行一些操作。
我的输出包含换行符“\ n”,但没有其他颜色或空格格式(即制表符)。
在Ipython中,您可以直接执行shell builtins,例如“ls”。输出格式化(带着色和间距)几乎与直接从bash shell执行“ls”命令的输出相同。
知道Ipython如何模仿shell输出格式吗?它们是否特殊包装不同的命令?
如果您不熟悉Ipython,有关如何在我的python脚本的REPL中重新创建bash格式而不必为不同命令创建显式映射和逻辑的任何想法?
由于
答案 0 :(得分:1)
我可能在这里错了,但我不认为ipython在这里任何。
当您输入!ls
时,这只会发送到ls
。在我的系统上,我只看到一个简单的黑白单行文件列表,就像我将ls
重定向到文件然后完成{{1}一样在那个文件上。即使我的bash shell中的cat
别名为ls
,ls -FG
也会忽略它。
因此,如果您正在获取任何花哨的格式,那么因为您已经配置!ls
(例如,通过env变量)来做一些奇特的事情。
然而,在ipython和你的代码之间有一点可能有所不同:我相信ipython只是让子进程打印到它的标准输出。但是您正在捕获该标准输出并手动将其路由到您自己的输出。这意味着bash及其所有子进程将能够告诉他们的stdout不是TTY,并可能相应地更改其输出。
因此,您不能将bash的标准输出重定向到管道,您必须将其重定向到pty,或其他类似TTY的内容。