[Python 모듈] sys : 인터프리터를 제어하는 모듈

 

 


1. sys 모듈이란?

 

sys 라이브러리는 파이썬 인터프리터를 제어하는 데 사용되는 기본 모듈 중 하나입니다. 이 모듈을 사용하면 다음과 같은 작업을 수행할 수 있습니다. (인터프리터는 코드를 작성하고 실행하는데 필수적인 도구입니다.)

 

  • 인터프리터의 동작 제어
  • 인터프리터의 종료
  • 시스템 정보 확인
  • 입출력 제어
  • 시스템 호출 제어
  • 예외 처리 제어

 

sys모듈은 별도의 설치 과정이 필요없습니다. 모듈을 사용하려면 아래와 같이 import를 하면 됩니다.

 

import sys

 


2.sys에서 가장 많이 사용하는 함수

2.1. sys.argv 함수

 

sys.argv 함수는 명령행 인자를 읽어올 때 사용됩니다. 아래 코드는 sys.argv변수를 사용하여 명령행 인자를 가져오고, 반복문을 사용하여 인자를 출력하는 코드입니다. sys.argv 변수는 프로그램 이름을 포함한 명령행 인자 리스트를 반환합니다. 따라서 for 반복문에서는 첫 번째 요소는 프로그램 이름이 되며, 이후 요소들은 명령행 인자가 됩니다.

import sys

# 명령행 인자 출력
print("명령행 인자:")
for arg in sys.argv:
    print(arg)

 

터미널에 명령어 뒤에 인자를 추가하여 실행하면, 프로그램에서는 sys.argv 변수를 사용하여 명령행 인자를 가져올 수 있습니다. 

$ python example.py arg1 arg2 arg3

 

위의 코드를 실행하면 아래와 같은 결과가 출력됩니다.

명령행 인자:
example.py
arg1
arg2
arg3

 


2.2 sys.exit 함수

 

sys.exit 함수는 인터프리터를 종료하는 데 사용됩니다. 이 함수는 프로그램이 정상적으로 종료되었는지, 아니면 오류가 발생하여 강제종료되었는지를 확인할 수 있습니다. 아래 코드에서는 sys.exit() 함수를 사용하여 프로그램을 종료합니다. 이 함수는 인자로 종료 코드를 전달할 수도 있는데, 종료 코드는 일반적으로 0이면 정상적으로 종료되었음을 나타내고, 그 외의 값이면 비정상적으로 죵료되었음을 나타냅니다. 

 

sys.exit() 함수는 프로그램에서 오류가 발생하거나 예외가 발생했을 때, 즉시 프로그램을 종료하기 위해 사용될 수도 있습니다. 이 경우 sys.exit() 함수를 호출하기 전에 예외 처리 코드를 작성하여 오류를 처리하고, 그 외의 경우에는 sys.exit() 함수를 사용하여 프로그램을 종료합니다.

import sys

# 사용자 입력 받기
value = input("정수를 입력하세요: ")

# 입력받은 값이 정수가 아니면 프로그램 종료
if not value.isdigit():
    print("입력값이 정수가 아닙니다.")
    sys.exit()

# 입력받은 값을 정수로 변환하여 출력
value = int(value)
print(f"입력한 값: {value}")

 


2.3 sys.path 함수

 

sys.path 함수는 모듈을 찾는 경로를 나타내는 리스트입니다. 이 함수를 사용하여 파이썬 모듈을 추가할 수 있습니다. 아래 코드에서는 sys.path 리스트를 사용하여 파이썬 모듈을 검색하는 경로를 출력하였습니다. for 반복문을 사용하여 경로를 하나씩 출력합니다.



sys.path는 모듈을 검색하는 경로를 지정하는데 사용됩니다. 예를 들어, 모듈을 불러올 때, 파이썬은 sys.path 리스트에 있는 경로를 검색하여 해당 모듈이 있는지 확인합니다. 따라서, sys.path 리스트에 원하는 경로를 추가하면, 해당 경로에서 모듈을 불러올 수 있습니다.



