모듈
모듈
모듈은 파이썬 프로그래밍에서 코드를 구조화하고 재사용하는 중요한 방법입니다. 다음은 모듈에 대한 주요 내용입니다:
모듈의 정의
- 모듈은 파이썬 정의와 문장들을 담고 있는 파일입니다.
- 파일 이름은 모듈 이름에 .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
장점
모듈과 스크립트의 이중 기능:
- 파일을 모듈로 임포트할 수 있음
- 동시에 독립적인 스크립트로 실행 가능
조건부 코드 실행:
- 모듈로 임포트될 때는 특정 코드가 실행되지 않음
- 직접 실행될 때만 해당 코드 블록이 실행됨
유용한 용도:
- 모듈에 대한 편리한 사용자 인터페이스 제공
- 테스트 목적 (모듈을 스크립트로 실행하여 테스트 스위트 실행)
모듈 검색 경로
파이썬이 모듈을 찾고 임포트하는 과정은 특정한 순서와 규칙을 따릅니다. 이 과정을 이해하는 것은 모듈 관리와 문제 해결에 중요합니다.
검색 순서
- 내장 모듈
- 인터프리터는 먼저 내장 모듈을 찾습니다.
- 내장 모듈 목록은
sys.builtin_module_names
에서 확인할 수 있습니다.
- 파일 시스템
- 내장 모듈에서 찾지 못하면,
spam.py
라는 파일을 찾습니다. - 검색 경로는
sys.path
에 정의되어 있습니다.
- 내장 모듈에서 찾지 못하면,
sys.path 초기화
sys.path
는 다음 위치에서 초기화됩니다:
- 입력 스크립트의 디렉토리 (또는 현재 디렉토리)
- PYTHONPATH 환경 변수에 지정된 디렉토리들
- 설치에 따른 기본 위치 (일반적으로
site-packages
디렉토리 포함)
주의사항
- 심볼릭 링크가 있는 파일 시스템에서는 입력 스크립트 디렉토리가 심볼릭 링크 변환 후에 계산됩니다.
- 심볼릭 링크를 포함하는 디렉토리는 모듈 검색 경로에 포함되지 않습니다.
sys.path 수정
- 파이썬 프로그램은 실행 중에
sys.path
를 수정할 수 있습니다. - 스크립트 디렉토리는 일반적으로 검색 경로의 맨 앞에 위치합니다.
- 이로 인해 표준 라이브러리의 동일한 이름의 모듈보다 스크립트 디렉토리의 모듈이 우선적으로 로드됩니다.
중요성
- 모듈 검색 경로를 이해하면 모듈 충돌 문제를 해결하는 데 도움이 됩니다.
- 커스텀 모듈의 위치를 적절히 관리하여 의도치 않은 모듈 덮어쓰기를 방지할 수 있습니다.
모듈 검색 경로를 잘 이해하고 관리하면 파이썬 프로젝트의 구조를 더 효과적으로 설계하고 유지할 수 있습니다.
"컴파일된" 파이썬 파일
파이썬은 모듈 로딩 속도를 향상시키기 위해 컴파일된 버전의 모듈을 캐싱합니다. 이 과정에 대한 주요 내용은 다음과 같습니다:
캐싱 메커니즘
- 위치:
__pycache__
디렉토리 - 파일명 형식:
module.version.pyc
- 예: CPython 3.3에서
spam.py
는__pycache__/spam.cpython-33.pyc
로 캐싱
- 예: CPython 3.3에서
컴파일 과정
- 자동화된 과정: 소스 파일의 수정 시간과 컴파일된 버전을 비교
- 플랫폼 독립적: 다른 아키텍처 간에 공유 가능
캐시 검사 예외 상황
- 명령줄에서 직접 로드되는 모듈: 항상 재컴파일, 결과 저장하지 않음
- 소스 모듈이 없는 경우: 캐시 검사하지 않음
최적화 옵션
-O
:assert
문 제거-OO
:assert
문과__doc__
문자열 모두 제거- 주의: 일부 프로그램이 이에 의존할 수 있으므로 신중히 사용
성능 관련 참고사항
.pyc
파일은 로딩 속도만 향상시키며, 실행 속도는 향상시키지 않음
추가 도구
compileall
모듈: 디렉토리 내 모든 모듈의.pyc
파일 생성 가능
주의사항
- 소스 없는 배포: 컴파일된 모듈이 소스 디렉토리에 있어야 하며, 소스 모듈은 없어야 함
이 컴파일 및 캐싱 메커니즘은 파이썬의 성능을 향상시키는 중요한 요소입니다. 개발자는 이 과정을 이해함으로써 더 효율적인 파이썬 애플리케이션을 만들 수 있습니다.
"컴파일된" 파이썬 파일
파이썬은 모듈 로딩 속도를 향상시키기 위해 컴파일된 버전의 모듈을 캐싱합니다. 이 과정에 대한 주요 내용은 다음과 같습니다:
캐싱 메커니즘
- 위치:
__pycache__
디렉토리 - 파일명 형식:
module.version.pyc
- 예: CPython 3.3에서
spam.py
는__pycache__/spam.cpython-33.pyc
로 캐싱
- 예: CPython 3.3에서
컴파일 과정
표준 모듈들
파이썬은 다양한 표준 모듈을 제공하며, 이는 파이썬의 강력한 특징 중 하나입니다. 이에 대한 주요 내용은 다음과 같습니다:
표준 라이브러리
- 파이썬 설치 시 함께 제공되는 모듈들의 집합
- "파이썬 라이브러리 레퍼런스"에서 자세히 설명됨
내장 모듈
- 인터프리터에 내장된 모듈들
- 언어의 핵심은 아니지만 중요한 기능 제공
- 효율성 향상 및 운영 체제 기본 요소에 대한 접근 제공
- 플랫폼에 따라 다를 수 있음 (예: winreg 모듈은 Windows 전용)
sys 모듈
- 모든 파이썬 인터프리터에 내장
- 중요한 시스템 관련 기능 제공
주요 sys 모듈 변수들:
sys.ps1
,sys.ps2
:- 대화형 모드의 프롬프트 문자열 정의
- 예:
import sys sys.ps1 = 'C> ' ```python
sys.path
:- 모듈 검색 경로를 결정하는 문자열 리스트
- PYTHONPATH 환경 변수나 내장 기본값으로 초기화
- 수정 가능:
import sys sys.path.append('/path/to/my/modules')
주의사항
sys.ps1
과sys.ps2
는 대화형 모드에서만 정의됨sys.path
수정은 모듈 임포트 동작에 영향을 줌
표준 모듈들은 파이썬 프로그래밍의 핵심 부분으로, 다양한 기능을 쉽게 사용할 수 있게 해줍니다. 특히 sys
모듈은 파이썬 인터프리터와 상호작용하는 데 중요한 역할을 합니다.
- 자동화된 과정: 소스 파일의 수정 시간과 컴파일된 버전을 비교
- 플랫폼 독립적: 다른 아키텍처 간에 공유 가능
캐시 검사 예외 상황
- 명령줄에서 직접 로드되는 모듈: 항상 재컴파일, 결과 저장하지 않음
- 소스 모듈이 없는 경우: 캐시 검사하지 않음
최적화 옵션
-O
:assert
문 제거-OO
:assert
문과__doc__
문자열 모두 제거- 주의: 일부 프로그램이 이에 의존할 수 있으므로 신중히 사용
성능 관련 참고사항
.pyc
파일은 로딩 속도만 향상시키며, 실행 속도는 향상시키지 않음
추가 도구
compileall
모듈: 디렉토리 내 모든 모듈의.pyc
파일 생성 가능
주의사항
- 소스 없는 배포: 컴파일된 모듈이 소스 디렉토리에 있어야 하며, 소스 모듈은 없어야 함
이 컴파일 및 캐싱 메커니즘은 파이썬의 성능을 향상시키는 중요한 요소입니다. 개발자는 이 과정을 이해함으로써 더 효율적인 파이썬 애플리케이션을 만들 수 있습니다.
dir() 함수
dir()
함수는 파이썬에서 객체의 속성을 탐색하는 데 매우 유용한 내장 함수입니다. 주요 특징과 사용법은 다음과 같습니다:
기본 기능
- 객체가 가진 유효한 속성들의 목록을 반환
- 반환값은 정렬된 문자열 리스트
사용 방법
모듈의 속성 확인:
import fibo dir(fibo) # ['__name__', 'fib', 'fib2']
인자 없이 사용:
- 현재 지역 스코프에 정의된 이름들을 나열
a = [1, 2, 3, 4, 5] import fibo fib = fibo.fib dir() # ['__builtins__', '__name__', 'a', 'fib', 'fibo', 'sys']
- 현재 지역 스코프에 정의된 이름들을 나열
내장 함수와 변수 확인:
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
주요 특징
__init__.py
파일:- 디렉토리를 패키지로 인식하게 함
- 패키지 초기화 코드나
__all__
변수 설정 가능
- 패키지 임포트 방법:
- 전체 경로 사용:
import sound.effects.echo
- 서브모듈 임포트:
from sound.effects import echo
- 특정 함수/변수 임포트:
from sound.effects.echo import echofilter
- 전체 경로 사용:
- 임포트 규칙:
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"]
주의사항
- 로컬에 정의된 이름이 서브모듈을 가릴 수 있음:
# 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__
변수를 신중하게 사용하고, 사용자에게 명확한 임포트 지침을 제공하는 것이 좋습니다.
출처: 파이썬 튜토리얼