Python의 pty 모듈은 의사 터미널(Pseudo-Terminal) 개념을 다루기 위해 정의된 유틸리티 모듈입니다. 이 모듈을 활용하면 새로운 프로세스를 시작하거나, 프로그램을 통해 제어 터미널(controlling terminal)에서 데이터를 읽고 쓰는 작업을 수행할 수 있습니다.
pty 모듈의 플랫폼 제약
pty 모듈은 플랫폼에 크게 의존적인 특성을 가지고 있습니다. 따라서 의사 터미널 관련 작업을 수행하려면 반드시 UNIX 계열 시스템(Linux, macOS 등) 환경에서 실행해야 합니다. Windows에서는 해당 모듈을 사용할 수 없습니다.
pty 모듈을 사용하려면 먼저 아래와 같이 임포트해야 합니다.
import pty
pty 모듈의 주요 메서드
1. pty.fork()
이 메서드는 자식 프로세스의 제어 터미널을 의사 터미널에 연결하는 역할을 합니다. 반환값으로 pid(프로세스 ID)와 fd(파일 디스크립터)를 돌려줍니다.
- 자식 프로세스는 pid로 0을 받으며, fd는 유효하지 않습니다.
- 부모 프로세스는 자식 프로세스의 pid를 받고, fd에는 자식의 제어 터미널이 저장됩니다.
2. pty.openpty()
새로운 의사 터미널 쌍(pseudo-terminal pair)을 생성하는 메서드입니다. 호출 결과로 마스터(master)와 슬레이브(slave) 각각에 대한 파일 디스크립터를 반환합니다.
3. pty.spawn(argv[, master_read[, stdin_read]])
spawn 메서드는 현재 프로세스의 표준 입출력(stdio)을 제어 터미널과 연결하는 데 사용됩니다. 선택적으로 master_read와 stdin_read 함수를 전달하여 파일 디스크립터에서 데이터를 읽어올 수 있으며, 기본 읽기 버퍼 크기는 1024바이트입니다.
예제 코드
아래 예제는 pty.fork()와 pty.openpty()를 활용하여 프로세스 ID와 의사 터미널 이름을 확인하는 방법을 보여줍니다.
import pty, os
def process_parent_child():
(process_id, fd) = pty.fork()
print("현재 프로세스의 PID: " + str(os.getpid()))
print("자식 프로세스의 PID: " + str(process_id))
process_parent_child()
master, slave = pty.openpty()
print('마스터 터미널 이름: ' + str(os.ttyname(master)))
print('슬레이브 터미널 이름: ' + str(os.ttyname(slave)))실행 결과
현재 프로세스의 PID: 12508 자식 프로세스의 PID: 12509 마스터 터미널 이름: /dev/ptmx 슬레이브 터미널 이름: /dev/pts/2
실행 결과에서 볼 수 있듯이, fork() 호출 후 부모와 자식 프로세스가 서로 다른 PID를 가지며, openpty()를 통해 생성된 마스터(/dev/ptmx)와 슬레이브(/dev/pts/2) 터미널의 실제 경로도 확인할 수 있습니다. 이러한 기능은 SSH 클라이언트, 자동화 스크립트, 터미널 에뮬레이터처럼 터미널 상호작용이 필요한 프로그램을 개발할 때 유용하게 활용됩니다.