sys.path 리스트는 일반적으로 파이썬 인터프리터가 시작될 때, 자동으로 초기화됩니다. 그러나 프로그램에서 sys.path.append() 함수를 사용하여 리스트에 경로를 추가할 수도 있습니다. 이렇게 추가된 경로는 프로그램이 실행되는 동안에만 유지되며, 프로그램 종료 후에는 초기화됩니다. 
append()함수를 사용해 경로를 추가하여 /home/user/my_module를 import할 수 있게 됩니다.

import sys
#append를 이용해 /user 디렉터리를 추가해 my_module를 import
sys.path.append('/home/user')
import my_module

# sys.path에 있는 경로 출력
print("sys.path:")
for path in sys.path:
    print(path)

 


2.4 sys.stdin, sys.stdout, sys.stderr 함수

 

sys.stdin, sys.stdout, sys.stderr 함수는 각각 표준 입력, 표준 출력, 표준 에러를 나타내는 파일 객체입니다. 이 함수를 사용하여 입출력을 제어할 수 있습니다.

 


sys.stdin: 표준 입력을 다루는 객체입니다. 이 객체는 파일 객체와 유사하게 동작하여 read(), readline(), readlines() 등의 메소드를 제공합니다. 기본적으로 키보드 입력이 표준 입력으로 처리됩니다. 아래 코드에서 sys.stdin을 for 반복문에서 사용하여 한 줄씩 입력을 읽어들이고, 이를 print 함수를 사용해 출력합니다. 코드를 실행하면 사용자가 입력한 내용을 한 줄씩 읽어들여 출력합니다. Ctrl-D를 입력하면 입력을 끝내고 반복문을 종료할 수 있습니다.

import sys

# 한 줄씩 입력 받아 출력하는 예시
for line in sys.stdin:
    print(line)

 


sys.stdout은 파이썬에서 표준 출력을 수행하는 파일 객체입니다. 아래 코드에서는 sys.stdout.write() 함수를 사용하여 Hello, World! 문자열을 출력하였습니다. 이때 write() 함수는 문자열을 출력하지만 자동으로 줄바꿈을 하지 않기 때문에, 문자열 마지막에 \n을 추가하여 줄바꿈을 해줘야 합니다.

import sys

# 표준 출력으로 출력하기
sys.stdout.write("Hello, World!\n")

 


sys.stderr: 표준 오류 출력을 다루는 객체입니다. 이 객체는 오류 메시지를 출력할 때 사용됩니다. 기본적으로 콘솔 출력이 표준 오류 출력으로 처리됩니다. 아래 코드에서는 try-except 문을 사용하여 예외를 처리하고, sys.stderr.write() 함수를 사용하여 오류 메시지를 출력하였습니다. 이때, 오류 메시지는 표준 오류 출력으로 처리됩니다. (표준 오류 출력은 표준 출력과 달리 오류 메시지를 출력하기 위한 별도의 채널이다. 때문에, 오류 메시지가 표준 출력과 섞이지 않고 따로 출력됩니다.)

import sys

# 표준 오류 출력으로 오류 메시지 출력하기
try:
    result = 1 / 0
except Exception as e:
    sys.stderr.write(f"오류 발생: {e}\n")

 


2.5 sys.platform 함수

 

sys.platform 함수는 현재 실행 중인 시스템의 플랫폼을 나타내는 문자열입니다. 아래 코드에서는 sys.platform 변수를 사용하여 현재 플랫폼의 이름을 가져옵니다. 이때, 반환되는 값은 각 운영체제별로 다릅니다. 일반적으로 다음과 같은 값이 반환됩니다. sys.platform 변수를 사용하여 플랫폼을 확인하면, 해당 플랫폼에서만 실행할 수 있는 기능을 처리하는 등, 플랫폼마다 다른 동작을 구현할 수 있습니다.

 

  • win32: Windows 운영체제
  • darwin: macOS 운영체제
  • linux: Linux 운영체제

 

import sys

# 현재 플랫폼 확인
platform = sys.platform
print(f"현재 플랫폼: {platform}")

 



2.6 sys.version 함수

 

