본문 바로가기

프로그래밍/python

파이썬 패키지 __init__.py 를 이용해서 만드는 법

반응형

파이썬 패키지 __init__.py 를 이용해서 만드는 법


파이썬 패키지란?

파이썬 패키지는 간단하게 파이썬 모듈들의 집합체 라고 할 수 있습니다. 여기서 파이썬 모듈은 간단히 하나의 파이썬 파일입니다.

 

그렇다면 __init__.py 를 이용해서 파이썬 패키지를 만들어야 하는 이유는?

큰 파이썬 프로젝트에서 __init__.py를 이용해서 패키지를 만드는것을 어렵지 않고 쉽게 가능토록 해주기 때문입니다.

여러 각각의 파이썬 스크립트들을 하나의 모듈로써 임포트하는 메카니즘을 제공합니다.

 

예제로 만들어보기

__init__.py를 사용하는 것을 이해하고 어떻게 사용하는지를 알 수 있는 가장 좋은법은 간단한 예제로 따라해보는 것입니다. 

 

예제에 나오는 코드들은 파이썬 2버젼과 3버젼 두개다 동작합니다. 만약 2버젼을 사용하신다면

from __future__ import print_function 이 필요할 것입니다.

 

자, 이제 3개의 모듈이 있다고 해봅시다.

someFolder
|-- stringLength.py
|-- stringToUpper.py
`-- stringToLower.py

여기서 모듈이란 파이썬 파일 하나라는 의미입니다. 이제 각각의 파이썬 파일의 내용은 아래와 같습니다.

# stringLength.py

def stringLength(inStr):
    return len(inStr)
# stringToUpper.py

def stringToUpper(inStr):
    return inStr.upper()
# stringToLower.py

def stringToLower(inStr):
    return inStr.lower()

자, 그러면 __init__.py 를 이용한 패키지 없이 어떻게 이 function들을 사용할 수 있을까요?

만약 현재의 디렉토리에 존재한다면 임포트할 수 있겠지만 딱 이뿐입니다.  다시 말하면 이 function을 사용하려면 같은 파일에 존재해야한다는 것이지요.

이러한 상황에 따른 예제를 보겠습니다.

# example1.py

import stringLength
import stringToLower
import stringToUpper

some_string = "Hello, Universe!"

print(stringLength.stringLength(some_string))
print(stringToLower.stringToLower(some_string))
print(stringToUpper.stringToUpper(some_string))

 

속내용이 빈 __init__.py 추가 하기

만약 이러한 스크립트들을 관리하기 쉽게 하나의 폴더에 넣어두려면 어떻게 해야할까요?

바로 여기서 __init__.py 의 필요성이 나타나게 됩니다.

 

먼저, 스크립트들을 string_func 라는 폴더로 다 넣습니다. 그리고 같은 폴더 안에 __init__.py 속내용이 없는 빈 파일을 만듭니다.

 

구조는 아래와 같습니다.

someFolder
|-- string_func
|   |-- __init__.py
|   |-- stringToUpper.py
|   |-- stringToLower.py
|   `-- strengthLength.py
`-- example1.py

자 그러면 __init__.py가 어떤 역할을 하는지 보겠습니다.

 

여기서 새로운 example2.py 파일을 만듭니다.

# example2.py

import string_func.stringLength
import string_func.stringToLower
import string_func.stringToUpper

some_string = "Hello, Universe!"

print(string_func.stringLength.stringLength(some_string))
print(string_func.stringToLower.stringToLower(some_string))
print(string_func.stringToUpper.stringToUpper(some_string))

그러면 string function들을 이러한 방식으로 가져올 수 있습니다. 일단은 다른 폴더에서 가져오는것이 가능해졌기에 전보다는 좋습니다. 하지만 코딩이 그리 간결해보이지는 않습니다. 그렇다면 만약 __init__.py 를 수정해서 좀 더 간단하게 해보는 방법을 알아보겠습니다.

 

init.py에서 imports 추가하기

__init__.py 를 열고 아래와 같이 수정해보겠습니다.

# __init__.py
from .stringLength import stringLength
from .stringToLower import stringToLower
from .stringToUpper import stringToUpper

여기서 모듈네임 이전의 . 은 파이썬 3버젼에서 relative import 가 가능해지도록 변경된 부분입니다.

이렇게 수정된 __init__.py로 인하여 얼마나 더 간단해졌는지 확인해보겠습니다.

# example3.py

import string_func

some_string = "Hello, Universe!"

print(string_func.stringLength(some_string))
print(string_func.stringToLower(some_string))
print(string_func.stringToUpper(some_string))

훨씬 더 간단해지고 짧아 진것을 볼 수 있습니다. 즉 string_func 는 하나의 모듈처럼 보이게 된 것입니다.

 

이것이 __init__.py 가 하는 역할입니다. 파이썬 모듈안에서 디렉토리로 관리가 될 수있도록 해주는 것입니다. __init__.py 를 빈 파일로 둬도 상관 없으며 위와 같이 임포트문을 추가해서 간결하게 만들 수 있습니다.

 

반응형