지난 포스팅에서는 echo 모듈을 import 하여 실행하는 방법부터 echo_test 함수가 안되는 경우 두 가지에 대해서 공부 해봤습니다.
- 53. 파이썬 – 패키지 안의 함수 실행해 보기
- 52. 파이썬 – 패키지의 정의와 만드는 방법
- 51. 파이썬 – 모듈을 불러오는 다른 방법
- 명령 프롬프트 #2 cmd 응용프로그램 실행
- 윈도우 파일 탐색기와 Cmd 명령 프롬프트 #1
이번 포스팅에서는 __init__.py 는 어떤 용도로 쓰이는 지 __init__.py 의 용도에 대해 공부해 보도록 하겠습니다
파이썬 패키지
__init__.py 의 용도
__init__.py 파일은 해당하는 디렉터리가 패키지의 일부 임을 알려주는 역할을 하게 됩니다
만약에 game.sound.graphic 등의 패키지가 포함되어 있는 디렉터리에 __init__.py 파일이 존재하지 않는다면 패키지로 인식 될 수가 없습니다.
python 3.3 버전부터는 __init__.py 파일이 없어도 패키지로 인식할 수 있게 끔 변경이 되었습니다.
그러나 하위 버전 호환을 위해서 __init__.py 파일을 생성하는 것이 안전한 방법일 수 있습니다.
(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 할 수 있게 끔 모듈을 정의해 주면 됩니다.
# 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 파일 변경 후 실행
(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 파일을 변경 한 후 대화형 인터프리터를 재실행한 뒤에 다시 실행을 해 보면 우리가 원한던 결과가 정상적으로 출력됨을 알 수가 있습니다.~
이 포스팅은 ‘위키독스’ 의 ‘점프 투 파이썬‘ 전자책을 구매하여 독학하기 위한 자료로 작성했습니다.
