파이썬에서 모듈(module)이란 함수나 변수 또는 클래스들을 모아 놓은 파일입니다. 파이썬 프로그램에서는 모듈을 불러와서 사용할 수 있습니다.
예를 들어서 우리는 이전에 turtle 이라는 모듈을 불러온 후에 화면에 그림을 그리는 기능을 사용했었습니다. 일반적으로 우리는 많은 모듈을 사용합니다.
다른 사람이 이미 만들어 놓은 모듈을 사용할 수도 있고 우리가 직접 만들어서 사용할 수도 있습니다. 여기서는 모듈을 어떻게 만들고 사용하는지를 알아봅시다.
그리고 파이썬은 다양한 작업을 수행하는 모듈들을 지원합니다. 우리가 가장 많이 사용되고 유용한 모듈들을 선별하여 살펴볼 것입니다.

모듈은 파이썬의 문장들이 저장된 파일입니다.
간단한 모듈을 한번 만들어봅시다. 그리 어렵지 않습니다. 파이썬 튜토리얼에 있는 피보나치 수열 모듈을 예로 설명하겠습니다.
# 피보나치 수열 모듈
def fib(n): # 피보나치 수열 출력
a, b = 0, 1
while b < n:
print(b, end = ' ')
a, b = b, a + b
print()
def fib2(n): # 피보나치 수열을 리스트로 반환
result = []
a, b = 0, 1
while b < n:
result.append(b)
a, b = b, a+b
return result
위와 같이 fib()와 fib2() 함수가 있는 파일 fibo.py를 만들고 Vi 디렉터리에 저장합시다. 파일의 확장자는 반드시 .py 이어야 합니다.
이 파일이 바로 모듈입니다. 지금까지 에디터로 만들어 왔던 소스 파일이 바로 모듈입니다. 모듈 안에서 모듈의 이름은 __name__ 변수로 알 수 있습니다.
fibo.py 모듈에 들어 있는 모든 정의는 다른 모듈로 import 될 수 있습니다. 우리가 만든 fibo.py 라는 파일, 즉 모듈을 파이썬에서 불러와 사용하려면 어떻게 해야 할까요?
파이썬 인터프리터 쉘의 경우엔 fibo.py 를 저장한 디렉터리(C:\python)로 이동한 후에 파이썬 쉘을 실행하여 파이썬 인터프리터 쉘이 fibo.py를 읽어들이도록 합니다.
Visual Studio의 경우는 프로젝트 디렉토리에 파일이 있다면 프로젝트가 모듈을 읽어들입니다. 아래와 같은 문장을 입력하여 실행합니다.
import fibo
fibo.py 를 불러오기 위해 import fibo 라고 입력하고 있습니다. 이때는 확장자 .py를 붙이면 안 됩니다. import는 다른 사람이 작성한 파이썬 모듈을 사용할 수 있게 해주는 명령어입니다.
import 문장을 실행한다고 해서 파이썬 인터프리터가 모듈 안의 함수들을 읽어 들여서 현재의 심볼 테이블에 저장하지는 않습니다.
단지 모듈의 이름인 fibo만 심볼 테이블에 저장합니다. 모듈의 이름을 이용하여 개발자는 다음과 같이 모듈 안의 함수들을 사용할 수 있습니다.
import fibo
fibo.fib(1000)
print(fibo.fib2(100))
print(fibo.__name__)
<실행 결과>
1 1 2 3 5 8 13 21 34 55 89 144 233 377 610 987
[1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89]
fibo
만약 fibo.fib() 와 같이 함수를 사용할 때마다 모듈의 이름을 적어주는 것이 귀찮다면 다음과 같이 함수를 변수에 저장하여 사용해도 됩니다.
import fibo
fib = fibo.fib
fib(500)
<실행 결과>
1 1 2 3 5 8 13 21 34 55 89 144 233 377
또 한 가지 방법은 "from 모듈 import 함수"를 사용하여도 됩니다. "from 모듈 import 함수"를 이용하면 모듈 이름없이 해당 모듈의 함수를 사용할 수 있습니다.
from fibo import fib
fib(1000)
<실행 결과>
1 1 2 3 5 8 13 21 34 55 89 144 233 377 610 987
fibo 모듈에 저장된 fib() 와 fib2() 함수를 사용하고 싶다면 다음과 같이 합니다.
from fibo import fib, fib2
fib(500)
print(fib2(1000))
<실행 결과>
1 1 2 3 5 8 13 21 34 55 89 144 233 377
[1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144, 233, 377, 610, 987]
* 문자를 사용하는 방법도 있습니다. * 는 정규 표현식에서 "모든 것"을 의미합니다.
from fibo import *
fib(500)
print(fib2(1000))
<실행 결과>
1 1 2 3 5 8 13 21 34 55 89 144 233 377
[1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144, 233, 377, 610, 987]
"from fibo import *" 문장이 실행되면 모듈 안의 모든 함수들이 심볼 테이블에 저장됩니다.
이 방법은 단점도 있는데 모듈의 모든 함수를 가져오는 것이라 사용자가 정의한 함수를 가릴 수도 있습니다.
효율성의 관점에서 각 모듈은 인터프리터 세션에서 한번만 포함됩니다. 따라서 만약 모듈 작성자가 모듈을 변경하였다면 인터프리터를 다시 실행하여야 합니다.
만약 변경된 모듈이 하나뿐이면 importlib.reload() 를 사용하여도 됩니다.
개발자가 fibo.py 모듈을 포함하라고 하면 인터프리터는 먼저 현재 디렉토리에 이러한 이름을 가지는 모듈이 있는지를 검사합니다.
만약 발견되지 않으면 sys.path 변수에 저장된 디렉토리에서 fibo.py를 찾습니다.
sys.path는 아래와 같은 위치로 초기화됩니다.
초기화 이후로는 파이썬 프로그램이 sys.path를 변경할 수 있습니다. 현재 실행되는 스크립트가 있는 디렉토리는 탐색 경로의 맨 처음에 놓여집니다.
표준 라이브러리 경로보다 먼저 탐색됩니다. 이것이 의미하는 것은 무엇일까요? 우리가 만든 모듈이 표준 라이브러리 모듈의 모듈을 대체할 수 있다는 것입니다.