[python] import 시 path 정의법

[python] import 시 path 정의법 updated_at: 2024-01-19 16:54

import 시 path 정의법

파이썬에서는 import를 활용해 현재 작성하고 있는 파일에서 외부 패키지 및 모듈을 불러와서 처리할 수있는데, 이때 import path에 대해 설명드리겠습니다.

module과 package

Module이란 변수나 함수, 클래스 등을 모아놓은 파일입니다.
Package란 여러 모듈들을 모아 둔 개념입니다.

import package

다양한 import 방식

import pymysql
import pandas as pd
from dotenv import load_dotenv
from database.connMysql import Mysql
from . import userPackage # 동일 경로에 있는 파일
from .technical_utils import *

import 명령을 사용시 파이썬은 다음의 3 곳을 순서대로 돌아다니며 package를 찾습니다.

sys.modules
built-in modules
sys.path

sys.modules

파이썬이 module이나 package를 찾기 위해 가장 먼저 둘러보는 곳으로, 이미 import된 module과 package들을 dictionary 형태로 저장하고 있습니다.

import sys

>>> print(sys.modules)
{
  'sys': <module 'sys' (built-in)>, 
  'builtins': <module 'builtins' (built-in)>, 
  '_frozen_importlib': <module 'importlib._bootstrap' (frozen)>,
  '_imp': <module '_imp' (built-in)>, 
  ...... 
}

built-in modules

파이썬에서 제공하는 공식 라이브러리들 입니다.

sys.path

파이썬 라이브러리들이 설치되어있는 경로를 보여주며, string을 요소로 갖고 있는 리스트로 이루어져 있습니다. 각각 아래와 같이 나타납니다.

>>> import sys
>>> print(sys.path)
[
  'D:\\py-project\\stock_crawler', 
  'C:\\Anaconda3-64\\envs\\stock_crawler\\python39.zip',
  'C:\\Users\\Pondol\\AppData\\Roaming\\Python\\Python39\\site-packages',
  ....
]

sys.path에서도 찾지 못하면 파이썬은 ModuleNotFoundError를 반환합니다.

사용자 제작 package

오늘 다룰 부분이 사용자가 직접 제작한 package 인데 이 경우는 import path 를 정의해야 합니다.

Absolute Path(절대 경로)

절대 경로는 말 그대로 import를 하는 파일이나 경로에 상관 없이 항상 동일한 경로를 작성합니다.
ProjectDirectory > PackageDirectory > moduleName.py 에 import할 클래스 혹은 함수가 존재한다면

from PackageDirectory.moduleName import ClassOrFunctions

참고로 current directory 라고 하는 현재의 프로젝트 디렉토리는 default로 sys.path 에 포함되게 됩니다. 그러므로 absolute path는 current directory 로 부터 경로를 시작하게 되는것입니다.

Relative Path(상대 경로)

상대 경로는 현재 import를 하는 위치를 기준으로 경로를 정의합니다. 그래서 일반적으로 상대 경로는 local package 안에서 다른 local package를 import 할 때 사용합니다.

from . import UserClass

dot(.)은 import가 선언된 파일의 현재 위치를 이야기하고, 현재 위치는 PackageDirectory > moduleName.py 이므로 현재 위치에서 원하는 모듈의 경로만 정의해주면 됩니다.

평점을 남겨주세요
평점 : 5.0
총 투표수 : 1

질문 및 답글