파이썬 모듈 사용법 – 파이썬 컴플리트 5

파이썬 모듈 사용법

파이썬에서 모듈은 프로그램 아키텍쳐의 핵심 개념입니다. 파이썬 소스코드를 작성하면 .py 확장자로 저장하는데 .py확장자의 파일은 모듈이 될 수 있습니다.

하나의 프로그램을 작성하기 위해서 여러개의 모듈 파일을 만들어서 사용합니다. 프레임워크와 패키지의 모듈도 임포트(import)해서 사용합니다.

이 포스팅에서는 모듈을 만들어서 임포트(import) 해보겠습니다. 패키지를 임포트 하는 법도 알아보겠습니다.

모듈 만들기 .py 파일

우선 모듈을 만드는 것 부터 알아보겠습니다. 파이썬 소스코드가 들어갈 폴더를 만들어서 그 안에서 main.py 파일과 mymodule.py 파일을 만듭니다. mymodule.py 를 main.py 파일로 임포트 해보겠습니다.

mymodule.py 파일을 아래와 같이 작성합니다.

moduleNumber = 1
moduleName = 'my first module'

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

모듈 임포트하기

같은 폴더에 있는 main.py 모듈에서 아래와 같이 임포트 할 수 있습니다. 모듈안에 있는 함수, 변수를 사용할 수 있습니다. .도트 연산자를 사용하여 객체에 접근합니다. 다른 언어에 있는 네임스페이스(namespace – 이름공간) 개념이라고 볼 수 있습니다.

import mymodule

x = mymodule.add(3,5)
print(x)

print(mymodule.moduleName)
print(mymodule.moduleNumber)

mymodule.py 이지만 .py를 생략합니다. .py를 붙이고 실행하려고 하면 오류메시지를 볼 수 있습니다.

ModuleNotFoundError: No module named ‘mymodule.py’; ‘mymodule’ is not a package

파이썬이 확장자를 제외한 파일 이름을 모듈의 이름으로 사용하기 때문입니다.

*아래처럼 from ~ import 문을 사용한 import 도 가능합니다. 이 경우에는 main.py 에서 dir() 함수로 확인해보면 add, moduleNumber 등 변수가 등록되어 있습니다. (이 스크립트 파일의 전역변수처럼 사용 가능하다)

from mymodule import add, moduleNumber, moduleName

x = add(3,5)
print(x)

print(moduleName)
print(moduleNumber)
print(dir())

*from ~ import 방식이 전역변수와 혼동이 올 것 같으면 as 키워드로 모듈의 이름을 줄이는 방법도 있습니다. as 는 일종의 별명 같은 것인데 글자수를 줄이기 위해서 이니셜을 많이 사용합니다. import numpy as np 이런 식으로 사용하죠.

아래는 사용자 모듈의 이름을 as로 바꿔서 사용합니다. dir() 함수를 보면 from ~ import와는 달리 mi 만 등록되어 있습니다.

import mymodule as mi

print(mi.add(3,5))

print(mi.moduleName)
print(mi.moduleNumber)
print(dir())

인터프리터에 모듈 임포트하기

다음은 파이썬 인터프리터에서 모듈을 임포트 해보겠습니다. 인터프리터에서 현재 디렉토리 위치를 확인하는 것은 os.getcwd() 입니다. 사용자가 작성한 모듈 파일은 같은 디렉토리에 있어야 하므로 확인한 다음에 import mymodule을 하여 모듈을 불러와서 사용했습니다. 인터프리터에서는 import 문을 여러번 실행시켜도 한번만 실행합니다. 다시 실행시킬려면 importlib 모듈의 reload 함수를 실행시켜야 합니다.

>>> import os
>>> os.getcwd
<built-in function getcwd>
>>> os.getcwd()
'D:\\project\\pythontut\\pythonProject2'
>>> import mymodule
>>> mymodule.add(3,4)
7
>>> mymodule.moduleName
'my first module'
>>> mymodule.moduleNumber
1

import 문

import 문은 모듈을 실행시킵니다. 그냥 변수 이름만 가져오는게 아니라 모듈 안에 있는 내용이 실행됩니다. 임포트하는 모듈의 스크립트를 실행시키지 않고 객체만 가져오게 하려면 아래와 같은 형식을 사용할 수 있습니다. mymodule.py를 아래와 같이 작성합니다.

print('imported module:', __name__)

def mainProgram():
    print('this is module')

if __name__ == '__main__':
    mainProgram()

