hustle_D 2025. 7. 21. 17:47
반응형

파이썬에서 패키지란 여러개의 모듈(.py파일)을 하나로 묶은 디렉터리 구조를 의미한다.

간단하게는 모듈을 여러개를 담고 있는 폴더 라고 생각하면 된다.

 

이 패키지 파일은 __init__.py를 포함하며 이 파일은 해당 디렉터리가 패키지임을 파이썬한테 인식시켜주는 역할을 하며 내부에는 내용을 작성하지 않아도 되나 일반적으로 초기화 코드를 실행시키거나 서브모듈을 외부에 노출시키거나 패키지 수준에서 사용할 이름을 정의해둔다 .

 

한번 패키지를 만들어보자.

 

패키지 생성

우선 패키지는 하나의 디렉터리를 생성함으로써 시작된다.

먼저 package라는 임의의 명칭의 디렉터리를 하나 생성해주고 그 내부에 두개의 모듈을 추가해주자.

그리고 각각의 내부에 클래스를 생성해주고 내부에는 info라는 명칭으로 내부에서 출력만 하는 메서드를 생성해주자. 

그리고 이제 __init__.py 파일을 하나 생성해주자.

그리고 내부에는 추가적으로 아무것도 작성하지 말고 넘어가자.

이러면 기본적인 패키지의 생성은 완료다

 

패키지의 사용

패키지를 사용하는 방법은 기본적으로 패키지를 import 하는걸로 시작된다 

가장 기본적인 import 방법으로는 아래와 같이 패키지명.모듈명을 import 하는 방법이다.

import package.first_module

이렇게 import 할 시에는 내부에 있는 요소를 지정해서 꺼내는 것은 불가능하다.

가령 클래스를 가져오고 싶다고 

import package.first_module.First_Module

이렇게 가져오는 방법은 불가능 하다.

 

모듈을 가져왔다면 이후 사용방법은 모듈의 사용방법과 동일하다 

fst_md = package.first_module.First_Module()
fst_md.info()

모듈의 요소를 꺼내 사용하면 된다.

 

한번에 여러개의 모듈을 가져오는 것도 가능하다.

이때는 import 시에 여러개의 모듈을 작성해주면 된다.

import package.first_module, package.second_module

fst_md = package.first_module.First_Module()
fst_md.info()

snd_md = package.second_module.Second_Module()
snd_md.info()

 

이때 모듈에 alias를 붙이는 방법도 기존에 모듈에서 as를 사용해서 alias를 붙이는 방법과 동일하다.

import package.first_module as fm, package.second_module as sm

fst_md = fm.First_Module()
fst_md.info()

snd_md = sm.Second_Module()
snd_md.info()

 

패키지 모듈의 요소를 지정해서 가져오고 싶다면 from - import 구분을 사용해서 가져오면 된다.

from package.first_module import First_Module
from package.second_module import Second_Module

fst_md = First_Module()
fst_md.info()

snd_md = Second_Module()
snd_md.info()

이때도 이전 모듈 처럼 네임 스페이스를 작성할 필요가 없어진다.

 

__init__.py

__init__.py는 해당 디렉터리가 파이썬 패키지(package)라는 것을 명시하기 위한 파일로 사용자에게 어떤 클래스, 함수, 상수를 쓸 수 있게 할것인지를 정의하는 패키지의 진입점 역할을 한다.

 

이 파일에는 어떤 것들을 외부로 열어둘것인지를 작성해주는데 여기에는 from - import와 이전에 모듈에서 작성했었던 __add__가 포함된다.

추가로 패키지에서 필요한 초기화로직과 같은 것들이 포함되나 이는 일단은 넘기도록 하자.

 

__init__.py는 먼저 각각의 모듈 내부에 설정대로 외부에 전체 공개하겠다고 한다면 그냥 __all__에 모듈들을 나열해 작성해주면 된다.

__all__ = ["first_module", "second_module"]

이렇게 작성해두면 사용할때 아래와 같이 모듈명.요소명 을 사용해서 외부에서 사용이 가능하다.

from package import *

fm = first_module.First_Module()
sm = second_module.Second_Module()

fm.info()
sm.info()

 

만약 모듈자체를 외부에 공개하지 않고 모듈 내부의 요소들을 선택적으로 외부에 공개하고 싶다면 아래와 같이 사용한다.

from .first_module import First_Module
from .second_module import Second_Module

__all__ = ["First_Module", "Second_Module"]

모듈을 import할때 맨 앞에 .점 을 붙여줘야 경로에서 오류 없이 패키지 내에 원하는 모듈을 가져올 수 있다.

추가로 여기서 __all__를 작성하지 않는다면 모듈에서와 같이 _언더바로 시작하는 요소들은 가져오지 않는다.

 

이렇게 __init__.py를 생성하면 아래와 같이 중간 모듈명을 작성할 필요 없이 패키지명.가져온요소 와 같이 바로 사용이 가능하다

import package

fm = package.First_Module()
sm = package.Second_Module()

fm.info()
sm.info()

또 import 방식을 from-import로 쓴다면 

from package import *

fm = First_Module()
sm = Second_Module()

fm.info()
sm.info()

이렇게 패키지명 까지도 생략이 가능하다.

 

__init__.py에서 import - 방식도 사용이 가능은 하지만 이렇게 사용하면 전체를 열어두는 방식이기에 의도가 있는 경우를 제외하고서는 추천되는 방식은 아닌듯 보인다.

 

반응형