pysvn 에서 출력되는 메시지가 utf8 형식이므로
euckr 프로그램 내부에서 돌릴 경우 제대로된 메시지 확인이 어렵습니다.

쉽게 생각할 수 있는 해결 방법 중 하나는 pysvn 함수를 호출하기 전에
stdout 과 stderr 을 보관했다가 호출이 완료되면 복구하는 것인데...
자칫하면 개노가다 코딩이 되기 쉽습니다.

이런 경우에 사용하는 방법이 데코레이터입니다.


import sys

class SVN_Translator:
def __init__(self, out):
self.out = out

def write(self, msg):
self.out.write(msg.decode("utf8").encode("mbcs"))


def SVN_Translate(func):
def call(*args, **kwargs):
oldout = sys.stdout
olderr = sys.stderr
sys.stdout = SVN_Translator(oldout)
sys.stderr = SVN_Translator(olderr)
try:
ret = func(*args, **kwargs)
except:
raise
finally:
sys.stdout = oldout
sys.stderr = olderr
return ret
return call


위처럼 작성한 다음 앞으로 사용하려는 함수 위에 @SVN_Translate 라고 적어주면 끝입니다.


import pysvn

@SVN_Translate
def SVN_Update(path):
client = pysvn.Client()
updateResults = client.update(path)
if updateResults:
updateResult = updateResults[0]
return updateResult.number

print "현재 리비전은 %d입니다" % (SVN_Update("."))


~(-_-)~ 짠

자동 락 걸어주거나 할때도 유용한 방법입니다.
이올린에 북마크하기(0) 이올린에 추천하기(0)
2009/02/04 22:42 2009/02/04 22:42