터미널용 유틸리티를 개발하다 보면 출력 메시지에 색상을 부여하여 가독성을 높이고 싶을 때가 있다.

예를 들어 오류가 발생했다면 빨간색 텍스트로 표시한다거나 경고 문구는 노란색 텍스트로 표시하는 것이다.

파이썬으로 유틸리티를 개발할 경우 ColorConsole 모듈을 사용하면 된다.

https://code.google.com/p/colorconsole/

물론 이 외에도 다양한 모듈들이 존재하지만, 윈도우와 유닉스를 모두 지원하는 모듈을 찾지 못했다.

터미널에서 색상 문자열을 출력하는 방법은 플랫폼마다 다르다.

POSIX시스템에서는 아주아주 쉽다. 그냥 ANSI코드를 사용하면 된다.(예: "\x1b[30m".. 이야기에서 안시코드가지고 놀던 기억이....새록새록.)

그러나 윈도우 command prompt의 경우 별도 WINAPI를 호출해야 한다.(쩝..MS Command Prompt는 안시코드를 지원하지 않는다. 마치 디렉토리 구분자를 '\'로 만든 것과 동일하다. 이로 인한 클로스플랫폼 개발이 얼마나 사소하게 어그러졌는지원...쩝. 아니면 ANSI출력을 지원하는 command prompt 대체 프로그램을 사용해야 한다.)


colorconsole 모듈에서 제공하는 예제도 깔끔하고, 특정 위치 출력같은 부가기능도 사용할 수 있으므로, 다음 문서 페이지를 참고하자.

https://code.google.com/p/colorconsole/wiki/PageName?tm=6


자세한 설명을 생략한다. 다만 해당 모듈의 소스코드에서 배울 만한 스타일에 대해서만 살짝 살펴보자.



Source: https://flic.kr/p/7ucxPT


일단 terminal.py의 get_terminal() 함수부터 보자. 이 함수는 os.name에 따라 필요한 모듈을 import한 다음, 터미널 인스턴스를 생성하여 반환한다. 즉, import module을 반드시 스크립트 시작부분에서만 사용할 수 있는 것은 아니다.

def get_terminal():
    if os.name == "nt":
        import colorconsole.win        
        return colorconsole.win.Terminal()
    if os.name == "posix":
        import colorconsole.ansi       
        return colorconsole.ansi.Terminal()
    else:
        return None # Should raise exception!


win.py모듈에서 눈에 띄는 코드 부분은 WIN32API를 호출하는 방식이다.


# Window에서 런타임이 지원하는 API 호출시 필요.
import msvcrt  
# DLL 함수 및 구조체.
from ctypes import windll, Structure 

# C처럼 구조체를 사용하기.
class COORD(Structure): 
  """struct in wincon.h."""
  _fields_ = [
    ("X", SHORT),
    ("Y", SHORT)]

# 구조체를 사용하는 방법도 C와 비슷하다.
# pt = COORD(1, 2)
# pt.x = 2

# kernel32.dll의 함수를 호출할 때 그냥 짧은 함수이름으로 alias시켜준다.
# 콘솔과 관련된 함수는 다음 웹사이트를 참고하자.
# http://msdn.microsoft.com/en-us/library/windows/desktop/ms682073(v=vs.85).aspx
SetConsoleTextAttribute = windll.kernel32.SetConsoleTextAttribute

class Terminal:
    # 클래스내에서 사용하는 상수는 다음과 같이 정의한다.
    STD_INPUT_HANDLE = -10
    STD_OUTPUT_HANDLE = -11

    def __init__(self):
        # 표준 입출력의 핸들은 다음과 같이 구할 수 있다.
        # 예상대로 표준 오류 핸들은 -12이다. 
        # http://msdn.microsoft.com/en-us/library/windows/desktop/ms683231(v=vs.85).aspx
        self.stdout_handle = windll.kernel32.GetStdHandle(Terminal.STD_OUTPUT_HANDLE)
        self.stdin_handle = windll.kernel32.GetStdHandle(Terminal.STD_INPUT_HANDLE)

참고로 만약 파이프로 리다이렉션되었는지를 감지하는 방법은 있을까?

sys.stdout.isatty()를 호출하여 True인지 False인지를 보고 실제 콘솔 출력인지 파이프로의 출력인지를 알 수 있다.





C++ native 개발자에게도 생산성 문제때문에 스크립트 언어를 하나 정도 배워두면 좋다.

나는 개인적으로 파이썬을 선호한다. 기존 레거시 시스템들 중에서는 Perl이나 Erlang 등을 사용하 것들이 있지만, 최근 새롭게 시작하는 프로젝트에서 스크립트 언어를 선택하라면 파이썬을 선택하겠다.

특히 2.7 버전. 다행히 2.7 버전의 지원은 2020년까지로 연장되었다.


여하튼 파이썬으로 개발할 때 내가 바라는 파이썬 IDE의 기능은 다음과 같다.

  • breakpoint
  • syntax highlighting
  • callstack
  • 인텔리센스 기능(있으면 좋은 기능)

개인적으로 몇가지 IDE를 사용해 보았지만, 그닥 만족스러운 결과를 얻지는 못했다.
그래도 회사에서는 Komodo를 구매해서 사용하였다.
최근 다시 관련 도구를 사용하면서 PTVS(Python Tools for Visual Studio)가 2.x로 버전업한 것을 알게되었다.

PTVS는 생각보다 많은 기능을 제공한다.
  • CPython 이외에도 윈도우라서 IronPython까지 지원한다.
  • 장고앱 개발 가능.
  • 성능 프로파일링.
  • 원격 리눅스/맥 디버깅을 지원한다고 한다.(테스트 해보지 못했다.)
  • VirtualEnv를 지원하여 특정 버전의 파이썬으로 작성중인 코드를 테스트할 수 있다.

IPython 코드를 실행한 VSIPython 코드를 실행한 VS




나의 조합은 VS + PTVS+Anaconda이다.
  • PTVS 홈페이지: http://pytools.codeplex.com/
  • Anaconda: https://store.continuum.io/cshop/anaconda/
    • 아나콘다 패키지는 [User's Home]\Anaconda 폴더에 설치된다. 
    • conda.bat를 이용하여 conda와 ipython을 최신 버전으로 업데이트 한다. conda.bat는 Scripts 폴더에 있다.
      • conda update conda 실행
      • conda update ipython 실행
  • VS를 실행한 후 Tools>Options>Python Tools>Environment Options에서 방금 설치한 아나콘다의 파이썬 경로를 추가한다.
  • IPython을 사용하고 싶다면 Interactive Options에서 Interactive Mode를 Standard가 아닌 IPython으로 변경한다.
  • 참고) IronPython: http://ironpython.net/

몇가지 핫키
  • 파이썬 환경 창: Ctrl+K, `
  • 인터랙티브 파이썬 창: Alt+I
  • 선택된 코드를 인터랙티브 파이썬 창으로 보내기: Ctrl+E, Ctrl+E
  • 편집창 코드를 인터랙티브 파이썬 창에서 실행하기: Shift+Alt+F5

기타 관련 문서 


+ Recent posts