Python #21 l 파이썬 날개달기_패키지(Package)

신승호·2021년 3월 25일
0

Python

목록 보기
22/35
post-custom-banner

List

  • 파이썬 날개달기
    • 클래스(class)
    • 모듈(module)
    • 패키지(package)
    • 예외처리(exception)
    • 내장함수
    • 라이브러리(library)
    • 연습문제

파이썬 날개달기_패키지(Package)


패키지(Packages)란 무엇인가?

패키지

  • 도트(.) 를 사용하여 파이썬 모듈을 계층적(디렉터리 구조)로 관리 할 수 있게 해준다.
  • A.B라는 모듈이 있다면 패키지 이름A 모듈 이름 B

가상의 game 패키지

game/			# 디렉터리 이름 (루트 디렉터리)
    __init__.py		# 파이썬 모듈(확장자가 .py인 파일)
    sound/		# 디렉터리 이름(서브 디렉터리)
        __init__.py	# 파이썬 모듈(확장자가 .py인 파일)
        echo.py		# 파이썬 모듈(확장자가 .py인 파일)
        wav.py		# 파이썬 모듈(확장자가 .py인 파일)
    graphic/		# 디렉터리 이름(서브 디렉터리)
        __init__.py	# 파이썬 모듈(확장자가 .py인 파일)
        screen.py	# 파이썬 모듈(확장자가 .py인 파일)
        render.py	# 파이썬 모듈(확장자가 .py인 파일)
    play/		# 디렉터리 이름(서브 디렉터리)
        __init__.py	# 파이썬 모듈(확장자가 .py인 파일)
        run.py		# 파이썬 모듈(확장자가 .py인 파일)
        test.py		# 파이썬 모듈(확장자가 .py인 파일)

init.py 파일의 용도

패키지 만들기

패키지 기본 구성 요소 준비

  • .py파일 생성
# echo.py
def echo_test():
    print ("echo")
# render.py
def render_test():
    print ("render")
  • 아래보이는 것과 같이 디렉터리(루트 디렉터리, 서브 디렉터리) 생성 후 파일추가
/Users/SEUNGHOSHIN/Documents/doit/game/__init__.py
/Users/SEUNGHOSHIN/Documents/doit/game/sound/__init__.py
/Users/SEUNGHOSHIN/Documents/doit/game/sound/echo.py
/Users/SEUNGHOSHIN/Documents/doit/game/graphic/__init__.py
/Users/SEUNGHOSHIN/Documents/doit/game/graphic/render.py
  • 명령 프롬프트 창에서 set 명령어로 PYTHONPATH 환경 변수에 C:/doit 디렉터리를 추가한다. 그리고 파이썬 인터프리터(Interactive shell)를 실행
C:\> set PYTHONPATH=C:/doit
C:\> python
Type "help", "copyright", "credits" or "license" for more information.

반드시 명령 프롬프트에서 파이썬 인터프리터를 실행하여 진행해야함 (IDLE셸, 비쥬얼 스튜디오 에선 오류 생김

패키지 안의 함수 실행하기

패키지 안의 함수를 실행하기 위한 3가지 방법

  • 도트 연산자.를 사용해서 import a.b.c를 할 때 마지막 항목(c)는 반드시 모듈 또는 패키지여야만 한다.
  • echo 모듈import하여 실행하는 방법
    • from 디렉터리1. 디렉터리2. 모듈이름
>>> import game.sound.echo
>>> game.sound.echo.echo_test()
echo
  • echo 모듈이 있는 디렉터리까지를 from ... import하여 실행하는 방법
    • from 디렉터리1. 디렉터리2 import 모듈이름
>>> from game.sound import echo
>>> echo.echo_test()
echo
  • echo 모듈의 echo_test 함수를 직접 import하여 실행하는 방법
    • from 디렉터리1. 디렉터리2. 모듈이름 import 함수
>>> from game.sound.echo import echo_test
>>> echo_test()
echo

실행 불가

  • import 디렉터리1 + 디렉터리2.디렉터리3.모듈.함수()
>> 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 디렉터리1.디렉터리2.디렉터리3.모듈.함수()
>> import game.sound.echo.echo_test
Traceback (most recent call last):
    File "<stdin>", line 1, in <module>
ImportError: No module named echo_test
  • import game을 수행하면 game디렉터리의 모듈(.py 파일)들과 __init__.py정의한 것만 참조할 수 있다.

init.py

init.py 용도

  • __init__.py파일은 해당 디렉터리가 패키지의 일부분임을 알려줌

    • 만약 game, sound, graphic이 패키지에 포함된 디렉터리에 __init__.py가 없으면 패키지로 인식 자체가 안됨

Relative 패키지

다른 디렉터리 안에있는 모듈을 사용하기

  • 만약 graphic 디렉터리render.py(모듈)sound 디렉터리echo.py(모듈)을 사용하고싶다면?
  • render 모듈에서 from … import … 사용해서 진행
# render.py
from game.sound.echo import echo_test
def render_test():
    print ("render")
    echo_test()
  • 부모 디렉터리 사용
# render.py
from ..sound.echo import echo_test	# from 뒤 .. 은 부모 디렉터리를 의미
def render_test():
    print ("render")
    echo_test()
  • graphicsound의 부모 디렉터리는 game이며,
  • graphicsound동일한 깊이(depth)이므로 부모 디렉터리를 가르키는 ..을 사용하여 import가 가능하다

relative한 접근자에는 다음과 같은 것이 있다.

  • . . – 부모 디렉터리
  • . – 현재 디렉터리
    **모듈안에서만 사용 가능 / 파이썬 인터프리터에서 사용 불가
profile
신승홉니다
post-custom-banner

0개의 댓글