termios — POSIX 스타일 tty 제어

termios — POSIX 스타일 tty 제어

이 모듈은 tty I/O 제어를 위한 POSIX 호출에 대한 인터페이스를 제공해요. 이 호출들에 대한 완전한 설명은 termios(3) Unix 매뉴얼 페이지를 참고하세요. 설치 시 POSIX termios 스타일 tty I/O 제어를 지원하도록 구성된 Unix 버전에서만 쓸 수 있어요.

가용성: Unix.

이 모듈의 모든 함수는 첫 번째 인자로 파일 디스크립터 fd를 받아요. 이는 sys.stdin.fileno()가 반환하는 정수 파일 디스크립터일 수도 있고, sys.stdin 자체 같은 파일 객체일 수도 있어요.

이 모듈은 여기 제공된 함수들을 쓰는 데 필요한 모든 상수도 정의해요. 이 상수들은 C에서의 대응 상수와 같은 이름을 가져요. 이런 터미널 제어 인터페이스를 쓰는 방법에 대한 자세한 내용은 시스템 문서를 참고하세요.

출처: Python 표준 라이브러리

본문

termios.tcgetattr(fd) — 파일 디스크립터 fd에 대한 tty 속성들을 담은 리스트를 다음과 같이 반환해요: [iflag, oflag, cflag, lflag, ispeed, ospeed, cc]. 여기서 cc는 tty 특수 문자들의 리스트이고(각각 길이 1짜리 문자열. 단, VMINVTIME 인덱스의 항목들은 이 필드들이 정의되어 있을 때 정수예요). 플래그·속도의 해석과 cc 배열의 인덱싱은 반드시 termios 모듈에 정의된 심볼릭 상수들로 해야 해요.

termios.tcsetattr(fd, when, attributes)tcgetattr()이 반환하는 것 같은 리스트인 attributes로 파일 디스크립터 fd의 tty 속성을 설정해요. when 인자는 속성이 언제 바뀔지 결정해요:

  • termios.TCSANOW — 속성을 즉시 바꿔요.
  • termios.TCSADRAIN — 큐에 쌓인 출력을 모두 전송한 뒤 속성을 바꿔요.
  • termios.TCSAFLUSH — 큐에 쌓인 출력을 모두 전송하고 큐에 쌓인 입력을 모두 버린 뒤 속성을 바꿔요.

termios.tcsendbreak(fd, duration) — 파일 디스크립터 fd에 break를 보내요. duration이 0이면 0.25~0.5초 동안 break를 보내고, 0이 아니면 시스템에 따라 의미가 달라져요.

termios.tcdrain(fd) — 파일 디스크립터 fd에 쓴 모든 출력이 전송될 때까지 기다려요.

termios.tcflush(fd, queue) — 파일 디스크립터 fd에 큐에 쌓인 데이터를 버려요. queue 선택자가 어떤 큐인지 지정해요: TCIFLUSH는 입력 큐, TCOFLUSH는 출력 큐, TCIOFLUSH는 둘 다.

termios.tcflow(fd, action) — 파일 디스크립터 fd의 입력 또는 출력을 일시 중단하거나 재개해요. action 인자는 출력을 일시 중단하는 TCOOFF, 출력을 재개하는 TCOON, 입력을 일시 중단하는 TCIOFF, 입력을 재개하는 TCION일 수 있어요.

termios.tcgetwinsize(fd) — 파일 디스크립터 fd에 대한 tty 창 크기를 담은 튜플 (ws_row, ws_col)을 반환해요. termios.TIOCGWINSZ 또는 termios.TIOCGSIZE가 필요해요. (버전 3.11에 추가됨.)

termios.tcsetwinsize(fd, winsize)tcgetwinsize()가 반환하는 것 같은 두 항목 튜플 (ws_row, ws_col)winsize로 파일 디스크립터 fd의 tty 창 크기를 설정해요. (termios.TIOCGWINSZ, termios.TIOCSWINSZ) 또는 (termios.TIOCGSIZE, termios.TIOCSSIZE) 쌍 중 적어도 하나가 정의되어 있어야 해요. (버전 3.11에 추가됨.)

더 알아보기

  • tty — 일반적인 터미널 제어 동작을 위한 편의 함수들.

예제

에코를 끈 상태에서 비밀번호를 입력받는 함수를 볼게요. 별도의 tcgetattr() 호출과 tryfinally 문을 써서 어떤 일이 있어도 이전 tty 속성이 정확히 복원되도록 하는 기법을 주목하세요.

def getpass(prompt="Password: "):
    import termios, sys
    fd = sys.stdin.fileno()
    old = termios.tcgetattr(fd)
    new = termios.tcgetattr(fd)
    new[3] = new[3] & ~termios.ECHO          # lflags
    try:
        termios.tcsetattr(fd, termios.TCSADRAIN, new)
        passwd = input(prompt)
    finally:
        termios.tcsetattr(fd, termios.TCSADRAIN, old)
    return passwd