2017-05-19 25 views
0

實際上有兩個部分對我的問題。我已經寫了一個函數來通過簡單的替換從字符串中刪除ANSI代碼,但是函數按原樣返回字符串。我已經嘗試過使用pdb進行調試,但結果並不合理,因爲看起來好像Python本身存在一個小故障。然而,我懷疑這一點,所以我想弄清楚在代碼中沒有看到什麼錯誤。此外,我想知道是否有更好的方法來刪除(可能還沒有看到)的ANSI代碼,而無需每次修改該函數。調試Python函數以刪除ANSI代碼

這裏有我不解的PDB屏幕的鏡頭: pdb screenshot of function debugging

n_text不被設置,目標設置爲一些奇怪和執行行指針不知何故被設置爲一個非 - 可執行行(157)。 我一直有類似的錯誤,當我用而不是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 [ ç\ 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 [0米\ n \ n - ?'

和預期收益

'? - 人類(蘇格拉底)\ n \ ntrue \ n \ n - ?'

把事情而言,這是一個項目to create a command-line IDE的一部分,出現此特定問題當一個查詢被傳遞給一個SWI-Prolog實例(通過pexpect),並且輸出被解析爲只給出實際結果,即爲真。在這種情況下爲

回答

0

你的代碼應該清理出現的字符串中的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?- ' 
+0

謝謝許多。順便說一下,事實證明,我們的兩個實現都可以正常工作,不過你的性能肯定更高,更優雅。我注意到我添加代碼時遇到了同樣的問題。但之後我退出並重新啓動了我的應用程序(在我剛剛從模塊重新加載函數之前),並且它完全正常工作。也許當Python重新加載一個函數時,它只會寫入相同的內存地址,並且可能會發生一些破壞。 – skeledrew