<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가 존재한다.
이처럼 모듈 기능을 패키지를 통해 더욱더 효율적으로 사용하는 방법을 정리해 봤다.
'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 |