Python 모듈과 패키지
- Python
- 2021. 10. 9. 18:36
코드잇의 파이썬 모듈과 패키지 강의를 듣고 정리한 내용입니다.
문제가 될 시 삭제하겠습니다.
파이썬 모듈과 패키지
1. 모듈
01. 모듈이란 ?
- 기능상 성격이 비슷한 또는 연관성 있는 변수와 함수들이 조립된 파일
02. 모듈 사용하기
# area.py
def circle(radius):
return 3.14 * radius * radius
def square(radius):
return 3.14 * radius * radius
- area.py 와 run.py가 같은 폴더 안에 위치할 때 아래와 같이 import 파일명으로 모듈을 불러와서 함수를 사용
# run.py
import area
print(area.circle(2))
print(area.square(9))
print(area.PI)
03. 모듈을 가져오는 여러가지 방법들
# 특정 함수만 가져올 때 : area 모듈에서 circle 함수를 가져와라
from area import circle, square
print(circle(2))
# area 모듈을 ar로 사용하겠다
import area as ar
print(ar.circle(2))
# area 모듈의 모든 함수를 가져온다. 하지만 모듈에서 필요한 함수만 가져오는 것을 추천한다.
from area import *
07. 현재 파일에서 사용 가능한 기능은?
- dir 함수로 현재 파일에서 사용할 수 있는 함수를 알 수 있음
import area
print(dir(())
['__annotations__', '__builtins__', '__cached__', '__doc__', '__file__', '__loader__', '__name__', '__package__', '__spec__', 'area']
print(dir(area))
['PI', '__builtins__', '__cached__', '__doc__', '__file__', '__loader__', '__name__', '__package__', '__spec__', 'circle', 'square']
from area import circle, square
print(dir())
['__annotations__', '__builtins__', '__cached__', '__doc__', '__file__', '__loader__', '__name__', '__package__', '__spec__', 'area', 'circle', 'square']
08. 네임스페이스
네임스페이스 : 파일에서 정의된 모든 이름
# 똑같은 이름의 함수가 나중에 정의된 것이 있으면 나중에 정의된 함수가 쓰임
from area import circle, square
def square(length):
return 4 * length
print(dir())
print(square(3)) # 12
# 모듈에서 가져오는 함수 이름을 바꿔줄 수 있음
from area import circle, square as sq
print(square(3))
print(sq(3))
10. 스탠다드 라이브러리
- int, float, string 같은 자료형
- print, dir 같은 내장 함수
- 유용한 기능을 제공하는 모듈들
13. 모듈 검색 경로
import sys
print(sys.path) # 파이썬이 모듈을 찾기 위해 검색하는 경로가 나옴
- sys.path 에 경로를 추가해줄 수 있음
import sys
sys.path.append('/Users/codeit/Desktop')# macOS
sys.path.append('C:\\Users\\codeit\\Desktop')# Windows
- 모듈을 import 하면 모듈안에 있는 모든 것이 실행됨
17. name 특수변수
__name__ 을 다른 곳에서 불러와서 사용하면 불러온 파일의 모듈명이 나옴
파일을 직접 실행하면 __main__ 으로 결과 값이 나옴
그래서 if __name__ == __main__ : true 이면 파일을 직접 실행했다는 의미
20. main 함수
java나 c, c++ 같은 언어들에서는 어떤 파일을 실행하기보다 파일 안에 있는 main() 이라는 함수를 실행한다.
main 함수는 말 그대로 주요 함수로서 프로그램을 작동시키는 코드를 담고 있다.
파이썬에서는 파일 실행 시 모든 코드가 처음부터 끝까지 실행되지만, main() 함수를 사용하면 가독성이 올라가기 때문에,
아래와 같이 main() 함수를 사용하는 것을 추천한다.
run.py
import area
# 면적 계산기 프로그램
def main():
x = float(input('원의 지름을 입력해 주세요: '))
print('지름이 {}인 원의 면적은 {}입니다.\n'.format(x, area.circle(x)))
y = float(input('정사각형의 변의 길이를 입력해 주세요: '))
print('변의 길이가 {}인 정사각형의 면적은 {}입니다.'.format(y, area.square(y)))
if __name__ == '__main__':
main()
2. 패키지
01. 패키지란?
- 모듈의 묶음
- 프로그램의 구성요소를 쉽게 재활용할 수 있도록
02. 패키지 만들기
- 프로젝트 폴더 안에 Directory 를 만들고, 해당 Directory 에 모듈들을 넣기
- 폴더 안에
__init__
.py 라는 파일을 만들기
03. 패키지 사용하기
shapes/
__init__.py
area.py
volume.py
run.py
import shapes.volume
print(shapes.volume.cube(3))
import shapes.volume as vol
print(vol.cube(3))
from shapes.area import square
print(square(3))
# from shapes import volume == import shapes.volume
import shapes
print(shapes.area.circle(2))
06. __init__ 파일이란?
- python 3.3 ver 이전에는 init 파일 필수 였음. python 3.4 이후에는 init 파일 필수 아님
- 패키지를 불러올 때 무조건 init 파일이 먼저 실행됨
07. __init__ 파일에서 모듈 임포트하기
- __init__ 파일에서 정의해두고, 패지키 모듈을 부르면 __init__ 파일을 먼저 읽기 때문에, 가져와서 사용할수 있음
shapes/
__init__.py
area.py
volume.py
run.py
- __init__.py
PI = 3.14
- volume.py
from shapes import PI
- run.py
- 아래와 같이 패키지 밖에서도 패키지 내의 init 파일에 선언한 내용을 가져올 수 있다.
# PI 직접 임포트
from shapes import PI
# 패키지 임포트 후 shapes. 으로 접근
import shapes
shapes.PI
10. all 특수 변수
import *
모듈을 임포트할 때 from <module> import *
를 하면 모듈의 모든 내용이 임포트됩니다.
하지만 모듈 대신 패키지에 from <package> import *
를 하면 패키지 안에 있는 게 아무것도 임포트되지 않습니다.
__all__
특수 변수
__all__
특수 변수는 우리가 import *
를 했을 때 임포트 대상에서 어떤 것들을 가져와야 하는지를 정해 주는 변수입니다. 임포트 대상에서 내용 전체를 가져오라고 했을 때 '전체'가 무엇인지 정의해 주는 거죠. __all__
은 모듈에도 적용되고 패키지에도 적용됩니다.
__all__
과 모듈
모듈의 __all__
은 모듈에 해당하는 파일에서 정의합니다. 예를 들어 area.py에 아래와 같은 코드를 추가해 주면:
shapes/area.py
# __all__ 정의
__all__ = ['circle', 'square']
PI = 3.14
# 원의 면적을 구해 주는 함수def circle(radius):
return PI * radius * radius
# 정사각형의 면적을 구해 주는 함수def square(length):
return length * length
from shapes.area import *
를 했을 때 area
모듈의 모든 내용이 임포트되지 않고 circle
과 square
함수만 임포트됩니다.
__all__
과 패키지
패키지의 __all__
은 패키지에 해당하는 init 파일에서 정의합니다. 예를 들어 shapes
패키지의 init 파일에 아래와 같은 코드를 추가해 주면:
shapes/__init__.py
# __all__ 정의
__all__ = ['area', 'volume']
이제 from shapes import *
를 하면 area
모듈과 volume
모듈이 임포트됩니다.
__all__
을 사용하면 패키지나 모듈에 import *
를 했을 때 어떤 것들이 임포트되는지를 제어할 수 있습니다. 그래도 여전히 import *
만 봐서는 정확히 어떤 것들이 임포트되는지를 알 수 없기 때문에 import *
는 프로그램에서 정의되는 이름들, 즉 네임스페이스를 완벽히 이해하고 있을 때만 사용하는 것을 추천드립니다.
12. init 파일과 all 사용해보기
- 같은 패키지에서 init 파일을 정의할 때는 from 패키지네임.모듈이름 import * 로 정의할 수 있음
- 패키지 외부에서 import 패키지명으로 불러왔을 때, init 에서 불러온 함수나 변수를 사용할 수 있음
13. 서브패키지
- 패키지 안에 있는 패키지
14. 서브패키지 사용하기
import ...
첫 번째 방식은 import ...
방식입니다.
run.py
# 패키지 임포트import mymath
# 서브패키지 임포트import mymath.shapes
# 모듈 임포트import mymath.shapes.area
# 모듈 안에 있는 변수나 함수는 이 방식으로 임포트 할 수 없음import mymath.shapes.area.circle# 오류
그냥 import
뒤에 가져오고 싶은 모듈이나 패키지를 써 주면 됩니다. 하지만 모듈 안에 있는 변수나 함수는 이 방식으로 임포트 할 수 없습니다.
그리고 (서브)패키지를 임포트할 때는 (서브)패키지 안에서 임포트하고 싶은 걸 (서브)패키지의 init 파일에 적어줘야겠죠?
from ... import ...
두 번째 방식은 from ... import ...
방식입니다.
run.py
# 패키지 안에 있는 패키지 임포트from mymath import shapes
# 패키지 안에 있는 모듈 임포트from mymath.shapes import area
# 모듈 안에 있는 함수 임포트from mymath.shapes.area import circle
# import 뒤에는 . 을 쓸 수 없음from mymath import shapes.area# 오류
from
뒤에는 모듈이나 패키지가 올 수 있습니다. import
뒤에는 모듈이나 패키지 안에서 가져오고 싶은 걸 써 줍니다. import
뒤에는 .
을 쓸 수 없습니다.
17. 상대 경로 임포트
__init__.py
from mymath.shapes import area, volume
from . import area, volume # . 은 현재 init 파일의 위치를 의미
from .area import *
from .volume import *