2013-10-07 62 views
5

是否有將終端格式化輸出打印到變量的方法?如何將終端格式化輸出打印到變量

print 'a\bb' 
--> 'b' 

我想這個字符串「B」給一個變量 - 所以怎麼辦呢?

我正在使用來自telnet的文本字符串。因此我想使用將要打印到屏幕的字符串。

所以我要尋找的是這樣的:

simplify_string('a\bb') ==> 'b' 

以回車又如:

simplify_string('aaaaaaa\rbb') ==> 'bbaaaaa' 
+0

對於每個發佈方法來捕獲標準輸出的人來說:你錯過了這一點。這個問題正在簡化一個字符串來解釋*終端控制字符*,而不僅僅是捕獲'sys.stdout'。 – nneonneo

+1

@nneonneo:捕捉標準輸出不會控制這些字符的例子是什麼? –

+1

@DavidRobinson:每一種情況。他希望'\ b'實際上**刪除前一個字符**,有效地模擬'\ b'的行爲,因爲它會影響實際的終端。捕獲sys.stdout不會模擬終端,它只是直接捕獲任何和所有的控制序列。 – nneonneo

回答

7

這被證明是相當棘手,因爲有很多終端格式化命令(包括例如光標上/下/左/右命令,終端顏色代碼,垂直和水平標籤等)。

所以,如果你想正確模擬一個終端,得到一個終端模擬器! pytepip install pyte)實現了VT102兼容的內存虛擬終端。所以,你可以給它一些文字,然後從它那裏得到格式化文本:

import pyte 

screen = pyte.Screen(80, 24) 
stream = pyte.ByteStream() 
stream.attach(screen) 
stream.feed('xyzzz\by\rfoo') 
print ''.join(c.data for c in screen[0]).rstrip() 
# prints foozy 

要處理多個行,剛剛加入所有行的文本(例如'\n'.join(''.join(c.data for c in row).rstrip() for row in screen).rstrip('\n'))。

請注意,這不處理尾隨空格,但無論如何,這些在真正的終端上無法區分。

+0

只是使用Google搜索終端模擬器:)不錯的工作! – BartoszKP

+0

這一個似乎工作! – mkorpela