53. 파이썬 – 패키지 안의 함수 실행해 보기

53. 파이썬 – 패키지 안의 함수 실행해 보기

지난번 포스팅에 이어서 파이썬 패키지에 대해 공부를 해 볼 텐데요
지난 시간에는 패키지의 정의와 패키지 만드는 방법에 대해 알아보았고
이번 시간에는 패키지 안의 함수 실행해 보기에 대해 알아보겠습니다.

파이썬 패키지

패키지 안의 함수 실행

일단 이번 패키지 안의 함수 실행에 있어서 주의 해야 할 사항은 명령프롬프트에서 파이썬 인터프리터를 실행해서 진행해야 합니다.
IDLE 이나 비주얼스튜디어코드 에서 실행을 하게되면 아래에 진행 할 예제들에서 오류가 발생 할 수 있습니다

첫 번째 echo 모듈

echo 모듈은 echo.py 입니다.

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

두 번째 echo 모듈이 있는 디렉터리까지 from…import 실행

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

세 번째 echo 모듈의 echo_test 함수를 직접 import 하여 실행

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

echo_test 함수가 안되는 경우 #1

아래와 같은 코드는 반드시 파이썬 인터프리터를 종료하고 다시 실행해야 합니다

Python
(py_study_3110) D:\Dropbox.My_Job.Study.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.
>>> import game
>>> game.sound.echo.echo_test()
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
AttributeError: module 'game' has no attribute 'sound'
>>>
.study_python_3.11.0.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. >>> import game >>> game.sound.echo.echo_test() Traceback (most recent call last): File "<stdin>", line 1, in <module> AttributeError: module 'game' has no attribute 'sound' >>>

위 코드처럼 파이썬 인터프리터를 새로 시작한 상태에서 import game 을 실행하게 되면 game 디렉터리의 __init__.py 에 정의 되어 있는 것만 참조할 수 있습니다.

echo_test 함수가 안되는 경우 #2

Python
>>> import game.sound.echo.echo_test
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
ModuleNotFoundError: No module named 'game.sound.echo.echo_test'; 'game.sound.echo' is not a package
>>>

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

오늘은 이렇게 패키지 안의 함수 실행하는 방법에 대해 알아보았습니다.
echo 모듈을 import 하여 실행하는 방법부터 echo_test 함수가 안되는 경우 두 가지에 대해서 공부 해봤습니다.

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

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

53. 파이썬 – 패키지 안의 함수 실행해 보기

52. 파이썬 – 패키지의 정의와 만드는 방법

52. 파이썬 – 패키지의 정의와 만드는 방법

지난 포스팅에서는 파이썬에서 모듈을 불러오는 다른 방법에 대해 공부해 봤습니다.
이제 파이썬 패키지에 대해 공부를 해 볼텐데요
먼저 패키지의 정의와 패키지 만드는 방법에 대해 공부해 보도록 하겠습니다.

파이썬 패키지

패키지의 정의

패키지의 정의에 대해 먼저 알아 보겠습니다. 패키지는 Packages 로 도트(.) 를 사용하여 파이썬의 모듈들을 계층적 디렉터리 구조 형태로 관리를 할 수 있게 끔 해줍니다.
예로 모듈 이름이 AAA.BBB 인 경우에 A 는 패키지 이름이 되며, BBB 는 A 패키지의 B 모듈이 되는 것 입니다.
여기에서 나오는 파이썬에서 모듈의 이전에 공부 했듯이 하나의 파이썬 파일(.py) 입니다

파이썬에서 패키지는 디렉터리와 파이썬 모듈로 이루어 집니다.

패키지의 구조

패키지의 구조를 살펴보면 아래 와 같습니다.
가상으로 game 이란 패키지의 예를 보겠습니다.

Python
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, sound, graphic, play 는 디렉터리이고 확장자가 .py 인 파일들은 파이썬 모듈입니다.
game 디렉터리가 이 패키지의 루트 디렉터리이고 sound, graphic, play 는 서브 디렉터리입니다.

간단한 파이썬 프로그램이라면 굳이 이렇게 패키지로 구조로 만들 필요가 없겠지만
이렇게 패키지 구조로 파이썬 프로그램을 만들게 되면 공동 작업이나 유지 보수 등을 할 때
여러가지 유리한 점들이 생깁니다.
그리고 패키지 구조로 모듈을 만들게 되면 다른 모듈과 이름이 겹치게 되더라도 안전하게 사용이 가능합니다.

패키지 만드는 방법

이제 위의 예와 비슷한 game 패키지를 만들어 보면서 패키지에 대해 더 공부해 보도록 하겠습니다.

패키기 기본 구성 요소

1. 디렉터리 생성과 파일 생성

game 디렉터리를 생성하고 game 디렉터리 밑에 서브 디렉터리까지 생성을 해보겠습니다.
그리고 파이썬 파일들을 만들어 보겠습니다.

저는 기존에 진행하던게 있어서 계속적으로 아래 폴더에 생성을 해보겠습니다.

