본문 바로가기

Programming languages/Python

10. Module & Package

728x90
반응형

<Module>

 

모듈이란. py를 확장자로 갖는 모든 파이썬 파일을 뜻한다.

 

def add(a,b):
    return a+b

def sub(a,b):
    return a-b

우선 mod1.py라는 형식의 위와 같은 모듈을 만들었다.

새롭게 main.py라는 파일을 연후 위의 모듈을 불러와 본다.

#main.py

import mod1

print(mod1.add(4,7))
#main.py

from mod1 import sub

print(sub(15,9))

위처럼 import를 이용해서 두 가지 방법으로 모듈을 불러올 수 있다.

 

#main.py

from mod1 import *

print(sub(15,9))
print(add(7,9))

import *을 해주면 호출한 모듈에 있는 모든 함수를 사용할 수 있다.

 

#mod1.py
def add(a,b):
    return a+b

def sub(a,b):
    return a-b


if __name__ == "__main__":
    print(add(1,4))
    print(sub(9,5))

위처럼 __name__ 변수를 사용할 경우 mod1.py가 직접 실행될 경우 __name__이 "__main__"으로 바뀌게 된다.

그러나 다른 모듈에서 mod1.py를 import 할 경우 mod1.py의 __name__은 __main__이 아니라 mod1이 된다.

따라서 mod1.py를 직접 실행할 때만 조건문 이하 문장이 실행되고 그렇지 않은 경우 조건문은 거짓이 된다.

따라서 조건문 이하 문장이 실행되지 않는다. 

 

#mod1.py

PI = 3.141592

class Math:
    def solv(self,r):
        return PI *(r ** 2)

def add(a,b):
    return a+b

mod1에 PI를 만들고 원의 넓이를 계산하는 Math 클래스와 덧셈 연산을 하는 함수를 만들었다.

 

#main.py
import mod1

print(mod1.PI)
a = mod1.Math()
print(a.solv(2))

b = mod1.add

print(b(7,8))

위처럼 mod1.py를 main.py에 import를 통해서 호출한다.

위와 같이 활용할 수 있다.

 

#모듈경로 추가시키기

import sys

print(sys.path)

sys.path.append("#모듈파일의 경로")

 

여담으로 꼭 모듈을 불러올 파일의 경로가 동일하지 않아도 불러오는 것이 가능하다.

위 과정을 거치면 파이썬 라이브러리가 저장되어 있는 sys.path에 우리가 원하는 모듈이 존재하는 경로를 추가한다.

이를 통해 별도의 과정 없이 import만 해줘도 모듈을 사용할 수 있게 된다.

 

 

<Package>

 

패키지란 모듈들을 디렉터리 구조로 관리하도록 해주는 것들이다.

 

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/ , grapic/ , play/  등은 서브 디렉터리이다. 이러한 구조는 공동 작업과 유지 보수를 용이하게 한다. 또한 패키지 구조로 만들면 다른 모듈과 이름이 겹치더라도 더 안전하게 사용 가능하다.

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

 

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

위는 모두 패키지에서 동일한 모듈을 호출하는 방법이다.

첫 번째는 echo모듈을 import 하는 방법이다.

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

세 번째는 echo모듈의 함수까지 직접 import 하는 방법이다.

 

패키지 모듈을 설명한 디렉터리 구조를 보면 루트 디렉터리를 비롯한 모든 서브 디렉터리에는 __init__.py라는 파일이 존재한다.

이는 해당 디렉터리가 패키지의 일부를 알려주는 역할을 한다. 디렉터리에 해당 파일이 존재해야하면 해당 디렉토리를 패키지의 일부라고 인식 할 수 있는 것이다.

 

__all__ = ['echo']

 각 디렉토리에 있는 __init__. py에 위와 같은 명령어를 적어주면 다음과 같은 것이 가능하다.

from game.sound import *
echo.echo_test()

이 처럼 패키지 구조에서 모듈에 있는 모든 함수를 사용하기 위해서는 각 디렉터리의 __init__.py에 위의 절차를 진행해줘야 한다.

 

# render.py
from game.sound.echo import echo_test
def render_test():
    print("render")
    echo_test()
# render.py
from ..sound.echo import echo_test

def render_test():
    print("render")
    echo_test()

위는 서브 디렉터리의 모듈에서 다른 서브 디렉토리의 모듈을 호출하고자 할때 위와 같은 방법으로 가능하다.

 graphic/ 디렉토리의 render.py가 sound/ 디렉토리의 echo.py 모듈을 사용하고자 하는 상황이다.

따라서 render.py에 from ~ import를 통해서 함수를 직접 호출했다.

2번의 경우 '..' 는 부모 폴더 '.' 는 현재 폴더를 의미한다. render.py의 부모 폴더는 game이고 game의 현재 폴더에는 sound가 존재한다.

 

이처럼 모듈 기능을 패키지를 통해 더욱더 효율적으로 사용하는 방법을 정리해 봤다.

728x90
반응형

'Programming languages > Python' 카테고리의 다른 글

12. Built-in-function  (0) 2021.12.19
11.Exception  (0) 2021.12.19
9. Class  (0) 2021.12.14
Examples) Chapter4  (0) 2021.12.12
8. Files  (0) 2021.12.11