2017-04-09 2 views
9

Python 2's cmd module을 사용하여 프로그램의 명령 줄을 만듭니다. 내 프롬프트에 색상을 추가하지 않는 한 모든 것이 훌륭하게 작동합니다.일부 문자는 파이썬에서 내 색상이 지정된 프롬프트에 붙습니다. cmd

근무 코드 : 나는 긴 명령을 입력하거나 명령 기록에서 검색하려고하면 나는 다음과 같이 코드를 변경

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에도 있습니다.

+0

@cxw 예, Python2와'cmd'이지만이 문제는'cmd2'에도 있습니다! – RaminNietzsche

답변

6

그냥 색상 코드에 마커를 추가 : 당신은 내가 검색 모드를 종료하고 프롬프트가 다시 인쇄 될 때

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

당신의 asciicast, 당신은 문제가있다. 이는 파이썬이 이스케이프 문자가 실제로 화면에서 공간을 차지하지 않는다는 것을 모르기 때문입니다. 각 이스케이프 시퀀스 앞에 \x01을 넣고 각 이스케이프 시퀀스 후에 \x02을 넣으면 파이썬이 해당 문자가 공백을 차지하지 않는다고 가정하므로 프롬프트가 올바르게 다시 인쇄됩니다.

이것은 다른 문맥에서 상응하는 문제가있는 this answer에서와 같은 해결책입니다. 파이썬 readline 문서에는 이것을 언급하는 open issue이 있지만, 아직 완료되지는 않았다.

위의 colorcodes 값을 Cygwin에서 Python 2.7.12로 테스트하여 mintty로 실행했습니다. 프롬프트에서 username이 녹색으로 인쇄되고 다른 모든 것은 기본값 (밝은 회색)으로 인쇄됩니다. 표준 시스템 cmd을 사용했습니다. 이 아니고cmd2 (연결 한 모듈)입니다.

관련 문제