main.py를 아래와 같이 작성해서 실행합니다.

import mymodule

print('main module:', __name__)

def mainProgram():
    print('this is main program')

if __name__ == '__main__':
    mainProgram()

결과는 아래와 같습니다. 임포트한 모듈 mymodule의 mainProgram함수는 실행되지 않고 __main__ 에 있는 함수는 실행되었습니다. __name__은 파이썬이 모듈을 식별하는 이름입니다. 최상위 스크립트는 __main__ 이 되고 임포트 되는 모듈은 확장자를 제외한 파일 이름입니다. 파이썬에서는 의도치 않은 코드의 실행을 방지하기 위해 if __name__ == ‘__main__’: 문장을 넣는 것을 권장하고 있습니다.

imported module: mymodule
main module: __main__
this is main program

네임스페이스와 모듈

네임스페이스(namespace – 이름공간)이란 단어가 좀 생소하게 들릴 수도 있습니다만, 프로그램의 규모를 확장하기 위해서 필요한 부분입니다. 이름공간을 관리하지 않으면 컴파일러가 변수나 함수, 클래스 등의 식별자(identifier)가 동일한 경우에 충돌이 일어나게 됩니다. 예를 들어 컴파일러가 A, B 두 모듈에 똑같은 변수 x를 사용할 때 모듈의 이름이 없다면 어떤 것을 사용할지 알 수 없습니다. 변수 테이블에서 순서가 빠른 것을 선택할지도 모르지요. 그러나 A.x 와 B.x 처럼 모듈의 이름을 붙인다면 명확하게 알 수 있습니다.

네임스페이스는 변수나 객체 등을 패키지로 묶어서 관리할 수 있는 아키텍쳐입니다. 규모가 큰 프로젝트에서는 각 팀이 작성한 모듈을 최상위 스크립트(main.py 같은)에서 임포트하여 사용합니다. 기본적인 import 방식으로 사용한다면 이름이 충돌할 일을 방지할 수 있습니다. 프로그래머들이 가장 많은 시간을 쏟는 일 중에 하나가 변수의 이름을 짓는 것이라는 통계 결과도 있는데 보통 사람들은 비슷한 이름을 짓기 때문일 겁니다. 너무 유니크해도 의미적으로 전달이 느리고 또 너무 흔하면 다른 이름들과 혼동할 가능성도 있습니다.

이름을 짓는데 왜 이렇게 복잡한 모듈 시스템을 사용해야 하는가? 의문이 들 수 있지만 프로그램에서 변수 이름을 짓는 것은 중요한 일 입니다. 파이썬도 C언어 계열처럼 전역, 지역변수 개념이 있습니다. 거기다가 모듈까지 이름의 범위를 구분하는 시스템이 있습니다.

이런 시스템 안에서 다른 개발자들이 만들어 놓은 프로젝트도 import 문으로 내 main 스크립트 파일로 가져와서 쉽게 사용할 수 있습니다. 파이썬은 코어를 이해하기는 어렵지만 사용하기는 쉽습니다. 파이썬의 장점이 내부적인 동작이나 원리에 대해서 잘 몰라도 제대로 동작하는 프로그램을 만들 수 있습니다.

다만 파이썬 컴플리트의 시리즈 포스팅에서는 약간은 원리적으로 생각해 보자는 취지로 다루고 있습니다. 프로그래밍 이론은 어쩔 때는 조금 깊게 들어가면 컴파일러 이론까지 나오니까 적당히 응용 프로그램 수준에서 이해하면 충분합니다. 그런데 하다 보면 또 이해가 안되는 내용들은 결국 또 깊이 있게 접근하게 되죠. 지금은 구글에는 파이썬의 기능적인 튜토리얼은 수도 없이 많으니까 그 보다는 어떤 한 주제에 대해 다양한 관점의 문서들이 좀더 나와도 괜찮다고 봅니다. 다양성은 이 블로그가 추구하는 방향이기도 합니다.

요약

파이썬은 패키지를 위한 별도의 디렉토리 구조가 따로 있습니다. 그것은 패키지를 만들 때 알아야 할 내용이고 여기서는 모듈의 기초적인 사용법. 임포트 하는 방법을 알아봤습니다. 파이썬의 repository에서 외부 패키지를 설치해서 임포트 할 때도 똑같이 적용합니다. 패키지는 pip 프로그램으로 설치하고 스크립트에서 import 합니다.

외부 참고 링크

Welcome to Python.org

PyPI · The Python Package Index

Leave a Comment