sys.version은 현재 파이썬 인터프리터의 버전 정보를 담은 문자열입니다. 이 변수를 사용하여 현재 파이썬 버전을 확인할 수 있습니다. 아래 코드에서는 sys.version 변수를 사용하여 현재 파이썬 버전 정보를 가져옵니다. 

import sys

# 현재 파이썬 버전 확인
version = sys.version
print(f"현재 파이썬 버전: {version}")

 

이때, 반환되는 값은 아래와 같은 형식으로 구성됩니다. 파이썬 버전 정보는 프로그램 실행 시 필요한 라이브러리나 모듈의 호환성을 확인하는 등, 다양한 용도로 사용될 수 있습니다.

Python 3.9.7 (default, Sep  3 2021, 13:49:51) 
[GCC 10.2.1 20210110]

 

 


2.7 sys.getsizeof 함수

 

sys.getsizeof()는 객체의 크기를 바이트 단위로 반환하는 함수입니다. 이 함수를 사용하여 객체의 메모리 사용량을 계산할 수 있습니다.   이를 통해 프로그램이 사용하는 메모리 양을 파악하고, 메모리 누수나 성능 이슈를 예방할 수 있습니다. 다만, 이 함수는 객체가 차지하는 메모리 크기만을 계산하기 때문에, 객체 내에 포함된 참조 객체 등의 메모리 사용량은 고려하지 않습니다. 따라서, 정확한 메모리 사용량을 계산하려면 다른 방법을 사용해야 합니다.

 

아래 코드에서는 sys.getsizeof() 함수를 사용하여 리스트 객체의 크기를 계산하였습니다. 이때, 반환되는 값은 해당 객체가 차지하는 메모리 크기입니다. 

import sys

# 리스트 객체의 크기 계산
my_list = [1, 2, 3, 4, 5]
size = sys.getsizeof(my_list)
print(f"리스트 객체의 크기: {size} bytes")

 


2.8 sys.getdefaultencoding 함수

 

sys.getdefaultencoding()은 파이썬의 문자열 인코딩 방식을 반환하는 함수입니다. 파이썬의 문자열 인코딩 방식은 파일 입출력, 네트워크 통신 등 다양한 상황에서 중요한 역할을 합니다. 따라서, 프로그램에서 문자열 처리를 할 때에는 인코딩 방식을 명시적으로 지정하여 오류를 방지하는 것이 좋습니다.

 

아래 코드에서는 sys.getdefaultencoding() 함수를 사용하여 파이썬의 기본 문자열 인코딩 방식을 가져옵니다. 이때, 반환되는 값은 일반적으로 utf-8 또는 cp949 등의 인코딩 방식입니다.

import sys

# 기본 인코딩 방식 출력
encoding = sys.getdefaultencoding()
print(f"기본 인코딩 방식: {encoding}")

 


2.9 sys.getfilesystemencoding 함수

 

sys.getfilesystemencoding()은 현재 파일 시스템의 인코딩 방식을 반환하는 함수입니다. 파일 시스템의 인코딩 방식은 파일 이름이나 경로명을 처리할 때 중요한 역할을 합니다. 따라서, 파일 이름이나 경로명을 다룰 때에는 인코딩 방식을 명시적으로 지정하여 오류를 방지하는 것이 좋습니다.

 

아래 코드에서는 sys.getfilesystemencoding() 함수를 사용하여 현재 파일 시스템의 인코딩 방식을 가져옵니다. 이때, 반환되는 값은 운영체제별로 다르며, 일반적으로 utf-8, cp949, cp1252 등의 인코딩 방식이 사용됩니다.

import sys

# 파일 시스템 인코딩 방식 출력
encoding = sys.getfilesystemencoding()
print(f"파일 시스템 인코딩 방식: {encoding}")

 


2.10 sys.getrefcount 함수

 

