티스토리 뷰

개발 언어/파이썬

모듈

jjiiiinn 2024. 7. 9. 23:02
728x90

모듈

모듈은 파이썬 프로그래밍에서 코드를 구조화하고 재사용하는 중요한 방법입니다. 다음은 모듈에 대한 주요 내용입니다:

모듈의 정의

  • 모듈은 파이썬 정의와 문장들을 담고 있는 파일입니다.
  • 파일 이름은 모듈 이름에 .py 확장자를 붙입니다.

사용방법 예시

# Fibonacci numbers module

def fib(n):    # write Fibonacci series up to n
    a, b = 0, 1
    while a < n:
        print(a, end=' ')
        a, b = b, a+b
    print()

def fib2(n):   # return Fibonacci series up to n
    result = []
    a, b = 0, 1
    while a < n:
        result.append(a)
        a, b = b, a+b
    return result

모듈 사용

  • 모듈 임포트

    import fibo
  • 모듈 내 함수 사용

    fibo.fib(1000)
    fibo.fib2(100)
  • 모듈 이름 확인

    print(fibo.__name__)
  • 함수를 지역 이름으로 대입

    fib = fibo.fib
    fib(500)

모듈 더 보기

모듈의 추가 특성

실행 가능한 문장:

  • 모듈은 함수 정의뿐만 아니라 실행 가능한 문장도 포함할 수 있습니다.
  • 이 문장들은 모듈이 처음 임포트될 때 실행되며, 주로 초기화에 사용됩니다.

네임스페이스:

  • 각 모듈은 자체 private 네임스페이스를 가집니다.
  • 모듈 내 함수들은 이 네임스페이스를 전역 네임스페이스로 사용합니다.

모듈 간 임포트:

  • 모듈은 다른 모듈을 임포트할 수 있습니다.
  • 관례상 임포트 문은 모듈의 시작 부분에 위치합니다.

임포트 방식

  • 기본 임포트

    import fibo
  • 특정 이름 임포트

    from fibo import fib, fib2
  • 모든 이름 임포트 (권장하지 않음)

    from fibo import *
  • 별칭 사용

    import fibo as fib
    

or

from fibo import fib as fibonacci


## 모듈을 스크립트로 실행하기
### 기본 개념

- 파이썬 모듈은 일반 스크립트처럼 직접 실행할 수 있습니다.
- 모듈이 직접 실행될 때, `__name__` 변수는 `"__main__"`으로 설정됩니다.

