【问题标题】:Debugging a Python function to remove ANSI codes调试 Python 函数以删除 ANSI 代码
【发布时间】:2017-05-20 06:42:12
【问题描述】:

我的问题实际上有两个部分。我编写了一个函数来通过简单的替换从字符串中删除 ANSI 代码,但是该函数按原样返回字符串。我尝试使用 pdb 进行调试,但结果没有意义,因为 Python 本身似乎存在故障。但是我对此表示怀疑,所以我试图找出我在代码中没有看到的错误。另外我想知道是否有更好的方法来删除(可能还没有看到)ANSI 代码,而无需每次都修改函数。

这是 pdb 屏幕的截图,让我感到困惑: pdb screenshot of function debugging

n_text 没有被设置,targets 被设置为奇怪的东西,执行行指针不知何故被设置为不可执行的行 (157)。 当我使用 re 而不是 string.replace 时,我遇到了类似的错误。

功能是

def clean_ansi(text, remove=''):
    # remove ANSI control codes
    n_text = text
    targets = [''.join([chr(cde) for cde in [27, 91, 67]]),
               ''.join([chr(cde) for cde in [27, 91, 48, 109]]),
               ''.join([chr(cde) for cde in [27, 91, 49, 109]])]

    for target in targets:
        n_text = n_text.replace(target, '')
    return n_text

对于这个例子,我要清理的字符串是

'?- 人类(苏格拉底)\n\x1b[C\x1b[C\x1b[C\x1b[C\x1b[C\x1b[C\x1b[C\x1b[C\x1b[C\x1b[C\x1b[C \x1b[C\x1b[C\x1b[C\x1b[C\x1b[C\x1b[C\x1b[C.\n\x1b[1mtrue.\x1b[0m\n\n?-'

预期回报是

'?- 人类(苏格拉底)\n.\ntrue.\n\n?-'

把事情放在上下文中,这是项目to create a command-line IDE 的一部分,当查询被传递到 SWI-Prolog 实例(通过 pexpect)并且解析输出以仅给出实际结果时,会发生此特定问题,这是 true。 在这种情况下。

【问题讨论】:

    标签: python swi-prolog pdb pexpect


    【解决方案1】:

    您的代码应该从提供的字符串中清除 ANSI 代码,您确定您的调用正确吗?

    无论哪种方式,它只会删除选定的代码,并且不是一种特别优雅或高效的方式 - 我建议您使用正则表达式并为自己省点麻烦:

    import re
    
    ANSI_CLEANER = re.compile(r"(\x9B|\x1B\[)[0-?]*[ -/]*[@-~]")
    
    clean_string = ANSI_CLEANER.sub("", your_string)
    
    print(repr(clean_string))
    # prints '?- human(socrates)\n.\ntrue.\n\n?- '
    

    【讨论】:

    • 非常感谢。顺便说一句,事实证明我们的两个实现都运行良好,尽管您的实现肯定更高效、更优雅。我注意到添加代码时遇到了同样的问题。但后来我退出并重新启动了我的应用程序(在我刚刚从模块中重新加载函数之前),一切都运行良好。也许当 Python 重新加载一个函数时,它只是写入相同的内存地址,可能会发生一些损坏。
    猜你喜欢
    • 2015-01-10
    • 2019-10-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-08-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多