D:\Dropbox.My_Job.Study.Python
D:\Dropbox\02.My_Job\80.Study\01.Python\00.study_python_3.11.0\01.TEST\game\
.study_python_3.11.0.TEST\game\

game 디렉터리를 생성하고 하위 폴더인 graphic 과 sound 디렉터리도 생성했습니다.
그리고 각각 디렉터리에 비어 있는 __init__.py 파일을 생성해 주었습니다.

BAT
(py_study_3110) D:\Dropbox.My_Job.Study.Python
(py_study_3110) D:\Dropbox\02.My_Job\80.Study\01.Python\00.study_python_3.11.0\01.TEST\game>dir /s
 D 드라이브의 볼륨에는 이름이 없습니다.
 볼륨 일련 번호: C4C6-D950

 D:\Dropbox\02.My_Job\80.Study\01.Python\00.study_python_3.11.0\01.TEST\game 디렉터리

2023-04-28  오후 05:26    <DIR>          .
2023-04-28  오후 03:26    <DIR>          ..
2023-04-28  오후 05:26    <DIR>          graphic
2023-04-28  오후 05:26    <DIR>          sound
2023-04-28  오후 05:26                 0 __init__.py
               1개 파일                   0 바이트

 D:\Dropbox\02.My_Job\80.Study\01.Python\00.study_python_3.11.0\01.TEST\game\graphic 디렉터리

2023-04-28  오후 05:26    <DIR>          .
2023-04-28  오후 05:26    <DIR>          ..
2023-04-28  오후 05:26                 0 __init__.py
               1개 파일                   0 바이트

 D:\Dropbox\02.My_Job\80.Study\01.Python\00.study_python_3.11.0\01.TEST\game\sound 디렉터리

2023-04-28  오후 05:26    <DIR>          .
2023-04-28  오후 05:26    <DIR>          ..
2023-04-28  오후 05:26                 0 __init__.py
               1개 파일                   0 바이트

     전체 파일:
               3개 파일                   0 바이트
               8개 디렉터리  549,653,786,624 바이트 남음
.study_python_3.11.0.TEST\game
>dir /s
D 드라이브의 볼륨에는 이름이 없습니다. 볼륨 일련 번호: C4C6-D950 D:\Dropbox.My_Job.Study.Python
(py_study_3110) D:\Dropbox\02.My_Job\80.Study\01.Python\00.study_python_3.11.0\01.TEST\game>dir /s
 D 드라이브의 볼륨에는 이름이 없습니다.
 볼륨 일련 번호: C4C6-D950

 D:\Dropbox\02.My_Job\80.Study\01.Python\00.study_python_3.11.0\01.TEST\game 디렉터리

2023-04-28  오후 05:26    <DIR>          .
2023-04-28  오후 03:26    <DIR>          ..
2023-04-28  오후 05:26    <DIR>          graphic
2023-04-28  오후 05:26    <DIR>          sound
2023-04-28  오후 05:26                 0 __init__.py
               1개 파일                   0 바이트

 D:\Dropbox\02.My_Job\80.Study\01.Python\00.study_python_3.11.0\01.TEST\game\graphic 디렉터리

2023-04-28  오후 05:26    <DIR>          .
2023-04-28  오후 05:26    <DIR>          ..
2023-04-28  오후 05:26                 0 __init__.py
               1개 파일                   0 바이트

 D:\Dropbox\02.My_Job\80.Study\01.Python\00.study_python_3.11.0\01.TEST\game\sound 디렉터리

2023-04-28  오후 05:26    <DIR>          .
2023-04-28  오후 05:26    <DIR>          ..
2023-04-28  오후 05:26                 0 __init__.py
               1개 파일                   0 바이트

     전체 파일:
               3개 파일                   0 바이트
               8개 디렉터리  549,653,786,624 바이트 남음
.study_python_3.11.0.TEST\game 디렉터리
2023-04-28 오후 05:26 <DIR> . 2023-04-28 오후 03:26 <DIR> .. 2023-04-28 오후 05:26 <DIR> graphic 2023-04-28 오후 05:26 <DIR> sound 2023-04-28 오후 05:26 0 __init__.py 1개 파일 0 바이트 D:\Dropbox.My_Job.Study.Python
(py_study_3110) D:\Dropbox\02.My_Job\80.Study\01.Python\00.study_python_3.11.0\01.TEST\game>dir /s
 D 드라이브의 볼륨에는 이름이 없습니다.
 볼륨 일련 번호: C4C6-D950

 D:\Dropbox\02.My_Job\80.Study\01.Python\00.study_python_3.11.0\01.TEST\game 디렉터리

2023-04-28  오후 05:26    <DIR>          .
2023-04-28  오후 03:26    <DIR>          ..
2023-04-28  오후 05:26    <DIR>          graphic
2023-04-28  오후 05:26    <DIR>          sound
2023-04-28  오후 05:26                 0 __init__.py
               1개 파일                   0 바이트

 D:\Dropbox\02.My_Job\80.Study\01.Python\00.study_python_3.11.0\01.TEST\game\graphic 디렉터리

