Python

[Python] 모듈

sian han 2025. 9. 25. 18:18

학습 자료 : https://docs.python.org/ko/3.13/tutorial/modules.html

모듈

자바에서는 자주 사용하는 클래스나 함수들을 패키지로 묶어놓고 import 해서 사용한다. 파이선의 Module이 이와 같은 역할을 한다.

모듈이 왜 필요한가 ?

인터프리터에서 직접 작성한 코드는 종료하면 사라져버린다. 그러나 모듈로 만들면 코드를 파일(*.py)로 저장할 수 있어서 재사용하거나 공유하기가 편리하다.

모듈 불러오기: import

import fibo

위 코드는 fibo 라는 모듈 객체를 만든다. 이 객체를 통해 모듈 안의 함수에 접근할 수 있다.

fibo.fib(1000)
fibo.fib2(100)

__name__ 변수: 스크립트의 이름표

모든 파이썬 모듈에는 __name__이라는 특별한 변수가 있다. 이 변수는 모듈이 어떻게 사용되었는지 알려주는 이름표 역할을 한다. 이 변수는 딱 두가지 값만 갖는다.

  • 1 .'main': 파일을 직접 실행했을 때
    • 터미널에서 python ~.py 처럼 직접 실행하면 fibo.py의 __name__은 'main'이다.
  • 2 .import 로 불러올 때: fibo 모듈을 import 해서 사용하면, fibo.__name__의 값은 'fibo'가 된다.

if __name__ == "__main__":의 핵심 사용법

이 구문은 만약 이파일이 직접 실행되었다면, 아래 코드를 실행하라는 뜻이다. 이건 종종 모듈에 대한 테스트 목적으로 사용된다.

모듈 불러오기

import 가 어떻게 작동하는지 이해해보자

모듈 검색경로 : 자바의 CLASSPATH

자바에서는 .class 파일이나 .jar 파일이 어디에 있는 지 알려주기 위해 CLASSPATH 환경변수를 설정했다. 파이썬의 모듈 검색 경로는 이 CLASSPATH와 같은 역할을 한다.

import spam 명령어를 실행하면 파이썬은 spam.py 파일이 어디 있는지 찾기 위해 정해진 규칙에 따라 여러 디렉터리를 순서대로 탐색한다. 이 탐색 경로는 sys.path 라는 리스트에 저장되어있다.

sys.path 가 담고 있는 디렉터리들

파이썬이 모듈을 찾는 경로는 다음과 같은 순서로 초기화된다.

  • 1 .현재 디렉터리: 가장 먼저, 현재 실행중인 스크립트 파일이 있는 디렉터리를 확인한다. 또는 인터프리터에서 실행할 경우, 현재 작업 중인 디렉터리를 확인한다.
  • 2 .PYTHONPATH 환경 변수: 셸 환경 변수로 설정된 PYTHONPATH 에 지정된 디렉터리를 찾는다.
  • 3 .기본 설치 경로: 파이썬이 설치될 때 기본적으로 포함되는 경로들이다. 여기에는 site-packages 디렉터리가 포함되는데, 여기에 pip로 설치한 모든 외부 라이브러리가 저장된다.

경로의 중요성

위 순서는 매우 중요하다. 예를 들어, fibo.py 라는 파일을 만들어 현재 디렉터리에서 실행하면, 파이썬은 표준 라이브러리의 fibo.py 가 아닌 현재 디렉터리에 있는 fibo.py를 먼저 로드한다.

이러한 우선순위 때문에 같은 이름의 파일을 만들 때 의도치 않게 표준 라이브러리를 가리는(shadowing) 문제가 발생할 수 있다. 그래서 모듈 이름은 다른 유명한 라이브러리와 겹치지 않게 짓는 것이 좋다.

파이썬의 컴파일 된 파일

컴파일된 파이썬 파일: .pyc__pycache__

