2017-04-09 45 views
9

içinde renklendirilmiş istemime yapışır. Bir program için komut satırı yapmak için Python 2's cmd module kullanıyorum. Her şey, istemime renk eklemediğim sürece güzel çalışır.Bazı karakterler, Python cmd

Çalışma kod: Uzun komutu girin veya komut tarihinin aramak çalışırsanız ben, aşağıda benim kodunu değiştirmek

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() 

, bazı karakterler benim istemine sopa.

Sorun kodu:

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() 

Sen asciicasts bu sorunu görebilirsiniz. Sorun ayrıca cmd2 module ile var.

+0

@cxw Evet, Python2 ve 'cmd' ama bu sorun da cmd2'de var! – RaminNietzsche

cevap

6

Sadece renk kodlarına işaretçileri ekleyin: i-arama modundan çıkmak ve hızlı yeniden basıldığında

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

senin asciicast olarak, sorunları var. Bunun nedeni, Python'un kaçış karakterlerinin aslında ekranda yer açmayacağını bilmemesidir. Her bir çıkış dizisinden önce \x01 ve her bir çıkış dizisinden sonra \x02 koyulması, Python'a bu karakterlerin boşluk almadığını ve komut isteminin doğru şekilde yeniden basılacağını bildirmesini söyler. Bu, farklı bir bağlamda karşılık gelen sorunu olan this answer'daki ile aynı çözümdür. Python readline dökümantasyonunda bundan bahsetmek için bir open issue var, ancak henüz yapılmadığını göremiyorum.

Yukarıdaki colorcodes değerlerini Cygwin'de Python 2.7.12 ile test ettim; Komut isteminde, username yeşil yazdırıldı ve diğer her şey varsayılan (açık gri) yazdırıldı. cmd modülü, numaralıcmd2 numaralı standart sistemi kullandınız (bağlandınız).