Module & Package 란
파이썬에서 변수나 함수 그리고 클래스 등을 모아놓은 파일입니다.
- 다른 파일에서 재사용이 가능함.
- 전체 코드가 한 파일에 넣기에는 너무 커졌을때 여러 파일로 나누어서 정리를 하기 위해서.
Module
- 단순한 파이썬 파일 한개
- 파일을 만든후 그 안에 재사용 하고 싶은 함수나 클래스 혹은 변수를 구현
my_module_var = 7
def my_module_func():
return "Hello!"
class MyModuleClass:
pass
Package
- module보다 더 크고 복잡한 코드
- 여러 파일에 나누어져 있는 코드들도 다른 곳에서 하나의 module로 불러와서 사용할 수 있도록 해주는것이 package 임.
- Package는 파이썬 파일들로 이루어져 있는 디렉토리(directory)가 하나의 package가 됩니다. 그리고
디렉토리 이름
이 package 이름이 된다.
├── mypackage
│ ├── my_module1.py
│ └── my_module2.py
__init__.py
- package가 import 될때 초기 설정해주는 파일
├── mypackage
│ ├── __init__.py
│ ├── my_module1.py
│ └── my_module2.py
특징1: Import 할때 경로의 총 길이 줄여주기
- 함수를 호출 할때마다 매번 모든 경로를 다 입력해줘야 하기때문에 번로움
__init__.py
에 해당 모듈을 import를 해 놓으면 그럴 필요가 없음.
- 함수 이름을 곧바로 호출 할 수 있게 함.
from .mod1 import func2
from pkg import func2
func2()
특징2: Package에서 import 할 수 있는 변수/함수/클래스 제한하기
- 내부적으로만 사용되어야 하고 밖으로 노출 시키고 싶지 않고 싶을 때, 사용
__all__
변수의 지정되어 있는 함수/변수/클래스만 외부에서 사용 할 수 있음
__all__
변수의 default 값은 모든 함수/변수/클래스 입니다.
from .mod1 import func2
from .mod2 import func3
__all__ = ['func2', 'func3']
from pkg import *
func2()
func3()
func4()
특징3: package가 import될때 꼭 먼저 실행되어야 하는 코드 작성
Import
Module 및 Package를 불러올때 사용하는 키워드
문법
Import ...
- 가장 기본적이 방법
- 사용 방법: import
<모듈>
from ... import ...
- 모듈 이름을 붙이지 않고 곧바로 원하는 함수나 변수 그리고 클래스를 호출할 수 있습니다.
- 모듈에서 사용하는 것이 명확할때 사용하면 편리함.
- 사용 방법: from
<모듈>
import <함수/변수/클래스>
Import As
- 모듈에 새로운 이름을 부여해서 불러오는 기능
- 여러 모듈을
import
할 시 이름 충돌을 방지 가능
- 너무 긴 이름을 짧은 이름을 변경
- 사용 방법
- import <모듈>
as <새로운 이름>
- from <모듈>
import <함수/변수/클래스>
as <새로운 이름>
Path
모듈을 import 시에 해당 모듈이 있는 경로를 지정해줘야 되는데 2가지 방법이 있음.
Absolute Path(절대 경로)
- 파일이나 경로에 상관없이 항상 경로가 동일
- 최상단 디렉토리를 기준으로 경로를 정의함.
- 일반적으로 local package를 import 할때 사용됨.
- 경로가 길어질 수 있는 단점이 있음
Relative Path(상대 경로)
- import 하는 위치를 기준으로 경로를 정의함.
- 일반적으로 local package 안에서 다른 local package를 import 할때 사용됨.
- 파일의 위치를 변경시 상대경로를 다시 설정해줘야 되는 단점이 있음
Import Search 순서
1. sys.modules
- 단순한 dictionary 이며, 이미 import된 모듈과 package들을 저장하고 있음.
- 한번이라도 import된 모듈과 package들은 파이썬이 또 다시 찾지 않아도 되도록 하는 기능을 가지고 있음.
- 새로 import 하는 모듈은
sys.modules
에서 찾을 수 없음.
2. built-in modules
- 파이썬에서 제공하는 파이썬 공식 라이브러리들
- Built-in 모듈들은 이미 파이썬에 포함되어 나오므로 파이썬이 쉽게 찾을 수 있음.
3. sys.path
- list이며 string 요소들을 가지고 있는 list 입니다.
- 각 string 요소들은 경로를 나타냅니다.
4. 못 찾았을 시
- ModuleNotFoundError 에러를 리턴
기타
sys.modules과 sys.path를 바꾸거나 출력 할 수 있음
여기서 sys는 built-in modules모듈로 파이썬에서 제공하는 공식 라이브러임 (파이썬에 포함되어 있음)
import sys
print(sys.path)
print(sys.modules)
잘못된 import시에 보이는 에러
ImportError: attempted relative import with no known parent package
- 주로 실행시키는 파이썬 파일에서 상대경로로 import시에 보실수 있습니다.
- 우선은 파이썬3은 암묵적인 상대경로를 지원하지 않습니다.참고
- 상대경로는 현재 모듈의 위치를 기준으로 하는데, name속성에 의해 결정됩니다.
- 하지만 직접실행 시키게 되면 name 속성이 main이 되게 되는데, main이라는 모듈의 위치를 알 수 없으므로 에러가 발생합니다.
- 따라서 직접 실행 시켜야되는 파일에 파이썬모듈을 import시에는
절대경로
를 사용해야됩니다.
Reference
파이썬 상대경로 import 에러
Python 3의 상대경로 import 문제 피해가기