ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [Python] sys 표준 라이브러리: 인터프리터, 경로, 입출력 제어
    업무 자동화/Python 2025. 11. 29. 09:36

    1. sys 모듈은 무엇인가?

    1-1. 정의

    • sys파이썬 인터프리터 자체와 관련된 각종 정보와 기능을 제공하는 표준 라이브러리입니다.
    • 대표적으로 아래와 같은 기능을 제공합니다.
      • 실행 인자 접근 (sys.argv)
      • 종료 코드 반환 (sys.exit)
      • 모듈 검색 경로 (sys.path)
      • 표준 입출력 스트림 접근 (sys.stdin, sys.stdout, sys.stderr)
      • 버전, 플랫폼, 기본 인코딩 등 환경 정보 조회

    1-2. 설치는 필요할까? (Windows / Linux 공통)

    • sys는 파이썬에 기본 내장된 모듈로, 따로 설치할 필요가 없습니다.
    • 어느 OS에서나 다음처럼 바로 import 해서 사용합니다.
    import sys
    
    print(sys.version)

     

    2. 커맨드라인 인자 처리: sys.argv

    스크립트를 CLI(커맨드라인)에서 실행할 때 인자를 전달받는 기본적인 방법입니다.

    python myscript.py input.csv output.csv
    # myscript.py
    import sys
    
    print(sys.argv)

    실행 결과 예시:

    ['myscript.py', 'input.csv', 'output.csv']
    • sys.argv[0] : 스크립트 이름
    • sys.argv[1] 이후 : 사용자가 전달한 인자

    2-1. 간단한 예시: 입력 파일과 출력 파일 받기

    # csv_copy.py
    import sys
    import shutil
    
    if len(sys.argv) != 3:
        print("사용법: python csv_copy.py <입력파일> <출력파일>")
        sys.exit(1)
    
    src = sys.argv[1]
    dst = sys.argv[2]
    
    shutil.copy(src, dst)
    print(f"{src} -> {dst} 복사 완료")
    • CLI 도구를 만들 때, sys.argv만으로도 간단한 인자 처리가 가능합니다.
    • 더 복잡한 인자 처리는 argparse와 함께 쓰는 것이 좋습니다.

     

    3. 프로그램 종료와 종료 코드: sys.exit

    3-1. 정상 종료 / 비정상 종료

    import sys
    
    if some_error_condition:
        print("에러 발생, 종료합니다.")
        sys.exit(1)   # 0이 아닌 값은 보통 '실패' 의미
    
    # 정상 종료
    sys.exit(0)
    • sys.exit() 를 호출하면 SystemExit 예외를 발생시키면서 프로그램을 종료합니다.
    • 관례상
      • 0 : 성공
      • 1 이상 : 실패/에러
    • 종료 코드는 셸/다른 프로세스에서 확인할 수 있습니다.

    3-2. try/except와 함께 사용

    import sys
    
    try:
        # 처리 코드
        ...
    except Exception as e:
        print("예상치 못한 에러:", e)
        sys.exit(1)
    • 스크립트를 다른 시스템에서 호출할 때, 종료 코드를 기준으로 성공/실패 판단이 가능합니다.

     

    4. 모듈 검색 경로: sys.path

    파이썬이 import 할 수 있는 모듈을 어디서 찾는지 나타내는 리스트입니다.

    import sys
    
    for p in sys.path:
        print(p)
    • 요소 예시
      • 현재 프로젝트 디렉터리
      • 표준 라이브러리 경로
      • site-packages 디렉터리 등

    4-1. 동적으로 경로 추가하기 (주의해서 사용)

    import sys
    from pathlib import Path
    
    extra = Path(__file__).parent / "libs"
    sys.path.append(str(extra))
    
    import my_local_lib  # libs 폴더 아래에 있는 모듈
    • 테스트용/간단 스크립트에서는 유용하지만,
      • 대형 프로젝트에서는 패키지 구조를 재정리하거나, 가상 환경 + 설치 방식을 추천합니다.

     

    5. 표준 입출력 스트림: stdin, stdout, stderr

    5-1. 기본 개념

    • sys.stdin : 표준 입력 (보통 키보드, 또는 파이프 입력)
    • sys.stdout : 표준 출력 (화면에 보이는 출력)
    • sys.stderr : 에러 출력 (로그/에러 메시지 전용)
    import sys
    
    sys.stdout.write("일반 메시지\n")
    sys.stderr.write("에러 메시지\n")

    5-2. 파이프와 함께 사용하기

    예를 들어, 다른 명령어 출력 결과를 파이썬으로 읽어 처리할 수 있습니다.

    cat data.txt | python process.py
    # process.py
    import sys
    
    for line in sys.stdin:
        line = line.strip()
        if not line:
            continue
        print("처리:", line)
    • 셸 스크립트/파이프라인 안에서 유연하게 연결할 수 있습니다.

     

    6. 파이썬 버전과 환경 정보

    6-1. sys.version, sys.version_info

    import sys
    
    print(sys.version)       # 전체 버전 문자열
    print(sys.version_info)  # (major, minor, micro, ...) 튜플

    예시:

    3.11.2 (main, ...) [GCC 11.2.0]
    sys.version_info(major=3, minor=11, micro=2, releaselevel='final', serial=0)

    버전에 따라 다른 코드를 실행할 수도 있습니다.

    import sys
    
    if sys.version_info < (3, 10):
        print("Python 3.10 이상에서 동작하는 기능이 필요합니다.")
        sys.exit(1)

    6-2. sys.platform

    import sys
    
    print(sys.platform)
    • 예시 값
      • "win32" : Windows
      • "linux" : Linux
      • "darwin" : macOS

    간단한 OS 분기에 사용할 수 있습니다.

    import sys
    from pathlib import Path
    
    if sys.platform == "win32":
        base = Path("C:/data")
    else:
        base = Path("/data")
    
    print("기준 폴더:", base)

     

    7. 메모리 관련 / 한계 설정 유틸

    7-1. sys.getsizeof()

    파이썬 객체의 대략적인 메모리 사용량(바이트) 을 반환합니다.

    import sys
    
    data = [1, 2, 3, 4, 5]
    print(sys.getsizeof(data))    # 리스트 객체 자체 크기
    print(sys.getsizeof(data[0])) # 원소 하나의 크기
    • 정확한 전체 메모리 사용량은 아니지만, 상대적인 비교에는 도움이 됩니다.

    7-2. 재귀 한계: getrecursionlimit, setrecursionlimit

    import sys
    
    print(sys.getrecursionlimit())  # 보통 1000 근처
    
    sys.setrecursionlimit(2000)     # 재귀 허용 깊이 늘리기 (주의)
    • 너무 크게 설정하면 스택 오버플로우 / 프로그램 크래시 위험이 있으니 주의해야 합니다.
    • 재귀 알고리즘 대신 반복문/스택 구조로 바꾸는 것이 더 안전한 경우가 많습니다.

     

    8. 기타 자주 쓰이는 속성/함수

    8-1. sys.getdefaultencoding()

    import sys
    
    print(sys.getdefaultencoding())  # 보통 'utf-8'
    • 파이썬 내부 기본 문자열 인코딩을 확인할 수 있습니다.

    8-2. sys.modules

    현재 로드된 모듈들을 담고 있는 딕셔너리입니다.

    import sys
    
    print(list(sys.modules.keys())[:10])
    • 직접 수정하는 것은 권장되지 않지만,
      • 동적 임포트 상황 디버깅 등에 참고용으로 사용할 수 있습니다.

    8-3. sys.executable

    import sys
    
    print(sys.executable)
    • 현재 사용 중인 파이썬 인터프리터의 실행 파일 경로를 반환합니다.
    • 가상 환경/여러 버전이 섞여 있는 환경에서 디버깅할 때 유용합니다.

     

    9. 실무 예시

    9-1. 간단한 CLI 스크립트 템플릿

    # cli_template.py
    import sys
    
    def main(argv):
        if len(argv) < 2:
            print("사용법: python cli_template.py <이름>")
            return 1
    
        name = argv[1]
        print(f"안녕, {name}!")
        return 0
    
    if __name__ == "__main__":
        code = main(sys.argv)
        sys.exit(code)
    • main() 함수에 로직을 작성하고,
    • 마지막에 sys.exit()에 반환 코드를 넘기는 패턴은 실무에서 자주 쓰입니다.

    9-2. 플랫폼별 경로 처리 + 버전 체크

    import sys
    from pathlib import Path
    
    if sys.version_info < (3, 8):
        print("Python 3.8 이상에서 실행해주세요.")
        sys.exit(1)
    
    if sys.platform == "win32":
        base = Path("C:/logs")
    else:
        base = Path("/var/log/myapp")
    
    base.mkdir(parents=True, exist_ok=True)
    print("로그 디렉터리:", base)

     

    10. 정리

    • sys파이썬 인터프리터와 실행 환경을 제어하는 관문 같은 모듈
    • 주요 기능 요약
      • sys.argv : 커맨드라인 인자
      • sys.exit : 종료 코드 반환
      • sys.path : 모듈 검색 경로
      • sys.stdin / sys.stdout / sys.stderr : 표준 입출력 스트림
      • sys.version, sys.platform : 버전/플랫폼 정보
      • sys.getsizeof, sys.getrecursionlimit, sys.setrecursionlimit : 메모리/한계 관련
    • 설치는 필요 없고, OS에 상관없이 동일한 방식으로 사용할 수 있습니다.

    sys는 “사용자 코드와 인터프리터 사이의 접점” 같은 느낌이라,
    한 번 익혀두면 CLI 도구, 스크립트 자동화, 환경 진단 등에 두루 활용할 수 있습니다.

Designed by Tistory.