1. 프로젝트 디렉터리 구조 구성
모듈화된 Python 패키지를 제작하기 위해 아래와 같은 디렉터리 구조를 준비한다. 각 하위 모듈은 별도의 서브패키지(suba, subb)로 정의되며, __init__.py 파일을 포함하여 Python에서 인식 가능한 패키지로 만든다.
.
├── setup.py
├── suba
│ ├── __init__.py
│ ├── aa.py
│ └── bb.py
└── subb
├── __init__.py
├── cc.py
└── dd.py
2. setup.py 작성: 패키지 메타데이터 정의
setup.py는 패키지의 빌드 및 설치를 담당하는 스크립트로, distutils 또는 setuptools를 사용할 수 있다. 현재 예제에서는 distutils.core.setup을 이용하며, py_modules에 포함할 모든 모듈을 점(.) 표기법으로 명시한다.
from distutils.core import setup
setup(
name="testModule",
version="1.0",
description="간단한 테스트용 모듈",
author="test",
py_modules=[
'suba.aa',
'suba.bb',
'subb.cc',
'subb.dd'
]
)
3. 빌드 과정 수행
빌드 명령어를 실행하면 소스 코드가 build/lib 디렉터리 아래로 복사되며, 설치를 위한 중간 형태의 구조가 생성된다.
python3 setup.py build
실행 후 생성된 디렉터리 구조:
build/
└── lib/
├── suba/
│ ├── __init__.py
│ ├── aa.py
│ └── bb.py
└── subb/
├── __init__.py
├── cc.py
└── dd.py
4. 소스 배포판 압축 파일 생성
sdist 명령어를 사용해 타겟 시스템에 배포할 수 있는 tar.gz 형식의 아카이브를 생성한다. 이 파일은 다른 머신에서도 설치 가능하다.
python3 setup.py sdist
생성된 아티팩트는 dist/ 디렉터리 내에 위치하며, 이름은 testModule-1.0.tar.gz이다. 출력 로그에서 메타데이터 누락 경고가 발생할 수 있는데, 이는 선택적 필드인 author_email이나 README, MANIFEST.in 파일이 없기 때문이다.
5. 외부 환경에서 패키지 설치
생성된 압축 파일을 다른 위치로 복사한 후, 압축을 해제하고 설치를 진행한다.
cp dist/testModule-1.0.tar.gz /root/
cd /root/
tar xf testModule-1.0.tar.gz
cd testModule-1.0
python3 setup.py install
설치 과정에서 모듈이 site-packages 디렉터리에 복사되고, 파이썬 바이트코드(.pyc) 파일이 자동으로 컴파일된다. 설치 완료 후 Python 인터프리터에서 임포트 테스트를 수행할 수 있다.
python3
>>> import suba
>>> import suba.aa
>>> from subb import cc
모든 임포트가 성공하면 패키지가 정상적으로 설치된 것이다.