### 사용 방법
- 모듈 파일 (예: fibo.py) 끝에 다음 코드를 추가
```python
if __name__ == "__main__":
    import sys
    fib(int(sys.argv[1]))
  • 명령줄에서 실행
    python fibo.py 50

장점

모듈과 스크립트의 이중 기능:

  • 파일을 모듈로 임포트할 수 있음
  • 동시에 독립적인 스크립트로 실행 가능

조건부 코드 실행:

  • 모듈로 임포트될 때는 특정 코드가 실행되지 않음
  • 직접 실행될 때만 해당 코드 블록이 실행됨

유용한 용도:

  • 모듈에 대한 편리한 사용자 인터페이스 제공
  • 테스트 목적 (모듈을 스크립트로 실행하여 테스트 스위트 실행)

모듈 검색 경로

파이썬이 모듈을 찾고 임포트하는 과정은 특정한 순서와 규칙을 따릅니다. 이 과정을 이해하는 것은 모듈 관리와 문제 해결에 중요합니다.

검색 순서

  1. 내장 모듈
    • 인터프리터는 먼저 내장 모듈을 찾습니다.
    • 내장 모듈 목록은 sys.builtin_module_names에서 확인할 수 있습니다.
  2. 파일 시스템
    • 내장 모듈에서 찾지 못하면, spam.py라는 파일을 찾습니다.
    • 검색 경로는 sys.path에 정의되어 있습니다.

sys.path 초기화

sys.path는 다음 위치에서 초기화됩니다:

  1. 입력 스크립트의 디렉토리 (또는 현재 디렉토리)
  2. PYTHONPATH 환경 변수에 지정된 디렉토리들
  3. 설치에 따른 기본 위치 (일반적으로 site-packages 디렉토리 포함)

주의사항

  • 심볼릭 링크가 있는 파일 시스템에서는 입력 스크립트 디렉토리가 심볼릭 링크 변환 후에 계산됩니다.
  • 심볼릭 링크를 포함하는 디렉토리는 모듈 검색 경로에 포함되지 않습니다.

sys.path 수정

  • 파이썬 프로그램은 실행 중에 sys.path를 수정할 수 있습니다.
  • 스크립트 디렉토리는 일반적으로 검색 경로의 맨 앞에 위치합니다.
  • 이로 인해 표준 라이브러리의 동일한 이름의 모듈보다 스크립트 디렉토리의 모듈이 우선적으로 로드됩니다.

중요성

  • 모듈 검색 경로를 이해하면 모듈 충돌 문제를 해결하는 데 도움이 됩니다.
  • 커스텀 모듈의 위치를 적절히 관리하여 의도치 않은 모듈 덮어쓰기를 방지할 수 있습니다.

모듈 검색 경로를 잘 이해하고 관리하면 파이썬 프로젝트의 구조를 더 효과적으로 설계하고 유지할 수 있습니다.

"컴파일된" 파이썬 파일

파이썬은 모듈 로딩 속도를 향상시키기 위해 컴파일된 버전의 모듈을 캐싱합니다. 이 과정에 대한 주요 내용은 다음과 같습니다:

캐싱 메커니즘

  1. 위치: __pycache__ 디렉토리
  2. 파일명 형식: module.version.pyc
    • 예: CPython 3.3에서 spam.py__pycache__/spam.cpython-33.pyc로 캐싱

컴파일 과정

  • 자동화된 과정: 소스 파일의 수정 시간과 컴파일된 버전을 비교
  • 플랫폼 독립적: 다른 아키텍처 간에 공유 가능

캐시 검사 예외 상황

  1. 명령줄에서 직접 로드되는 모듈: 항상 재컴파일, 결과 저장하지 않음
  2. 소스 모듈이 없는 경우: 캐시 검사하지 않음

최적화 옵션

  • -O: assert 문 제거
  • -OO: assert 문과 __doc__ 문자열 모두 제거
  • 주의: 일부 프로그램이 이에 의존할 수 있으므로 신중히 사용

성능 관련 참고사항

  • .pyc 파일은 로딩 속도만 향상시키며, 실행 속도는 향상시키지 않음

추가 도구

  • compileall 모듈: 디렉토리 내 모든 모듈의 .pyc 파일 생성 가능

주의사항

  • 소스 없는 배포: 컴파일된 모듈이 소스 디렉토리에 있어야 하며, 소스 모듈은 없어야 함

이 컴파일 및 캐싱 메커니즘은 파이썬의 성능을 향상시키는 중요한 요소입니다. 개발자는 이 과정을 이해함으로써 더 효율적인 파이썬 애플리케이션을 만들 수 있습니다.

"컴파일된" 파이썬 파일

파이썬은 모듈 로딩 속도를 향상시키기 위해 컴파일된 버전의 모듈을 캐싱합니다. 이 과정에 대한 주요 내용은 다음과 같습니다:

캐싱 메커니즘

  1. 위치: __pycache__ 디렉토리
  2. 파일명 형식: module.version.pyc
    • 예: CPython 3.3에서 spam.py__pycache__/spam.cpython-33.pyc로 캐싱

컴파일 과정

표준 모듈들

파이썬은 다양한 표준 모듈을 제공하며, 이는 파이썬의 강력한 특징 중 하나입니다. 이에 대한 주요 내용은 다음과 같습니다:

표준 라이브러리

  • 파이썬 설치 시 함께 제공되는 모듈들의 집합
  • "파이썬 라이브러리 레퍼런스"에서 자세히 설명됨

내장 모듈

  • 인터프리터에 내장된 모듈들
  • 언어의 핵심은 아니지만 중요한 기능 제공
  • 효율성 향상 및 운영 체제 기본 요소에 대한 접근 제공
  • 플랫폼에 따라 다를 수 있음 (예: winreg 모듈은 Windows 전용)

sys 모듈

  • 모든 파이썬 인터프리터에 내장
  • 중요한 시스템 관련 기능 제공

주요 sys 모듈 변수들:

  1. sys.ps1, sys.ps2:
    • 대화형 모드의 프롬프트 문자열 정의
    • 예:
      import sys
      sys.ps1 = 'C> '
      ```python
      
      
  1. sys.path:
    • 모듈 검색 경로를 결정하는 문자열 리스트
    • PYTHONPATH 환경 변수나 내장 기본값으로 초기화
    • 수정 가능:
      import sys
      sys.path.append('/path/to/my/modules')

