# 1. Distutils 소개

참고

이 문서는 https://setuptools.readthedocs.io/en/latest/setuptools.html 의 `setuptools` 설명서가 현재 여기에 포함된 모든 관련 정보를 독립적으로 다루기 전까지만 보존됩니다.

이 문서는 개발자/배포자의 역할에 집중하면서, Distutils를 사용하여 파이썬 모듈을 배포하는 방법을 다룹니다: 파이썬 모듈 설치에 대한 정보를 찾으려면 파이썬 모듈 설치 (레거시 버전) 장을 참조하십시오.

## 1.1. 개념과 용어

Distutils를 사용하는 것은 모듈 개발자와 제삼자 모듈을 설치하는 사용자/관리자 모두에게 매우 간단합니다. 개발자로서, 당신의 책임은 (물론, 견고하고, 잘 설명되고 잘 테스트 된 코드 작성과는 별도로) 다음과 같습니다:

- 설정 스크립트 작성 (일반적으로 `setup.py`)

- (선택 사항) 설정 구성 파일 작성

- 소스 배포판 만들기

- (선택 사항) 하나 이상의 빌드된 (바이너리) 배포판 만들기

이러한 각 작업은 이 문서에서 다룹니다.

모든 모듈 개발자가 다수의 플랫폼에 액세스 할 수 있는 것은 아니므로, 다수의 빌드된 배포판을 만들 것으로 기대할 수 있는 것은 아닙니다. 이러한 요구를 해결하기 위해 패키저(packagers)라는 중개자 클래스가 생길 것으로 기대됩니다. 패키저는 모듈 개발자가 배포한 소스 배포판을 가져와서, 하나 이상의 플랫폼에서 빌드한 후, 만들어진 빌드된 배포본을 배포합니다. 따라서, 대부분의 인기 있는 플랫폼의 사용자는 설정 스크립트를 실행하지도 코드를 컴파일하지도 않으면서 대부분의 인기 있는 파이썬 모듈 배포판을 가장 자연스러운 방식으로 플랫폼에 설치할 수 있게 될 것입니다.

## 1.2. 간단한 예

설정 스크립트는 일반적으로 매우 간단합니다만, 파이썬으로 작성되기 때문에, 할 수 있는 작업에 대한 임의의 제한이 없고, 설정 스크립트에 임의의 비싼 연산을 수행하지 않도록 주의해야 합니다. 예를 들어, Autoconf 스타일 구성 스크립트와 달리, 설정 스크립트는 모듈 배포를 빌드하고 설치하는 과정에서 여러 번 실행될 수 있습니다.

파일 `foo.py`에 포함된, `foo`라는 모듈을 배포하는 것이 원하는 전부라면, 설정 스크립트는 다음과 같이 간단할 수 있습니다:

    from distutils.core import setup
    setup(name='foo',
          version='1.0',
          py_modules=['foo'],
          )

몇 가지 관찰 사항:

- Distutils에 제공하는 대부분의 정보는 `setup()` 함수에 키워드 인자로 제공됩니다.

- 이러한 키워드 인자는 두 가지 범주로 분류됩니다: 패키지 메타데이터(이름, 버전 번호)와 패키지에 무엇이 포함되는지에 관한 정보 (이 경우, 순수 파이썬 모듈의 리스트)

- 모듈은 파일 이름이 아닌 모듈 이름으로 지정됩니다 (패키지와 확장에도 동일하게 적용됩니다)

- 메타데이터를 조금 더 제공하는 것이 좋습니다, 특히 여러분의 이름, 이메일 주소 및 프로젝트의 URL (예는 섹션 설정 스크립트 작성하기를 참조하십시오)

이 모듈의 소스 배포를 만들려면, 위 코드를 포함하는 설정 스크립트 `setup.py`를 만들고, 터미널에서 이 명령을 실행하십시오:

    python setup.py sdist

윈도우의 경우, 명령 프롬프트 창(Start ‣ Accessories)을 열고 명령을 다음과 같이 바꾸십시오:

    setup.py sdist

sdist는 설정 스크립트 `setup.py`와 모듈 `foo.py`를 포함하는 아카이브 파일(예를 들어 유닉스의 타르볼(tarball), 윈도우의 ZIP 파일)을 만듭니다. 아카이브 파일의 이름은 `foo-1.0.tar.gz`(또는 `.zip`)가 되고, 디렉터리 `foo-1.0`에 압축이 풀립니다.

최종 사용자가 `foo` 모듈을 설치하려면, `foo-1.0.tar.gz`(또는 `.zip`)를 다운로드하여, 압축을 풀고, — `foo-1.0` 디렉터리에서 — 다음을 실행하기만 하면 됩니다:

    python setup.py install

그러면 `foo.py`를 파이썬 설치에서 제삼자 모듈을 위한 적절한 디렉터리에 복사합니다.

