본문 바로가기

진리는어디에/Python

[Python] 모듈(module)

이번 포스트에서는 코드 재사용의 끝판왕 '모듈(module)'에 대해 살펴보겠다. 정확한 사용법을 언급하진 않았지만 지금까지 예제들에서도 이미 많이 써왔던 것이라 큰 거부감은 없을 것이라 생각 한다. 가벼운 마음으로 읽고 넘어 가도록 하자.

파이썬 모듈 임포트

만일 여러분이 어떤 함수를 정말 잘 만들었다고 가정하자. 그럼 이 함수를 다른 파이썬 프로그램에서도 가져다 사용하고 싶은데 어떻게 해야 할까?

지금까지 여러분이 표준 파이썬 모듈을 임포트(import) 했던 것과 똑같이 사용 할 수 있다. 예를 들어 아래와 같이 여러분은  'mylib.py'라는 파이썬 파일을 만들고 그 안에 함수를 작성했다고 가정하자.

# file: mylib.py

def add(a, b) :
    return a + b

def mul(a, b) :
    return a * b

이 모듈을 임포트하는 것은 표준 모듈을 임포트 하는 것과 동일하다. import를 통해 해당 파일에 있는 모든 것을 한번에 가져 올 수 있고, from ... import ... 를 통해 필요한 것들만 골라서 가져 올 수 있다.

  • import 모듈이름(확장자를 제외한 파일 이름)
    모듈(파일) 전체를 가져온다. 모듈 내에 있는 함수나 클래스를 사용하기 위해선 모듈의 이름을 항상 앞에 붙여 줘야 한다.
  • from 모듈이름(확장자를 제외한 파일 이름) import 모듈 내 함수나 클래스 이름
    from으로 해당 모듈(파일)을 가져오고, import를 이용해 필요한 함수나 클래스를 개별 임포트 할 수 있다. 이때는 함수나 클래스를 사용하기 위해서 모듈의 이름을 붙여 줘야 할 필요는 없다.
# import 만 사용
import mylib

mylib.add(10, 20)

# from ... import ... 사용
from mylib import add, mul

add(10, 20)

모듈의 임포트 경로

앞에서 한가지 빠진 설명이 있다. 파이썬은 현재 자신의 실행 디렉토리에서 임포트하려는 모듈이 있는지 찾아 보고 없다면 시스템 패스에서 다시 찾는다.

만일 모듈을 임포트 할 때 실행파일과 임포트 대상 모듈이 같은 디렉토리에 있다면 아무런 문제 없이 앞의 방법으로 임포트가 가능하지만, 만일 모듈이 다른 디렉토리에 있다면 모듈을 찾을 수 없다는 에러가 발생한다.

이번 섹션에서는 대상 모듈의 위치에 따른 임포트 방법을 살펴 보겠다.

동일 경로 파일

  • import
import mylib

n = mylib.add(10, 20)
print(n)
  • from ... import ...
from mylib import add, mul

n = add(10, 20) # 앞에 모듈 이름을 적어 줄 필요가 없음
print(n)

하위 경로 파일

임포트 하려는 모듈이 실행파일의 하위 경로에 있는 경우 from [경로]를 지정하여 임포트 할 수 있다. modules 라는 디렉토리 밑에 mylib.py가 있다고 가정 한다면 아래와 같이 임포트 할 수 있다.

# 디렉토리만을 지정 할 수 있다
import modules import mylib 
n = mylib.add(1, 2)

# 디렉토리와 파일까지 지정하고, 임포트 하려는 함수를 별도로 지정
import modules.mylib import add, mul
n = add(1, 2)

# 디렉토리의 뎁스가 여러개라면 . 를 이용해 더 하위로 갈 수 있다
import modules1.modules2.mylib import add, mul
n = add(1, 2)

상위 경로 파일

상위 경로를 임포트 할 때는 상대 경로를 이용해 접근하는 것이 지원되지 않는다. 프로그래밍적인 해결 방법으로 시스템 패스에 모듈이 있는 디렉토리 위치를 추가하는 방법이 있다.

 import sys, os
 
 sys.path.append("G:\\MODULE") # 절대 경로 등록
 
 # 임포트 할 모듈이 실행 파일 한 단계 위 디렉토리에 있다고 가정
 sys.path.append("../") # 상대 경로 등록
 import mylib import add 
  
 n = add(1, 2)

환경 변수를 이용하는 방법도 있다. 윈도우든 리눅스든 PYTHONPATH라는 환경 변수를 만들고 해당 환경 변수에 모듈의 패스를 적어 주면 된다.

모듈의 이름

모든 파이썬 모듈은 __name__ 전역 변수에 자신의 이름(확장자를 제외한 파일이름)을 저장하고 있다. 그런데 이 모듈이 파이썬에 의해 실행 된 모듈이냐, 다른 모듈로 부터 임포트된 모듈이냐에 따라 이름이 달라진다.

파이썬 명령의로 처음 실행 되는 경우 모듈의 이름이 "__main__"이고, 다른 모듈에 의해 임포트 된 경우 확장자를 제외한 파일의 이름이 모듈이름이 된다.

import mylib

print(__name__)       # __main__, 파이썬에 의해 실행된 모듈의 이름
print(mylib.__name__) # mylib, 임포트 된 모듈의 이름

이런 특징을 이용해서 프로그램을 시작하는 엔트리 포인트가 없는 파이썬의 경우 엔트리 포인트가 있는 언어들과 유사하게 동작 할 수 있도록 만들 수 있다.

# 함수 외부에 코드를 작성하면 실행 되어 버리므로 main 안에서 부터 코드를 작성 한다

def main() :  
    # 이런 저런 코드들

# 아직 까지 아무런 코드도 실행 되지 않았다

if '__main__' == __name__ : # 파이썬에 의해 실행 되는 파일이라는 뜻
    main()                  # main 함수 호출. 엔트리 포인트 역할을 한다.

모듈 다시 로드

프로그램 실행 중에 변경 된 모듈을 다시 로드해야 필요가 있는 경우가 있다. 이 때는 import를 다시한다고 해도 이미 캐싱 되어 있는 모듈만 읽어 오게 되므로, 이때는 importlib 라는 모듈을 사용해야 한다.

import importlib

importlib.reload(모듈이름) # 프로그램이 구동 되는 중에도 모듈을 다시 로드 할 수 있다.

마치며

모듈을 임포트 하는 방법에는 위 방법 말고도 __init__.py를 이용해 패키징화를 하는 방법도 있다. 패키지는 도트(.)를 이용해 파이썬 모듈들을 계층적(디렉토리 구조)으로 관리 할 수 있게 해준다. 이에 대한 소개는 따로 포스트를 만들어 추가하도록 하겠다.

다음 강의는 모듈에 이어 "모듈 객체"에 대해 알아보는 시간을 가지도록 하겠다. 

부록 1. 같이 보면 좋은 글

유익한 글이었다면 공감(❤) 버튼 꾹!! 추가 문의 사항은 댓글로!!