[Python] 파이썬 절대 경로와 상대경로 import

참조


1. import 요약

  • python에서 py 파일은 모듈이라고 합니다.
  • python에서 __init__.py가 포함된 폴더를 패키지라 합니다. (python3는 조금 다름)
  • 모듈이 다른 모듈이나 패키지를 액세스 하기 위해 import를 사용합니다.

2. import 작동 원리

import abc
  • python은 abc를 찾는다.
    1. sys.modules를 확인한다. sys.modules는 이전에 가져온 모든 모듈의 캐시이다.
    2. 내장 모듈 목록을 확인한다.
    3. sys.path를 기준으로 확인한다.
    4. sys.path는 현재 폴더가 포함된다.
  • 이름은 찾을 수 없는 경우 ModuleNotFoundError를 반환합니다.

3. import 문의 구문

  • 패키지를 가져오는 경우 __init__.py를 모듈로 가져옵니다.
import abc
  • abc 패키지 혹은 모듈을 직접 가져옵니다.
from abc import xyz
  • abc 패키지에서 xyz 모듈 , 하위패키지 , 클래스 혹은 함수를 가져옵니다.
import abc as other_name
  • 가져온 이름을 바꾼다. other_name으로 참조를 사용합니다.

4. import 문 스타일

  • import문을 작성할 때 지침이 있습니다. (https://pep8.org/#imports)
    1. import는 모듈 주석 뒤 파일 맨위에 작성해야 한다.
    2. import는 그 종류에 따라 구분해라. 공백을 두어 구분하라
      • 표준 라이브러리
      • 타사 패키지
      • 로컬 패키지
"""Illustration of good import statement styling.

Note that the imports come after the docstring.
"""

# Standard library imports
import datetime
import os

# Third party imports
from flask import Flask
from flask_restful import Api
from flask_sqlalchemy import SQLAlchemy

# Local application imports
from local_module import local_class
from local_package import local_function

5. 절대 경로 import

  • 경로
    └── project
      ├── package1
      │   ├── module1.py
      │   └── module2.py
      └── package2
          ├── __init__.py
          ├── module3.py
          ├── module4.py
          └── subpackage1
              └── module5.py
  • 사용방법
from package1 import module1
from package1.module2 import function1
from package2 import class1
from package2.subpackage1.module5 import function2
  • 직관적이고 부작용이 작습니다.

6. 상대 경로 import

  • python3에서는 암시적 상대 경로가 더이상 지원되지 않는다. 명시적 상대 경로를 사용합니다.
  • 경로
└── project
    ├── package1
    │   ├── module1.py
    │   └── module2.py
    └── package2
        ├── __init__.py
        ├── module3.py
        ├── module4.py
        └── subpackage1
            └── module5.py
  • 사용방법
# package1/module1.py
from .module2 import function1
# package2/module3.py
from . import class1
from .subpackage1.module5 import function2
  • 상대 경로를 사용하면 절대 경로로 작성하는 경우보다 짧게 작성할 수 있는 상황이 많습니다.
728x90

이 글을 공유하기

댓글

Designed by JB FACTORY