프로젝트를 수행하다보면 공통 모듈을 생성하여 다른사람 또는 스스로 재활용해야할 경우가 자주 발생힙니다.
파이썬 공식 문서를 참고하여 패키지 만드는 방법을 정리하겠습니다.
참고 : Python 공식문서
파이썬 패키지는 dotted module names
를 사용하여 구조화 하고 있습니다.
즉, 패키지 내 Level down으로 여러 모듈을 이용한다면 A.B 와 같은 형태로 .
을 이용하여 패키지 서브 모듈을 지정하게 됩니다.
sound/ Top-level package
__init__.py Initialize the sound package
formats/ Subpackage for file format conversions
__init__.py
wavread.py
wavwrite.py
aiffread.py
aiffwrite.py
auread.py
auwrite.py
...
effects/ Subpackage for sound effects
__init__.py
echo.py
surround.py
reverse.py
...
filters/ Subpackage for filters
__init__.py
equalizer.py
vocoder.py
karaoke.py
...
패키지를 임포트할 때, 파이썬은 sys.path
에 있는 디렉터리들을 검색하면서 패키지 서브 디렉터리를 찾습니다.
각 패키지 Level(폴더) 마다 __init__.py
을 필수로 만들어 줘야합니다.
Python이 파일을 포함하는 디렉터리를 패키지로 취급하도록 하는 데 필요한데, 간단하게 __init_.py
는 빈 파일일 수 있지만 패키지에 대한 초기화 코드를 실행하거나 나중에 설명할 __all__
변수를 설정할 수도 있습니다.
패키지에서 * 임포트 하기
패키지에서 * 를 이용하여 모든 모듈을 Import 할때 아래와 같이 수행하게 됩니다.
from package import *
여기서 __all__
변수에 해당 모듈을 할당 해놓지 않는다면 패키지 내용을 읽을 수가 없어 Undefined
가 발생한다.
sound/ Top-level package
__init__.py Initialize the sound package
effects/ Subpackage for sound effects
__init__.py
echo.py
surround.py
reverse.py
test.py
echo.py
def echo_function1():
print("echo function1")
def echo_function2():
print("echo function2")
Package 호출 테스트 1
호출하는 Python Script 에서 명시적으로 해당 모듈이름을 지정해줬을 경우.
아래와 같이 호출하게 되면 문제 없이 해당 모듈 내 function을 호출 할 수 있습니다.
test.py
from sound.effects import echo
def main():
echo.echo_function1()
echo.echo_function2()
if __name__ == "__main__":
main()
python test.py
echo function1
echo function2
Package 호출 테스트 2
__init__.py
파일 내 모듈을 명시적으로 표시하지 않고 현재와 같은 Blank
상태로 from package import *
로 호출 할 경우 아래와 같이 에러가 발생하게 됩니다.
from sound.effects import *
def main():
echo.echo_function1()
echo.echo_function2()
if __name__ == "__main__":
main()
python test.py
NameError: name 'echo' is not defined
Package 호출 테스트 3
effects 폴더 내 __init__.py
파일에 __all__
변수에 포함 시킬 모듈명을 명시적으로 할당하게 된다면 Python 에서도 해당 모듈의 Path를 인지하고 호출할 수 있게 됩니다.
sound/effect/init.py
__all__ = ["echo"]
test.py
from sound.effects import *
def main():
echo.echo_function1()
echo.echo_function2()
if __name__ == "__main__":
main()
python test.py
echo function1
echo function2
'BIGDATA > Python' 카테고리의 다른 글
Poweshell virtualenv activate error (0) | 2021.10.22 |
---|---|
32bit, win32com dll Load Fail (0) | 2021.04.22 |
Win32Api 사용할때 에러 해결 (0) | 2021.04.20 |
Python 오프라인(망분리) 패키지 다운로드 및 설치 (0) | 2021.02.05 |
Jupyter Notebook 에 가상환경 커널 추가하는 방법 (0) | 2021.01.18 |