본문 바로가기
프로그래밍/파이썬 Python

[파이썬 문법] 7-2. 패키지(Package) 개념과 사용법- 질문으로 공부하기

by it-수다쟁이증후군 2023. 4. 13.

Q1. 나)
파이썬에서 패키지의 개념과 사용법에 대해서 설명해 주세요.

"7-3패키지 개념과 사용법 총정리"문자을 타이포그라피로 만든 썸네일

A1.ssam)
패키지는

  • 모듈을 구조화하고
  • 모듈을 관리하는 방법입니다.
  • 패키지는 여러 모듈을 포함하며,
  • 하위 패키지를 가질 수도 있습니다.
  • 이를 통해 코드를 재사용하고,
  • 모듈 간의 네임스페이스를 구분하며,
  • 프로젝트를 효율적으로 관리할 수 있습니다.

패키지 사용법:

1) 패키지 생성:

  • 패키지는 폴더로 생성합니다.
  • 폴더 내에 __init__.py 파일을 생성해야 합니다.
    이 파일은 패키지를 초기화하며,
    다른 모듈에서 패키지를 임포트할 때 실행됩니다.

예시:

my_package/
    __init__.py
    module1.py
    module2.py

2. 패키지 사용:

  • 패키지 내의 모듈을 사용하려면,
  • import 문을 사용하여 모듈을 가져옵니다.
  • 패키지 이름과 모듈 이름을 점(.)으로 구분해야 합니다.

예시: 파일 구조:

main.py
my_package/
    __init__.py
    greetings.py

greetings.py:

def say_hello():
    print("안녕하세요!")

def say_goodbye():
    print("안녕히 가세요!")

main.py:

# 패키지에서 모듈 가져오기
import my_package.greetings

# 모듈의 함수 사용
my_package.greetings.say_hello()	#출력 : 안녕하세요!
my_package.greetings.say_goodbye()	#출력 : 안녕히 가세요!

# 'from...import...' 문을 사용해 특정 함수를 직접 가져올 수도 있습니다.
from my_package.greetings import say_hello

# 이렇게 간단하게 함수를 호출할 수 있습니다.
say_hello()	#출력 : 안녕하세요!

3. 하위 패키지 사용:

  • 하위 패키지를 사용하려면,
  • 패키지 이름과 하위 패키지 이름을 점(.)으로 구분하여 임포트합니다.

예시:파일 구조:

main.py
my_package/
    __init__.py
    greetings.py
    sub_package/
        __init__.py
        module1.py

module1.py:

def foo():
    print("하위 패키지의 모듈1의 함수 foo를 호출했습니다.")

main.py:

# 하위 패키지에서 모듈 가져오기
import my_package.sub_package.module1

# 모듈의 함수 사용
my_package.sub_package.module1.foo() #출력 : 하위 패키지의 모듈1의 함수 foo를 호출했습니다.

이렇게 패키지를 사용하면, 코드를 모듈화하고 재사용성을 높이며 프로젝트를 효율적으로 관리할 수 있습니다.

Q2. 나)
"모듈 간의 네임스페이스를 구분하며" 이 문장이 뜻하는 의미는 무엇인가요?

A2.ssam)
네임스페이스(namespace)는

  • 파이썬에서 변수, 함수, 클래스, 모듈 등의 이름을 관리하는 공간입니다.
  • 네임스페이스는 이름 충돌을 방지하고,
  • 코드를 더욱 깔끔하게 유지하도록 돕습니다.

"모듈 간의 네임스페이스를 구분하며"라는 문장의 의미는, 패키지를 사용함으로써 서로 다른 모듈에서 동일한 이름의 변수, 함수, 클래스 등이 존재할 때 충돌 없이 각각의 모듈에서 해당 이름을 사용할 수 있도록 구분한다는 것입니다.

예를 들어, 두 개의 모듈에서 동일한 함수 이름 'say_hello()'를 가지고 있다고 가정해 봅시다.

module1.py:

def say_hello():
    print("module1에서 안녕하세요!")

module2.py:

def say_hello():
    print("module2에서 안녕하세요!")

이 경우, 패키지를 사용하여 모듈 간의 네임스페이스를 구분하면 아래와 같이 각 모듈의 함수를 충돌 없이 사용할 수 있습니다.

main.py:

import my_package.module1
import my_package.module2

my_package.module1.say_hello()  # 출력: module1에서 안녕하세요!
my_package.module2.say_hello()  # 출력: module2에서 안녕하세요!

이렇게 패키지와 모듈을 사용하면, 각 모듈의 네임스페이스를 구분하여 코드의 가독성과 유지 관리가 용이해집니다.

Q3. 나)
뜻은 알겠는데 실제 사용할 때는 문장이 너무 길어지면 불편할 것 같은데 말이지 편리하게 사용하는 방법은 없나요?

