【问题标题】:Some characters stick to my colorized prompt in Python cmd一些字符在 Python cmd 中坚持我的彩色提示
【发布时间】:2017-09-04 08:56:24
【问题描述】:

我正在使用Python 2's cmd module 为程序创建命令行。只要我不为提示添加颜色,一切都会很好地工作。

工作代码:

from cmd import Cmd

class App(Cmd):

    def __init__(self):
        Cmd.__init__(self)
        self.prompt = "PG ["+ (str('username'), 'green') +"@"+ str('hostname') +"]: "

    def do_exit(self, line):
        '''
        '''
        return True

App().cmdloop()

当我如下更改我的代码时,如果我输入一个长命令或尝试在命令历史记录中搜索,一些字符会粘在我的提示符上。

问题代码:

from cmd import Cmd

class App(Cmd):

    def __init__(self):
        Cmd.__init__(self)
        self.prompt = "PG ["+ self.colorize(str('username'), 'green') +"@"+ str('hostname') +"]: "

    colorcodes =    {'green':{True:'\x1b[32m',False:'\x1b[39m'}}


    def colorize(self, val, color):
        return self.colorcodes[color][True] + val + self.colorcodes[color][False]

    def do_exit(self, line):
        '''
        '''
        return True

App().cmdloop()

你可以在asciicasts 看到这个问题。 cmd2 module也存在这个问题。

【问题讨论】:

  • @cxw 是的,它是 Python2 和 cmd 但这个问题也存在于 cmd2 中!

标签: python colors command-line-interface python-2.x readline


【解决方案1】:

只需在颜色代码中添加标记:

    colorcodes =    {'green':{True:'\x01\x1b[32m\x02',False:'\x01\x1b[39m\x02'}}
                                  # ^^^^        ^^^^         ^^^^        ^^^^

在您的 asciicast 中,当您离开 i-search 模式并重新打印提示时,您会遇到问题。那是因为 Python 不知道转义字符实际上并不占用屏幕上的空间。在每个转义序列之前放置 \x01,在每个转义序列之后放置 \x02,告诉 Python 假设这些字符不占用空间,因此提示将被正确重印。

这与this answer 中的解决方案相同,但在不同的上下文中存在相应的问题。在 Python readline 文档中有一个open issue 提到了这一点,但我看它还没有完成。

我在 Cygwin 上使用 Python 2.7.12 测试了上述 colorcodes 值,运行在 mintty 中。在提示符中,username 打印绿色,其他所有内容都打印默认值(浅灰色)。我使用了标准系统 cmd 模块,不是 cmd2(你链接的)。

【讨论】:

  • 非常感谢!我在使用基于readline 的界面时遇到了这个问题,这让我抓狂。我最终得到了一些丑陋的解决方法,在print()end=''input() 中包含我的彩色提示的某些部分。这个答案正是我想要的,但在我需要的时候找不到。
猜你喜欢
  • 2014-07-20
  • 2019-10-12
  • 2017-09-12
  • 1970-01-01
  • 2017-04-23
  • 1970-01-01
  • 2015-09-28
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多