파이썬은 인터프리터 언어지만, 모듈 로딩 속도를 빠르게 하기 위해 .py 소스코드를 바이트코드(.pyc)로 컴파일하여 캐시한다.

  • __pycache__ 디렉터리: 모듈을 import 하는 순간, 파이썬은 해당 모듈의 .pyc 파일을 이 디렉터리 안에 생성한다.
  • .pyc 파일: 예를 들어 spam.py 의 컴파일된 파일은 __pycache__/spam.cpython-33.pyc 과 같은 이름으로 저장된다. cpython-33은 버전정보를 포함하며, 여러 버전의 파이썬이 같은 모듈을 공유할 수 있도록 한다.

덕분에 다음번 import 시에는 소스 코드를 다시 읽고 해석하는 대신 .pyc파일을 바로 로드하여 더 빠르게 시작할 수 있다.

dir() 함수

이 함수는 마치 무엇이 있는 보여줘 라고 묻는 마법의 열쇠와 같다. 자바의 리플렉션 API 와 유사하다고 생각해도 된다.

dir() 함수: 탐색의 시작점

dir() 함수는 특정 객체가 어떤 속성과 메서드를 가지고 있는지, 또는 현재 스코프(scope)에 어떤 이름들이 정의 되어있는지 정렬된 문자열 리스트로 보여준다. 이는 코드를 탐색할때나 디버깅할 때 매우 유용한 도구이다.

dir()의 활용

1. 모듈의 내용 탐색

해당 모듈 안에 정의된 모든 이름(함수, 클래스, 변수)을 볼 수 있다.

import fibo
import sys

# fibo 모듈이 정의하는 모든 이름 나열
print(dir(fibo))
# 출력: ['__name__', 'fib', 'fib2']

# sys 모듈이 정의하는 모든 이름 나열
print(dir(sys))
# 출력: ['__breakpointhook__', 'argv', 'path', ...]

패키지

패키지는 모듈들의 폴더이다.

파이선의 패키지는 관련있는 여러 모듈들을 하나의 디렉터리 구조로 묶어 관리하는 방법이다. 모듈이 하나의 .py 파일이라면, 패키지는 그 모듈 파일들을 담는 폴더라고 생각하면된다.

패키지 구조

패키지 디렉터리는 반드시 __init__.py 파일을 포함해야 한다. 이 파일은 해당 디렉터리가 파이썬 패키지임을 알려주는 역할을 한다.

sound/
  __init__.py
  formats/
    __init__.py
    wavread.py
  effects/
    __init__.py
    echo.py

패키지 임포트 방법

  1. 전체 경로 임포트: import sound.effects.echo
  2. from...import: from sound.effects import echo
  3. 직접 임포트: from sound.effects.echo import echofilter

import * (와일드카드 임포트)와 all

from sound.effects import * 와 같이 * 를 사용하면, 패키지 안의 모든 모듈을 가져올 것 같지만, 실제로는 그렇지 않다. 이 문법은 오직 패키지의 __init__.py 파일이 정의한 것만 가져온다.

  • __all__ 변수: 패키지 개발자가 __init__.py__all__ = ["echo", "surround"]와 같은 리스트를 정의하면, import *는 이 리스트에 포함된 모듈만 임포트 하게 된다.
  • __all__이 없다면 ? : import *__init.py__에서 정의된 이름들만 가져온다. 이는 대부분의 경우 패키지 내의 모든 모듈을 임포트하지 않기 때문에, import *는 프로덕션 코드에서는 잘 사용되지 않는다.

패키지 내부 간 참조(상대 경로 임포트)

패키지 내부에서 형제 모듈이나 부모 패키지의 모듈을 임포트할 때 상대 경로 임포트를 사용할 수 있다.

  • . (현재 패키지): from . import echofilter(현재 패키지에 있는 echofilter를 임포트)
  • .. (부모 패키지): from .. import formats(부모패키지인 sound에 있는 formats 를 임포트)

하지만 이 방식은 메인스크립트(직접 실행되는 파일)에는 사용할 수 없으며 이 경우 항상 절대 경로 임포트를 사용해야 한다.

'Python' 카테고리의 다른 글

[Python] 자료구조  (0) 2025.09.25
[Python] 조건문·반복문·함수  (0) 2025.09.25