2023-04-28  오후 05:26    <DIR>          .
2023-04-28  오후 05:26    <DIR>          ..
2023-04-28  오후 05:26                 0 __init__.py
               1개 파일                   0 바이트

 D:\Dropbox\02.My_Job\80.Study\01.Python\00.study_python_3.11.0\01.TEST\game\sound 디렉터리

2023-04-28  오후 05:26    <DIR>          .
2023-04-28  오후 05:26    <DIR>          ..
2023-04-28  오후 05:26                 0 __init__.py
               1개 파일                   0 바이트

     전체 파일:
               3개 파일                   0 바이트
               8개 디렉터리  549,653,786,624 바이트 남음
.study_python_3.11.0.TEST\game\graphic 디렉터리
2023-04-28 오후 05:26 <DIR> . 2023-04-28 오후 05:26 <DIR> .. 2023-04-28 오후 05:26 0 __init__.py 1개 파일 0 바이트 D:\Dropbox.My_Job.Study.Python
(py_study_3110) D:\Dropbox\02.My_Job\80.Study\01.Python\00.study_python_3.11.0\01.TEST\game>dir /s
 D 드라이브의 볼륨에는 이름이 없습니다.
 볼륨 일련 번호: C4C6-D950

 D:\Dropbox\02.My_Job\80.Study\01.Python\00.study_python_3.11.0\01.TEST\game 디렉터리

2023-04-28  오후 05:26    <DIR>          .
2023-04-28  오후 03:26    <DIR>          ..
2023-04-28  오후 05:26    <DIR>          graphic
2023-04-28  오후 05:26    <DIR>          sound
2023-04-28  오후 05:26                 0 __init__.py
               1개 파일                   0 바이트

 D:\Dropbox\02.My_Job\80.Study\01.Python\00.study_python_3.11.0\01.TEST\game\graphic 디렉터리

2023-04-28  오후 05:26    <DIR>          .
2023-04-28  오후 05:26    <DIR>          ..
2023-04-28  오후 05:26                 0 __init__.py
               1개 파일                   0 바이트

 D:\Dropbox\02.My_Job\80.Study\01.Python\00.study_python_3.11.0\01.TEST\game\sound 디렉터리

2023-04-28  오후 05:26    <DIR>          .
2023-04-28  오후 05:26    <DIR>          ..
2023-04-28  오후 05:26                 0 __init__.py
               1개 파일                   0 바이트

     전체 파일:
               3개 파일                   0 바이트
               8개 디렉터리  549,653,786,624 바이트 남음
.study_python_3.11.0.TEST\game\sound 디렉터리
2023-04-28 오후 05:26 <DIR> . 2023-04-28 오후 05:26 <DIR> .. 2023-04-28 오후 05:26 0 __init__.py 1개 파일 0 바이트 전체 파일: 3개 파일 0 바이트 8개 디렉터리 549,653,786,624 바이트 남음

2. echo.py 파일 생성

아래와 같이 echo.py 파일을 생성해 줍니다.

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

3. render.py 파일 생성

아래와 같이 render.py 파일을 생성해 줍니다.

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

4. 파이썬 환경변수 PYTHONPATH 에 디렉터리 추가하기

지금 진행하고 있는 game 패키지를 파이썬에서 참조할 수 있도록 명령 프롬프트 창에서 set 명령어를 통해 PYTHONAPTH 환경 변수에 현재 디렉토리를 추가해 줍니다.
그리고 파이썬 대화형 인터프리터(Interractive Shell) 을 실행을 해보겠습니다.

BAT
(py_study_3110) D:\Dropbox.My_Job.Study.Python
(py_study_3110) D:\Dropbox\02.My_Job\80.Study\01.Python\00.study_python_3.11.0\01.TEST\game>set PYTHONPATH=D:/Dropbox/02.My_Job/80.Study/01.Python/00.study_python_3.11.0/01.TEST

(py_study_3110) D:\Dropbox\02.My_Job\80.Study\01.Python\00.study_python_3.11.0\01.TEST\game>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.
>>>
.study_python_3.11.0.TEST\game
>set PYTHONPATH=D:/Dropbox/02.My_Job/80.Study/01.Python/00.study_python_3.11.0/01.TEST
(py_study_3110) D:\Dropbox.My_Job.Study.Python
(py_study_3110) D:\Dropbox\02.My_Job\80.Study\01.Python\00.study_python_3.11.0\01.TEST\game>set PYTHONPATH=D:/Dropbox/02.My_Job/80.Study/01.Python/00.study_python_3.11.0/01.TEST

(py_study_3110) D:\Dropbox\02.My_Job\80.Study\01.Python\00.study_python_3.11.0\01.TEST\game>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.
>>>
.study_python_3.11.0.TEST\game
>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. >>>

여기까지 파이썬 패키지에 대해서 공부하기 위한 준비 작업을 마쳤습니다.
다음 포스팅에 이어서 패키지에 대한 공부를 이어가 보겠습니다.

  • 이 포스팅은 ‘위키독스’ 의 ‘점프 투 파이썬‘ 전자책을 구매하여 독학하기 위한 자료로 작성했습니다.
52. 파이썬 - 패키지의 정의와 만드는 방법