파이썬에서 다들 sys 모듈을 사용해서 입력받길래, 나도 기능들이 좀 궁금해서 기록해보고자 함
1. sys 모듈이란?
- 파이썬 표준 라이브러리 중 하나로, 시스템 특정 파라미터와 함수에 접근할 수 있게 해줌
- ex) 명령 줄 인수, 표준 입출력 및 에러 스트림 제어 가능
- 특히 스크립트 실행 환경 제어 및 개선에 유용
대화형 프롬프트 변경 : sys.ps1
위와 같이 sys.ps1()을 통해 현재 프롬프트를 변경할 수 있다.
원래 >>> 로 되어 있었던 프롬프트가 ^&^ 로 바꿔진 것을 볼 수 있다.
명령 줄 인수 전달 : sys.argv
파이썬으로 작성된 파일을 실행할 때 인수(argument)를 담아서 처리해주는 기능을 한다.
예시를 통해 알아보자.
import sys
print(sys.argv) # 인자 전체
print(sys.argv[0]) # 명령어
print(sys.argv[1]) # 명령어의 첫 번째 인자
print(sys.argv[2]) # 명령어의 두 번째 인자
print(len(sys.argv)) # 전체 인자의 개수
print(len(sys.argv[1:])) # 명령어의 총 인자 개수
이렇게 위와 같이 practice.py라는 파이썬 파일을 작성했을 때, 이를 command에서 인자값과 함께 입력하면
이렇게 각각에 대한 값이 출력되어 나온다.
sys.argv를 출력한 값은 ['practice.py', 'apple', 'banana'] 가 나오는데,
리스트의 첫 번째 요소는 해당 파일명이 들어가고, 인자값은 sys.argv[1]부터 순서대로 들어가는 것을 볼 수 있다.
즉, 이를 이용해서 입력한 인자값들을 인덱스로 자유롭게 추출할 수 있게 된다.
스크립트 종료 : sys.exit
import sys
sys.exit()
말 그대로 프로그램을 종료시키는 역할을 한다.
표준 입출력 : sys.stdin / sys.stdout / sys.stderr
1. sys.stdin (Standard Input : 표준 입력)
- 사용자가 입력하는 데이터를 읽는 데에 사용됨
- 일반적으로 input() 함수가 sys.stdin을 사용하여 입력을 읽음
import sys
print("Enter some text: ", end="")
input_text = sys.stdin.read() # EOF (Ctrl+Z on Windows)까지 읽음
print("You entered:", input_text)
띄어쓰기, 엔터와 상관 없이 사용자가 입력한 모든 텍스트를 읽을 수 있으며, EOF 문자를 입력해야 종료된다.
2. sys.stdout (Standard Output : 표준 출력)
- 프로그램 수행 과정에서 현재 수행하고 있는 작업에 대한 여러 정보를 가지는 로그
- 즉 데이터를 화면에 출력하는데 사용됨
- 일반적으로 print() 함수가 sys.stdout을 사용하여 출력함
import sys
sys.stdout.write("Hello, World!\n") # print() 대신 사용
3. sys.stderr (Standard Error : 표준 에러)
- 에러 메시지를 출력하는 데 사용
- 일반적으로 오류 메시지를 sys.stderr로 출력하면 표준 출력과는 별도로 처리 가능
import sys
try:
result = 10 / 0
except ZeroDivisionError as e:
sys.stderr.write(f"Error: {e}\n")
# 결과: Error: division by zero
위 예제에서는 ZeroDivisionError가 발생했을 때, 오류 메시지를 sys.stderr로 출력한다.
일반적인 출력을 방해하지 않고 에러 미시지를 출력하는 방법이다.
여기서 의문이 듦.
sys.stdin과 input(), 그리고 sys.stdout과 print() 는 각각 서로 기능이 같은데 그럼 무슨 차이인가?
두 함수는 모두 기능적으로는 비슷하지만, 사용성과 성능 측면에서 차이점이 존재한다.
sys.stdin vs input()
input() 함수
- 사용자가 한 줄 입력을 할 때까지 기다렸다가 입력 반환
- 프롬프트 문자열을 출력
- 내부적으로 sys.stdin 사용
sys.stdin
- 표준 입력 스트림을 통해 데이터를 직접 읽을 수 있음
- read(), readline(), readlines() 메소드를 사용해서 입력을 읽음
- 대량의 입력을 처리하거나 입력을 효율적으로 관리해야 할 때 유용
sys.stdout vs print()
print() 함수
- 표준 출력에 문자열을 출력
- 내부적으로 sys.stdout을 사용
- 자동으로 줄바꿈을 추가하며, sep, end 와 같은 다양한 옵션 제공
sys.stdout
- 표준 출력 스트림을 통해 데이터를 직접 출력
- write() 메소드를 사용해서 출력
- 출력 형식을 세밀하게 제어하거나 버퍼를 관리할 때 유용
- 대부분의 경우엔 input()과 print() 함수가 사용하기 쉽고, 읽기 쉬운 코드를 작성하는 데 더 적합함
- 그러나 대량의 입력을 한 번에 읽거나, 출력 버퍼링을 직접 제어해야 하는 경우, sys 모듈의 표준 입출력 스트림을 사용하는 것이 더 효율적일 수 있음
따라서 백준같은 코딩테스트 문제를 풀 때, 몇 줄 입력 받는 문제들과는 달리 반복문으로 여러 줄을 입력 받을 때 input()을 사용하는 경우 가끔 시간 초과 에러가 발생하여 실패하곤 한다.
이 때 sys.stdin.readline()을 사용한다면 시간을 절약할 수 있다!
'Python' 카테고리의 다른 글
[백준/Python] 10773 : 제로 (0) | 2024.07.29 |
---|---|
[백준/Python] 14425 : 문자열 집합 (0) | 2024.07.23 |
[백준/Python] 10828 : 스택 (0) | 2024.07.22 |
[백준/Python] 1436 : 영화감독 숌 (0) | 2024.07.17 |
[백준/Python] 14501 : 퇴사 (0) | 2024.07.17 |