프로젝트를 수행하다보면 공통 모듈을 생성하여 다른사람 또는 스스로 재활용해야할 경우가 자주 발생힙니다.
파이썬 공식 문서를 참고하여 패키지 만드는 방법을 정리하겠습니다.
참고 : Python 공식문서
6. Modules
If you quit from the Python interpreter and enter it again, the definitions you have made (functions and variables) are lost. Therefore, if you want to write a somewhat longer program, you are bett...
docs.python.org
파이썬 패키지는 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 |