본문 바로가기
Computer & Program/python

[python] Package & Module

by TDRemon 2024. 3. 10.
반응형

안녕하세요. TDR입니다.

오늘은 python에서 Package(패키지), Module(모듈), 다른 폴더의 파일 등을 import하는 방법을 간략히 정리해보겠습니다.

먼저 패키지, 모듈이 뭔지 보면 다음과 같습니다.

Package(패키지)

특정 기능과 관련된 여러 모듈을 묶은 것. 패키지는 모듈에 네임스페이스를 제공.

Module(모듈)

특정 기능(변수, 함수, 클래스 등)을 .py 파일 단위로 작성한 것

흔히 python을 설치하면 기본적으로 쓸 수 있는 것들을 내장 모듈이라고 부릅니다. (ex. math, sys, etc)

 

이러한 기능들을 쓰기 위해서는 작성 중인 코드에 가져와야 하는데, 이것들을 어떻게 가져오는지 살펴보겠습니다.

## Directory 구조 ##
/root
 - /utils
  + util.py : UtilClass 존재. util() 존재.
 - /modules
  + module.py
 + main.py
 + test.py : TempClass 존재
 
## main.py ##
# 같은 레벨에 있는 moduel 가져와 쓰기
# 방법 1
import test
instance = test.TempClass()

# 방법 2
from test import *
instance = TempClass()

# 방법 3
from test import TempClass
instance = TempClass()

## 방법 2와 3의 차이는 Class만 가져올지, 해당 파일 안에 모든 것을 가져올지 차이

# 하위 폴더 접근
# 방법 1
from utils import util
instance = util.UtilClass()

# 방법 2
from utils.util import *
instance = UtilClass()

## 방법 1에서는 module을 import하기 때문에 module_name.claa or module_name.function과 같이
## 사용 가능. 방법 2에서는 util.py의 모든 것을 import하기 때문에 사실 상 같은 파일에 정의한
## 것과 같이 사용 가능.

위 내용을 보면 대략적인 사용법은 알 수 있을 것이고, "하위 폴더 접근"의 방법 1과 방법 2가 있는데, 언듯 보기에는 방법 2로 개발하는게 편해 보입니다. 하지만 만약 현재 작업 중인 코드와 import 해온 코드에 같은 이름의 함수, 클래스가 있을 경우 import 해온 것이 아닌 현재 코드에 있는 것이 호출됩니다. 그런 경우 의도하지 않은 실행이 될 수 있기 때문에 방법 1과 같은 방법을 통해 명시적으로 특정 모듈의 함수, 클래스를 호출해야 하는 경우가 있습니다.

 

다음은 import 해오는 모듈 또는 함수, 클래스의 이름이 너무 길거나 현재 상황에 맞는 다름 이름으로 재정의 하는 방법을 살펴 보겠습니다.

import some_long_long_class_or_function as something

from temp import temp_module_class as some_class, temp_module_function as some_func

첫번째 예시는 너무 긴 클래스 또는 함수를 something이라는 짧은 이름으로 재정의 하였습니다. (사실 상황에 맞는 이름으로 재정의 하는 것을 추천 드립니다.) 두번째 예시는 한번에 여러 클래스 또는 함수에 대해서 이름을 재정의 하는 방법을 소개하고 있습니다.

 

마지막으로 from, import를 할 때 상대 경로, 절대 경로를 사용하여 패키지 또는 모듈을 가져오는 방법을 알아보겠습니다.

## Directory 구조 ##
/root : /home/root
 - /utils
  + util.py : UtilClass 존재. util() 존재.
 - /modules
  + module.py
 + main.py
 + test.py : TempClass 존재
 
## module.py에서 util.py 참조
# 상대 경로
from ..utils.util import *
 
# 절대 경로
import sys
sys.path.append('/home/root')
from utils.util import *

상대 경로의 경우, ..을 통해 상위 디렉터리로 이동 후 utils package에 접근하고 있습니다.

절대 경로의 경우 python 내장 모듈인 sys를 이용하여 path 자체를 지정해 주고 있습니다. 그러고 지정한 path를 기준으로 패키지나 모듈을 불러오고 있습니다.

개인적으로는 단순하게 한 두개 참조하는 경우에는 상대 경로를 써도 무방하다고 생각하나, 대규모로 개발을 진행하는 경우에는 절대 경로를 사용하는 것을 추천드립니다. 물론, 서로 다른 환경에서의 path의 통합 문제는 유의하셔야 합니다.

반응형

'Computer & Program > python' 카테고리의 다른 글

[python] String(문자열) 포함 여부 확인  (0) 2024.03.14
[python] Python 특징  (0) 2024.03.12
[python] Format(f-string)  (0) 2024.03.07
[python] Format(String Formatting)  (0) 2024.03.06
[python] Format(Format Specifier)  (0) 2024.03.05

댓글