54. 파이썬 – 패키지 __init__.py 의 용도

  • 네이버 블로그 공유하기
  • 카카오톡 공유하기
  • 네이버 밴드에 공유하기
  • 페이스북 공유하기
  • 트위터 공유하기

지난 포스팅에서는 echo 모듈을 import 하여 실행하는 방법부터 echo_test 함수가 안되는 경우 두 가지에 대해서 공부 해봤습니다.

이번 포스팅에서는 __init__.py 는 어떤 용도로 쓰이는 지 __init__.py 의 용도에 대해 공부해 보도록 하겠습니다

파이썬 패키지

__init__.py 의 용도

__init__.py 파일은 해당하는 디렉터리가 패키지의 일부 임을 알려주는 역할을 하게 됩니다
만약에 game.sound.graphic 등의 패키지가 포함되어 있는 디렉터리에 __init__.py 파일이 존재하지 않는다면 패키지로 인식 될 수가 없습니다.

python 3.3 버전부터는 __init__.py 파일이 없어도 패키지로 인식할 수 있게 끔 변경이 되었습니다.
그러나 하위 버전 호환을 위해서 __init__.py 파일을 생성하는 것이 안전한 방법일 수 있습니다.

Python
(py_study_3110) D:\Dropbox\02.My_Job\80.Study\01.Python\00.study_python_3.11.0\01.TEST>python
Python 3.11.0 | packaged by Anaconda, Inc. | (main, Mar  1 2023, 18:18:21) [MSC v.1916 64 bit (AMD64)] on win32
Type "help", "copyright", "credits" or "license" for more information.
>>> from game.sound import *
>>> echo.echo_test()
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
NameError: name 'echo' is not defined
>>>

위 코드를 실행을 해보겠습니다.
Traceback (most recent call last):
File “”, line 1, in
NameError: name ‘echo’ is not defined 오류가 발생하게 됩니다.
우리는 분명 game.sound 패키지 안에서 모든 것(*)을 import 하였으니 echo 모듈을 사용 하는게 당연한 것처럼 생각이 들지만 echo 라는 이름이 정의 되지 않았다고 오류를 출력하게 됩니다.(NameError)

__all__ 변수

이런 식으로 특정 디렉터리의 모듈을 * 를 사용하여 import 할 때에는 아래처럼 해당하는 디렉터리의 __init__.py 파일에 __all__ 변수를 설정하고 import 할 수 있게 끔 모듈을 정의해 주면 됩니다.

Python
# D:/Dropbox/02.My_Job/80.Study/01.Python/00.study_python_3.11.0/01.TEST/game/sound/__init__.py
__all__ = ['echo']

위 코드에서 __all__ 은 sound 디렉터리에서 * 기호를 사용하여 import 할 경우에 여기에 정의되어 있는 echo 모듈 만을 import 한다는 의미로 해석하시면 됩니다.

여기서 혼동하기 쉬운 부분이 from game.sound.echo import * 는 __all__ 과는 관계없이 무조건 import 를 하게 됩니다.
이런 식으로 __all__ 과 상관 없이 무조건 import 되는 경우는 from a.b.c import * 에서 from 의 마지막 항목인 c 가 모듈인 경우 입니다.

__init__.py 파일 변경 후 실행

Python
(py_study_3110) D:\Dropbox\02.My_Job\80.Study\01.Python\00.study_python_3.11.0\01.TEST>python
Python 3.11.0 | packaged by Anaconda, Inc. | (main, Mar  1 2023, 18:18:21) [MSC v.1916 64 bit (AMD64)] on win32
Type "help", "copyright", "credits" or "license" for more information.
>>> from game.sound import *
>>> echo.echo_test()
echo
>>>

이제 위 코드처럼 __init__.py 파일을 변경 한 후 대화형 인터프리터를 재실행한 뒤에 다시 실행을 해 보면 우리가 원한던 결과가 정상적으로 출력됨을 알 수가 있습니다.~

이 포스팅은 ‘위키독스’ 의 ‘점프 투 파이썬‘ 전자책을 구매하여 독학하기 위한 자료로 작성했습니다.

54. 파이썬 – 패키지 __init__.py 의 용도

Leave a Comment