Python: Modules & Packages import

Tasic·2021년 5월 16일
0

Python

목록 보기
6/7

Module & Package 란

파이썬에서 변수나 함수 그리고 클래스 등을 모아놓은 파일입니다.

  • 다른 파일에서 재사용이 가능함.
  • 전체 코드가 한 파일에 넣기에는 너무 커졌을때 여러 파일로 나누어서 정리를 하기 위해서.

Module

  • 단순한 파이썬 파일 한개
  • 파일을 만든후 그 안에 재사용 하고 싶은 함수나 클래스 혹은 변수를 구현
## my_module.py
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를 해 놓으면 그럴 필요가 없음.
  • 함수 이름을 곧바로 호출 할 수 있게 함.
# __init__.py
from .mod1 import func2

# main.py
from pkg import func2

func2()

특징2: Package에서 import 할 수 있는 변수/함수/클래스 제한하기

  • 내부적으로만 사용되어야 하고 밖으로 노출 시키고 싶지 않고 싶을 때, 사용
  • __all__ 변수의 지정되어 있는 함수/변수/클래스만 외부에서 사용 할 수 있음
  • __all__ 변수의 default 값은 모든 함수/변수/클래스 입니다.
# __init__.py
from .mod1 import func2
from .mod2 import func3

__all__ = ['func2', 'func3']

# main.py
from pkg import *

func2()
func3()
func4() ## func4 함수는 __all__ 에 정의되지 않았으므로 import 될 수 없음.

특징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 문제 피해가기

profile
블로그 옮겼습니다 (https://jotasic.github.io)

0개의 댓글