A3.ssam)
긴 문장을 줄이는 대안으로 from...import...as... 구문과 import...as... 구문을 사용할 수 있습니다. 이를 통해 코드를 더 간결하게 작성할 수 있습니다.

예제를 통해 설명하겠습니다.

파일 구조:

main.py
my_package/
    __init__.py
    module1.py
    module2.py

module1.py:

def say_hello():
    print("module1에서 안녕하세요!")

module2.py:

def say_hello():
    print("module2에서 안녕하세요!")

1) import...as... 구문 사용하기:

import...as... 구문을 사용하면 모듈을 임포트 할 때 별칭(alias)을 지정할 수 있습니다. 이렇게 하면 긴 모듈 이름을 간결하게 사용할 수 있습니다.

main.py:

import my_package.module1 as m1
import my_package.module2 as m2

m1.say_hello()  # 출력: module1에서 안녕하세요!
m2.say_hello()  # 출력: module2에서 안녕하세요!

2) from...import...as... 구문 사용하기:

from...import...as... 구문을 사용하면 패키지나 모듈에서 특정 함수, 클래스 등을 직접 가져와 사용할 수 있습니다.

main.py:

from my_package.module1 import say_hello as say_hello1
from my_package.module2 import say_hello as say_hello2

say_hello1()  # 출력: module1에서 안녕하세요!
say_hello2()  # 출력: module2에서 안녕하세요!

이렇게 from...import...as...import...as... 구문을 사용하면 긴 문장을 줄이고 코드를 간결하게 작성할 수 있습니다.

Q4. 나)
패키지에서 모듈을 빼서 임포트 하는데 패키지 자체를 임포트 하면 안 되나요?

A4.ssam)
패키지 자체를 직접 임포트 하면 그 패키지의 __init__.py 파일이 실행됩니다. 그러나 일반적으로 패키지의 __init__.py 파일에는 패키지 초기화 코드가 포함되어 있지만, 패키지에 속한 모듈의 함수나 클래스를 직접 사용할 수 없습니다.

패키지를 임포트 하면 패키지 내의 모듈, 함수, 클래스 등을 자동으로 가져오지 않습니다. 그래서 패키지를 사용하려면 패키지 내의 모듈을 명시적으로 임포트해야 합니다.

다만, 패키지의 __init__.py 파일에 코드를 추가하여 패키지를 임포트 할 때 모듈을 자동으로 가져오게 할 수 있습니다. 예를 들어, 아래와 같이 패키지의 __init__.py 파일에 모듈을 임포트 하는 코드를 추가하면, 패키지를 임포트 할 때 해당 모듈이 함께 임포트 됩니다.

my_package / __init__.py:

#__init__.py

from . import module1
from . import module2

그러나 이 방법을 사용할 때 주의해야 할 점은,

  • 패키지를 임포트할 때 해당 패키지의 모든 모듈이 임포트되므로,
  • 불필요한 코드가 실행될 수 있다는 것입니다.
  • 이로 인해 메모리 사용량이 증가하거나
  • 프로그램 실행 속도가 느려질 수 있습니다.
  • 따라서 일반적으로는 필요한 모듈만 명시적으로 임포트하는 것이 좋습니다.

Q5. 나)
패키지 초기화 코드의 예시를 들어서 설명해 주세요.

A5.ssam)
패키지 초기화 코드는 패키지의 __init__.py 파일에 작성됩니다. 초기화 코드의 주요 목적은 패키지가 임포트 될 때 필요한 설정을 수행하거나, 패키지 수준에서 공통적으로 사용되는 변수나 함수를 정의하는 것입니다.

예를 들어, 아래와 같은 패키지를 생각해 봅시다.

my_package/
    __init__.py
    module1.py
    module2.py

1) 패키지 레벨의 변수 정의: __init__.py 파일에 패키지 전체에서 사용할 수 있는 변수를 정의할 수 있습니다.

## my_package / __init__.py:

# 패키지 수준의 변수 정의
package_variable = "패키지 전체에서 사용할 수 있는 변수"

2) 패키지 레벨의 함수 정의: __init__.py 파일에 패키지 전체에서 사용할 수 있는 함수를 정의할 수 있습니다.

## my_package / __init__.py

# 패키지 수준의 함수 정의
def package_function():
    print("패키지 전체에서 사용할 수 있는 함수")

3) 패키지 초기화 코드 : __init__.py 파일에 패키지를 초기화하는 코드를 작성할 수 있습니다.

  • 예를 들어, 패키지를 임포트할 때 로깅 설정을 수행하거나,
  • 패키지 내 모듈을 자동으로 임포트하는 등의 작업을 할 수 있습니다.
## my_package / __init__.py

# 패키지 초기화 코드 예시: 로깅 설정
import logging

logging.basicConfig(level=logging.INFO)
logger = logging.getLogger(__name__)

logger.info("my_package 패키지가 초기화되었습니다.")

# 패키지 내 모듈을 자동으로 임포트하는 코드 (일반적으로 권장되지 않음)
from . import module1
from . import module2

