Python 12 Module
모듈(Module)
개념
- 모듈 : 변수나 함수 그리고 클래스 등을 모아놓은 파일
- 모듈을 만들어놓음으로써 다른 파일에서 재사용 가능, 유지보수 용이
만들기
- 파일을 만들고 그 안에 재사용하고 싶은 함수, 클래스, 변수 등을 구현하면 끝
- 확장자는
.py
이어야 함 - my_module이라는 모듈을 만들고 그 안에 변수, 함수, 클래스를 담아서 저장했다
사용
- 사용할 때 :
import <모듈이름>
ex) import my_module
이렇게 모듈을 불러왔다면 이제 사용하고 싶은 변수/함수/클래스를 사용할 수 있음
<모듈이름>.<변수/함수/클래스>
ex) my_module.
- 이렇게 만들어놓은 모듈을 임포트해오면 그 안에 구현해놓은 것들을 쓸 수 있음
- pracprac에서 my_module_func()라는 함수를 정의한 적이 없지만 모듈파일에서 구현해놓았기 때문에 바로 리턴값이 나오는 것을 확인할 수 있음
from <모듈이름> import <변수/함수/클래스>, ...
를 하면 모듈 이름을 붙이지 않고 바로 원하는 요소를 호출할 수 있음
ex) from my_module import my_module_func
from <모듈이름> import *
: 해당 모듈의 모든 요소가 곧바로 import
불러온 모듈의 요소의 이름을 바꾸고 싶을 때
from <모듈이름> import <변수/함수/클래스> as <바꿀이름>
- 모듈 이름도 변경 가능
import <모듈이름> as <바꿀이름>
패키지(Package)
개념
- 패키지도 모듈과 똑같은 개념이지만, 여러 파이썬 모듈들이 모여진 것이 패키지
- 모듈처럼 import해서 사용
import pkg.mod1
from pkg.mod2 import func2
pkg.mod1.func2()
func2()
__init__
__init__
: 이 파일을 통해 package 초기 설정을 해줌- package 안에
__init__
이 파일이 있으면 package가 import 될때__init__
파일의 코드들이 자동으로 실행 __init__.py
의 역할- import할때 경로의 총 길이 줄여주기
- package에서 import할 수 있는 변수/함수/클래스 제한하기
- 그 외 package가 import될때 꼭 먼저 실행되어야 하는 코드들
1) mport할때 경로의 총 길이 줄여주기
위의 그림에서 pkg의 mod1의 func2라는 함수를 import하여 사용하기 위해서 아래와 같이 경로를 번거롭게 다 타입해줘야 함
import pkg.md1
pkg.mod1.func2()
이를 간단히 하는 방법은 원하는 요소를 __init__.py
에 먼저 한 번 import해주면 됨
#`__init__.py`
from .mod1 import func2
func2()
2) package에서 import할 수 있는 변수/함수/클래스 제한하기
__all__
변수 : package를 통해 import 될 수 있는 요소들은 모두__all__
변수를 통해 정의됨. dafault 값은 모든 함수/변수/클래스
__all__
= string을 값으로 하는 요소를 가지고 있는 list
#`__init__.py`
from .mod1 import func2
from .mod2 import func2
__all__ = ['func2', 'func3']
func2()
이렇게 하면 정의된 func2와 func3 함수만 import 될 수 있고 이 외의 모든 함수는 import 될 수 없음
Django
- 파이썬으로 작성된 오픈 소스 웹 프레임워크. package
- 설치 방법 : 터미널에서
pip install Django
Import Search 순서
파이썬이 모듈/package를 찾는 순서
- sys.modules
- 파이썬이 가장 먼저 확인하는 곳
- 단순한 dictionary이고 이미 import된 모듈/package를 저장하고 있음
- 새로 import하는 모듈은 여기서 찾을 수 없음
- built-in modules
- 파이썬에서 제공하는 공식 라이브러리들
- 이미 파이썬에 포함되어 있는 모듈들
- sys.path
- 가장 마지막으로 보는 장소
- string 요소들을 가지고 있는 List 형태
- 각 string 요소들은 경로를 나타냄
- sys는 파이썬에 포함되어 있는 모듈
- 위 3개 에서도 못찾으면
ModuleNotFoundError
리턴
Absolute Path & Relative Path
- 직접 개발한 local package를 import 할 때는 해당 package의 위치에 맞게 import 경로를 잘 선언해야 함
Absolute Path
- import를 하는 파일이나 경로에 상관없이 항상 경로가 동일
└── my_app
├── main.py
├── package1
│ ├── module1.py
│ └── module2.py
└── package2
├── __init__.py
├── module3.py
├── module4.py
└── subpackage1
└── module5.py
예를 들어 🔴의 function2 함수를 import 하는 과정을 파이썬 형식으로 표현하면,
my_app.package2.subpackage1.module5.py
이고, 이미 my_app 프로젝트 안에 있기 때문에 이건 생략
package2.subpackage1.module5.py
from, import 키워드를 사용해서 정리하면
from package2.subpackage1.module5.py import function2
my_app 프로젝트 내에서는 어느 위치에서라도 function2를 import하기 위해서 위와 도일한 경로를 가지게 됨. absolute path는 current directory로부터 경로를 시작. local package를 import 할 때 사용. 경로가 길어질 수 있는 단점
Relative Path
- import 하는 위치를 기준으로 경로를 정의함
- 일반적으로 local package 안에서 다른 local package를 Import 할 때 사용
└── my_app
├── main.py
├── package1
│ ├── module1.py
│ └── module2.py
└── package2
├── __init__.py
├── module3.py 🔵
├── module4.py
└── subpackage1
└── module5.py 🟢
-
현재 위치는 package2/module3.py 라고 가정
-
package2의 module3에서 같은 곳인 package2의 class1을 import
👉🏼from . import class1
여기서 dot(.)은 import가 선언되는 파일의 현재 위치 -
package2의 subpackage1의 module5dml function2 함수를 import
👉🏼from .subpackage1.module5 import function2
-
dot 2개(..)는 현재 위치에서 상위 디렉토리로 가는 경로
# subpackage1/module5.py
from ..module4 import class4
결론
상대 경로는 길이는 줄여줄 수 있지만 파일 위치가 변경되면 그에 따라 경로 위치도 변경되어야 해서 혼란을 야기할 수 있으므로 절대 경로 사용 권장
Author And Source
이 문제에 관하여(Python 12 Module), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://velog.io/@maxkmh/Python-12-모듈저자 귀속: 원작자 정보가 원작자 URL에 포함되어 있으며 저작권은 원작자 소유입니다.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)