이 간단한 예는 Distutils의 몇 가지 기본 개념을 보여줍니다. 먼저, 개발자와 설치자 모두 같은 기본 사용자 인터페이스(즉 설정 스크립트)를 갖습니다. 차이점은 사용하는 Distutils 명령(commands)입니다: sdist 명령은 거의 모듈 개발자 전용이지만, install은 설치자를 위한 경우가 많습니다 (대부분의 개발자는 때때로 자신의 코드를 설치하려고 하지만).

다른 유용한 빌드된 배포 형식은 bdist_rpm 명령으로 구현된 RPM, Solaris pkgtool (bdist_pkgtool) 및 HP-UX swinstall (bdist_sdux) 입니다. 예를 들어, 다음 명령은 `foo-1.0.noarch.rpm`이라는 RPM 파일을 만듭니다:

    python setup.py bdist_rpm

(bdist_rpm 명령은 rpm 실행 파일을 사용해서, 레드햇 리눅스(Red Hat Linux), SuSE 리눅스 또는 Mandrake 리눅스와 같은 RPM 기반 시스템에서 실행해야 합니다.)

다음을 실행하여 언제든지 사용 가능한 배포 형식을 찾을 수 있습니다:

    python setup.py bdist --help-formats

## 1.3. 일반적인 파이썬 용어

이 문서를 읽고 있다면, 아마도 모듈, 확장 등이 무엇인지 잘 알고 있을 것입니다. 그런데도, 모든 사람이 공통된 출발점에서 시작하도록 하기 위해, 다음과 같은 일반적인 파이썬 용어에 대한 용어집을 제공합니다:

모듈

  파이썬에서 코드 재사용의 기본 단위: 다른 코드가 임포트 한 코드 블록. 세 가지 유형의 모듈을 여기에서 다룹니다: 순수 파이썬 모듈, 확장 모듈 및 패키지.

순수 파이썬 모듈

  파이썬으로 작성되고 단일 `.py` 파일 (그리고 아마도 관련된 `.pyc` 파일)에 포함된 모듈. “순수 모듈” 이라고도 합니다.

확장 모듈

  파이썬 구현의 저수준 언어로 작성된 모듈: 파이썬에서는 C/C++, Jython에서는 Java. 일반적으로 동적으로 로드할 수 있는 단일 사전 컴파일된 파일에 포함됩니다, 예를 들어 유닉스의 파이썬 확장을 위한 공유 객체 (`.so`) 파일, 윈도우의 파이썬 확장을 위한 DLL (`.pyd` 확장자) 또는 Jython 확장을 위한 Java 클래스 파일. (현재 Distutils는 파이썬의 C/C++ 확장만 처리합니다.)

패키지

  다른 모듈을 포함하는 모듈; 일반적으로 파일 시스템의 디렉터리에 포함되며 파일 `__init__.py`의 존재로 다른 디렉터리와 구별됩니다.

루트 패키지

  패키지 계층의 루트 (이것은 `__init__.py` 파일을 가지고 있지 않기 때문에, 진짜 패키지는 아닙니다. 그러나 우리는 이것에 뭔가 이름을 붙여야 합니다.) 표준 라이브러리의 대부분은 루트 패키지에 있으며, 더 큰 모듈 컬렉션에 속하지 않는 많은 소규모 독립형 제삼자 모듈도 마찬가지입니다. 일반 패키지와 달리, 루트 패키지에 있는 모듈은 여러 디렉터리에서 찾을 수 있습니다: 실제로 `sys.path`에 나열된 모든 디렉터리는 모듈을 루트 패키지에 제공합니다.

## 1.4. Distutils 관련 용어

다음 용어는 Distutils를 사용하여 파이썬 모듈을 배포하는 도메인에 더 구체적으로 적용됩니다:

모듈 배포

  다운로드 가능한 단일 리소스로 함께 배포되고 함께 설치하는 파이썬 모듈 모음입니다. 잘 알려진 몇 가지 모듈 배포의 예는 NumPy, SciPy, Pillow 또는 mxBase입니다. (이것은 이 용어가 파이썬 문맥에서 이미 사용된 것을 제외하고는 패키지라고 부릅니다: 단일 모듈 배포에는 0, 1 또는 여러 파이썬 패키지가 포함될 수 있습니다.)

순수한 모듈 배포

  순수한 파이썬 모듈과 패키지만 포함하는 모듈 배포. 때때로 “순수 배포” 라고도 합니다.

순수하지 않은 모듈 배포

  적어도 하나의 확장 모듈을 포함하는 모듈 배포. 때때로 “비순수 배포” 라고도 합니다.

배포 루트

  소스 트리(또는 소스 배포)의 최상위 디렉터리; `setup.py`가 존재하는 디렉터리. 일반적으로 이 디렉터리에서 `setup.py`가 실행됩니다.