주의사항

  • sys.ps1sys.ps2는 대화형 모드에서만 정의됨
  • sys.path 수정은 모듈 임포트 동작에 영향을 줌

표준 모듈들은 파이썬 프로그래밍의 핵심 부분으로, 다양한 기능을 쉽게 사용할 수 있게 해줍니다. 특히 sys 모듈은 파이썬 인터프리터와 상호작용하는 데 중요한 역할을 합니다.

  • 자동화된 과정: 소스 파일의 수정 시간과 컴파일된 버전을 비교
  • 플랫폼 독립적: 다른 아키텍처 간에 공유 가능

캐시 검사 예외 상황

  1. 명령줄에서 직접 로드되는 모듈: 항상 재컴파일, 결과 저장하지 않음
  2. 소스 모듈이 없는 경우: 캐시 검사하지 않음

최적화 옵션

  • -O: assert 문 제거
  • -OO: assert 문과 __doc__ 문자열 모두 제거
  • 주의: 일부 프로그램이 이에 의존할 수 있으므로 신중히 사용

성능 관련 참고사항

  • .pyc 파일은 로딩 속도만 향상시키며, 실행 속도는 향상시키지 않음

추가 도구

  • compileall 모듈: 디렉토리 내 모든 모듈의 .pyc 파일 생성 가능

주의사항

  • 소스 없는 배포: 컴파일된 모듈이 소스 디렉토리에 있어야 하며, 소스 모듈은 없어야 함

이 컴파일 및 캐싱 메커니즘은 파이썬의 성능을 향상시키는 중요한 요소입니다. 개발자는 이 과정을 이해함으로써 더 효율적인 파이썬 애플리케이션을 만들 수 있습니다.

dir() 함수

dir() 함수는 파이썬에서 객체의 속성을 탐색하는 데 매우 유용한 내장 함수입니다. 주요 특징과 사용법은 다음과 같습니다:

기본 기능

  • 객체가 가진 유효한 속성들의 목록을 반환
  • 반환값은 정렬된 문자열 리스트

사용 방법

  1. 모듈의 속성 확인:

    import fibo
    dir(fibo)
    # ['__name__', 'fib', 'fib2']
  2. 인자 없이 사용:

    • 현재 지역 스코프에 정의된 이름들을 나열
      a = [1, 2, 3, 4, 5]
      import fibo
      fib = fibo.fib
      dir()
      # ['__builtins__', '__name__', 'a', 'fib', 'fibo', 'sys']
  3. 내장 함수와 변수 확인:

    import builtins
    dir(builtins)
    # [많은 내장 함수와 변수들...]

주요 특징

  • 모든 타입의 이름을 나열 (변수, 모듈, 함수 등)
  • 기본적으로 내장 함수와 변수는 나열하지 않음
  • builtins 모듈을 통해 내장 요소들 확인 가능

