관리 메뉴

정리왕

파이썬 패키지1 (패키지란 무엇인가?) 본문

6.개발/파이썬 공부하기

파이썬 패키지1 (패키지란 무엇인가?)

정리합니다 2020. 12. 1. 19:10
반응형

파이썬 패키지1

 

# 패키지란 무엇인가?

 

패키지(Packages)는 도트( . )를 사용하여 파이썬 모듈을 계층적(디렉터리 구조)으로 관리할 수 있게 해준다. 예를 들어 모듈 이름이 A.B인 경우에 A는 패키지 이름이 되고 B는 A패키지의 B모듈이 된다.

 

파이썬 패키지는 디렉터리와 파이썬 모듈로 이루어지면 구조는 아래와 같다.

game, sound, graphic, play는 디렉터리 이름이고 확장자가 .py인 파일은 파이썬 모듈이다.

.game 디렉터리가 이 패키지의 루트 디렉터이고 sound, graphic, play는 서브 디렉터리이다.

game/

   __init__.py

  sound/

    __init__.py

    echo.py

    wav.py

  graphic/

    __init__.py

    screen.py

    render.py

  play/

    __init__.py

    run.py

    test.py

간단한 파이썬 프로그램이 아니라면 이렇게 패키지 구조로 파이썬 프로그램을 만드는 것이 공종 작업이나 유지보수 등 여러면에서 유리하다. 또한 패키지 구조로 모듈을 만들면 다른 모듈과 이름이 겹치더라도 더 안전하게 사용할 수 있다.

 

 

 

 

# 패키지 만들기

이제 위 예제와 비슷한 game 패키지를 직접 만들어 보며 패키지에 대해서 알아보자.

 


패키지 기본 구성 요소 준비하기

1. C:/doit 디렉터리 밑에 game 및 기타 서브 디렉터리를 생성하고 .py 파일들을 다음과 같이 만들어 보자.

(만약 C:/doit 디렉터리가 없다면 먼저 생성하고 진행하자)

C:/doit/game/__init__.py
C:/doit/game/sound/__init__.py
C:/doit/game/sound/echo.py
C:/doit/game/graphic/__init__.py
C:/doit/game/graphic/render.py

 

 

2. 각 디렉터리에 __init__.py 파일을 만들어 놓기만 하고 내용은 일단 비워 둔다.

 

3. echo.py 파일은 다음과 같이 만든다.

# echo.py
def echo_test():
    print("echo")

4. render.py 파일은 다음과 같이 만든다.

# render.py
def render_test():
    print("render")

5. 다음 예제를 수행하기 전에 우리가 만든 game 패키지를 참조할 수 있도록 명령 프롬프트창에서 set 명령어로 PYTHONPATH 환경 변수에 C:/doit 디렉터리를 추가한다. 그리고 파이썬 인터프리터(Interactive shell)를 실행한다.

C:\> set PYTHONPATH=C:/doit
C:\> python
Python 3.7.3(v3.7.3~~~)

여기까지 준비가 되었으면 다음을 따라 해 보자.

 

 

패키지 안의 함수 실행하기

자, 이제 패키지를 사용하여 echo.py 파일의 echo_test 함수를 실행해 보자.

패키지 안의 함수를 실행하는 방법은 다음 3가지가 있다.

다음 예제는 import 예제이므로 하나의 예제를 실행하고 나서 다음 예제를 실행할 때에는 반드시 인터프리터를 종료하고 다시 실행해야 한다.

인터프리터를 다시 시작하지 않을 경우 이전에 import한 것들이 메모리에 남아 있어 엉뚱한 결과가 나올 수 있다.

(윈도우의 경우 인터프리터 종료는 Ctrl + z)

 

 

첫 번째는 echo 모듈을 import하여 실행하는 방법으로, 다음과 같이 실행한다.

>>> import game.sound.echo
>>> game.sound.echo.echo_test()
echo

 

 

두 번째는 echo 모듈을 있는 디렉터리까지를 from....import하여 실행하는 방법이다.

>>> from game.sound import echo
>>> echo.echo_test()
echo

 

 

세 번째는 echo 모듈의 echo_test 함수를 직접 import하여 실행하는 방법이다.

>>> from game.sound.echo import echo_test
>>> echo_test()
echo

 

 

하지만 다음과 같이 echo_test 함수를 사용하는 것은 불가능하다.

>>> import game
>>> game.sound.echo.echo_test()
Traceback (most recent call last):  ======> 오류 발생
  File"<stdin>",line 1 in <module>  ======> 오류 발생
AttributeError: 'module' object has no attribute 'sound'  ======> 오류 발생

import game 을 수행하면 game 디렉터리의 모듈 또는 game 디렉터리의 __init__.py에 정의한 것만 참조할 수 있다.

 

또 다음처럼 echo_test 함수를 사용하는 것도 불가능하다.

>>> import game.sound.echo.echo_test
Traceback (most recent call last):    =======> 오류 발생
  File "<stdin>", line 1, in <module> =======> 오류 발생
  ImportError:No module named echo_test  =======> 오류 발생

도트 연산자(.)를 사용해서 import a.b.c처럼 import할 때 가장 마지막 항목인 c는 반드시 모듈 또는 패키지여야만 한다.

 

 

반응형
Comments