sys.getrefcount() 함수는 객체의 참조 횟수를 계산하는데 사용됩니다. 이를 통해 객체가 얼마나 많은 곳에서 참조되고 있는지 파악할 수 있습니다. 하지만 이 함수는 해당 객체의 참조 횟수를 계산하기 위해 추가적인 참조를 만들기 때문에, 실제 참조 횟수보다 큰 값을 반환할 수 있습니다. 따라서, 이 함수는 참조 횟수를 정확하게 파악하기 위한 목적으로 사용하기보다는 객체가 제대로 해제되고 있는지를 확인하기 위한 용도로 주로 사용됩니다.

 

아래 코드에서는 sys.getrefcount() 함수를 사용하여 리스트 객체의 참조 횟수를 계산하였습니다. 이때, 반환되는 값은 해당 객체를 참조하는 변수의 개수를 의미합니다.

import sys

# 리스트 객체의 참조 횟수 출력
my_list = [1, 2, 3, 4, 5]
count = sys.getrefcount(my_list)
print(f"리스트 객체의 참조 횟수: {count}")

 


2.11 sys.setrecursionlimit 함수

 

sys.setrecursionlimit()는 파이썬에서 재귀 호출의 최대 깊이를 설정하는 함수입니다. 재귀 호출이 깊이가 깊어지면, 스택 오버플로우(Stack Overflow) 오류가 발생할 수 있습니다. 이를 방지하기 위해 sys.setrecursionlimit() 함수를 사용하여 재귀 호출의 최대 깊이를 조정할 수 있습니다. 다만, 최대 깊이를 너무 높게 설정하면, 메모리 사용량이 증가하여 프로그램의 성능이 저하될 수 있습니다. 따라서, 최대 깊이를 설정할 때에는 적절한 값을 선택하는 것이 중요합니다.

 

아래 코드에서는 sys.setrecursionlimit() 함수를 사용하여 재귀 호출의 최대 깊이를 10000으로 설정하였습니다. 이후 recursive_func() 함수를 정의하고, 재귀 호출을 수행하였습니다. 

import sys

# 재귀 호출의 최대 깊이 설정
sys.setrecursionlimit(10000)

# 재귀 함수 정의
def recursive_func(n):
    if n == 0:
        return
    recursive_func(n-1)

# 재귀 함수 호출
recursive_func(10000)

 


2.12 sys.exc_info 함수

 

sys.exc_info()는 현재 발생한 예외에 대한 정보를 반환하는 함수입니다. 이때, 반환되는 값은 예외 타입, 예외 메시지, 예외 추적 정보로 구성된 튜플입니다. 이 함수를 사용하여 예외 정보를 가져와 로그를 작성하거나, 예외 처리 로직을 작성하는 등 다양한 용도로 활용할 수 있습니다.

 

아래 코드에서는 raise_exception() 함수를 이용해 예외를 발생시키고 있습니다. 예외가 발생하면, sys.exc_info() 함수를 사용하여 예외 정보를 가져와 출력합니다.

import sys

# 예외를 발생시키는 함수 정의
def raise_exception():
    x = 1 / 0

try:
    raise_exception()
except:
    # 예외 정보 출력
    exc_type, exc_value, exc_traceback = sys.exc_info()
    print(f"예외 타입: {exc_type}")
    print(f"예외 메시지: {exc_value}")
    print(f"예외 추적 정보: {exc_traceback}")

 


2.13 sys.getrecursionlimit 함수

 

sys.getrecursionlimit()은 파이썬에서 재귀 호출의 최대 깊이를 반환하는 함수입니다. 이를 통해 재귀 호출이 얼마나 깊어질 수 있는지 파악할 수 있습니다. 하지만, 최대 깊이를 높게 설정하는 것은 메모리 사용량이 증가하여 프로그램의 성능이 저하될 수 있습니다. 따라서, 최대 깊이를 확인할 때에는 적절한 값을 선택하는 것이 중요합니다.

 

아래 코드에서는 sys.getrecursionlimit() 함수를 사용하여 현재 설정된 재귀 호출의 최대 깊이를 가져와 출력하고 있습니다.

import sys

# 현재 설정된 재귀 호출의 최대 깊이 출력
limit = sys.getrecursionlimit()
print(f"현재 재귀 호출의 최대 깊이: {limit}")