활용

  • 대화형 환경에서 객체 탐색에 유용
  • 모듈이나 클래스의 구조 파악에 도움
  • 디버깅이나 코드 분석 시 유용

패키지 (Packages)

패키지는 파이썬의 모듈 네임스페이스를 구조화하는 방법으로, "점으로 구분된 모듈 이름"을 사용합니다. 이는 대규모 프로젝트에서 모듈을 체계적으로 관리하는 데 유용합니다.

패키지의 구조

예시: 음향 처리 패키지

sound/
    __init__.py
    formats/
        __init__.py
        wavread.py
        wavwrite.py
        aiffread.py
        aiffwrite.py
    effects/
        __init__.py
        echo.py
        surround.py
    filters/
        __init__.py
        equalizer.py
        vocoder.py

주요 특징

  1. __init__.py 파일:
    • 디렉토리를 패키지로 인식하게 함
    • 패키지 초기화 코드나 __all__ 변수 설정 가능
  2. 패키지 임포트 방법:
    • 전체 경로 사용: import sound.effects.echo
    • 서브모듈 임포트: from sound.effects import echo
    • 특정 함수/변수 임포트: from sound.effects.echo import echofilter
  3. 임포트 규칙:
    • from package import item: item은 서브모듈, 함수, 클래스, 변수 등일 수 있음
    • import item.subitem.subsubitem: 마지막을 제외한 모든 항목은 패키지여야 함

장점

  • 모듈 이름 충돌 방지
  • 대규모 프로젝트의 구조화 용이
  • 관련 기능을 논리적으로 그룹화

사용 예시

import sound.effects.echo
sound.effects.echo.echofilter(input, output, delay=0.7, atten=4)

from sound.effects import echo
echo.echofilter(input, output, delay=0.7, atten=4)

from sound.effects.echo import echofilter
echofilter(input, output, delay=0.7, atten=4)

패키지에서 * 임포트하기

패키지에서 *를 임포트하는 것은 복잡한 주제입니다. 주요 내용을 정리하면 다음과 같습니다:

all 변수

  • __init__.py 파일에서 정의
  • from package import * 시 임포트할 모듈 이름 목록 지정
  • 예:
    # sound/effects/__init__.py
    __all__ = ["echo", "surround", "reverse"]

주의사항

  1. 로컬에 정의된 이름이 서브모듈을 가릴 수 있음:
    # sound/effects/__init__.py
    __all__ = ["echo", "surround", "reverse"]
    

def reverse(msg: str): # 'reverse.py' 서브모듈을 가림
return msg[::-1]


2.  `__all__`이 정의되지 않은 경우:
    -   모든 서브모듈을 임포트하지 않음
    -   패키지가 임포트되고 `__init__.py`의 코드 실행
    -   패키지에 정의된 이름들만 임포트
3.  이전 임포트 문의 영향:
    -   `echo`와 `surround`는 이미 현재 네임스페이스에 있음
```python
import sound.effects.echo
import sound.effects.surround
from sound.effects import *

권장 사항

  • 프로덕션 코드에서는 import * 사용을 피하는 것이 좋음
  • from package import specific_submodule 형태 사용 권장
  • 명시적 임포트가 코드의 가독성과 유지보수성을 높임

결론

패키지에서 *를 임포트하는 것은 복잡성과 예기치 않은 동작을 초래할 수 있습니다. 대신 필요한 모듈이나 함수를 명시적으로 임포트하는 것이 더 안전하고 명확한 방법입니다. 패키지 설계 시 __all__ 변수를 신중하게 사용하고, 사용자에게 명확한 임포트 지침을 제공하는 것이 좋습니다.


출처: 파이썬 튜토리얼

728x90

'개발 언어 > 파이썬' 카테고리의 다른 글

클래스  (1) 2024.07.10
에러와 예외  (0) 2024.07.09
입력과 출력  (0) 2024.07.09
자료구조  (0) 2024.07.09
기타 제어 흐름 도구  (0) 2024.07.09
댓글