이렇게 작성된 초기화 코드는 패키지가 임포트될 때 자동으로 실행됩니다.

  • 이를 통해 패키지 사용에 필요한 설정이나 변수, 함수 등을 준비할 수 있습니다.
  • 하지만 초기화 코드에 불필요한 작업이 포함되어 있다면,
  • 메모리 사용량이 증가하거나
  • 프로그램 실행 속도가 느려질 수 있으므로 주의해야 합니다.

추가.ssam)
이상으로 기초적으로 알아야 할 것들을 정리했습니다. 아래는 추가적으로 알아볼 몇 가지 주제들입니다. 일단 참고만 하시고 실제로 패키지를 구성할 때 조금 더 깊이 있게 공부하기를 추천합니다.

  1. 패키지 내부에서 모듈 상호 참조
  • 패키지 내부에서 모듈 간에 참조할 때, 전체 패키지 이름을 사용하여 참조할 수 있음
  • from 패키지이름 import 모듈이름 형태로 모듈을 임포트하면, 전체 패키지 이름을 생략할 수 있음
  1. 패키지 초기화(Initialization)
  • 패키지가 임포트될 때, __init__.py 파일이 실행되어 패키지를 초기화함
  • __init__.py 파일에는 패키지의 초기화 코드를 작성할 수 있음
  • 패키지가 사용될 때마다 초기화 코드가 실행되는 것을 방지하기 위해, __init__.py 파일에서 초기화 코드를 최소화해야 함
  1. 패키지 캐싱(Package Caching)
  • 한 번 임포트된 패키지는 캐싱하여 다음에 임포트할 때, 캐시된 패키지를 사용함
  • 패키지가 수정되었을 경우, 패키지를 다시 임포트해야 수정된 패키지를 사용할 수 있음
  1. 상대경로(Relative Path)
  • 패키지 내부에서 모듈을 임포트할 때, 상대경로를 사용할 수 있음
  • .은 현재 패키지를, ..은 상위 패키지를 의미함
  • 예를 들어, from .. import mymodule과 같이 상대경로로 모듈을 임포트할 수 있음
  1. 패키지 데이터(Package Data)
  • 패키지에는 코드 외에도 데이터 파일을 포함할 수 있음
  • 데이터 파일은 패키지 내부의 특정 경로에 저장되어야 함
  • 패키지 데이터는 pkg_resources 모듈을 사용하여 접근할 수 있음
  1. 패키지 배포(Package Distribution)
  • 패키지를 배포하기 위해서는, 패키지를 패키지화하고 패키지 배포 도구를 사용하여 배포해야 함
  • 패키지 배포 도구로는 setuptools, distutils 등이 있음
  • 패키지를 배포하기 위해서는, 패키지의 메타데이터를 작성해야 함
  • 패키지의 메타데이터에는 패키지 이름, 버전, 저작권 정보 등이 포함됨

이러한 내용들을 이해하면, 패키지를 더욱 효율적으로 사용하고 배포할 수 있습니다.

Last.ssam)
패키지도 규모만 커졌을 분이지 모듈과 거의 비슷합니다. 개념적으로 어려운 부분은 없습니다. 꼼꼼히만 따져서 구조화만 잘 시키면 됩니다. 아래는 오늘의 질문 목록입니다.

  1. Q1) 파이썬에서 패키지의 개념과 사용법 에 대해서 설명해주세요.
  2. Q2) "모듈 간의 네임스페이스를 구분하며" 이 문장이 뜻하는 의미는 무엇인가요?
  3. Q3) 네임스페이스를 편리하게 사용하는 방법은 없나요?
  4. Q4) 패키지에서 모듈을 빼서 임포트 하는데 패키지 자체를 임포트 하면 안되나요?
  5. Q5) 패키지 초기화 코드의 예시를 들어서 설명해줘
  6. Q6) 추가사항 : 패키지 내부에서 모듈 상호 참조, 패키지( 초기화 / 캐싱 / 상대경로 / 데이터 / 배포 )
 

[파이썬 문법] 7. 모듈vs패키지vs라이브러리(개념정리) - 질문으로 공부하기

Q1. 나) 모듈과 패키지, 그리고 라이브러리에 대해서 설명해 주세요 A1.ssam) 모듈(Module)과 패키지(Package)와 라이브러리(Library)는 파이썬에서 코드의 재사용성을 높이기 위한 기능입니다. 1)모듈(Modul

it-plus.tistory.com

 

[파이썬 문법] 7-1. 모듈(Module)사용법과 경로지정2가지 - 질문으로 공부하기

Q1.나) 모듈의 개념과 사용법 에 대해서 알려주세요. A1.ssam) 모듈(Module)은 파이썬에서 관련된 코드를 그룹화하고, 재사용하기 쉽게 만든 파일입니다. 모듈은 함수, 클래스, 변수 및 상수 등을 포함

it-plus.tistory.com

댓글