Python으로 개발하다보면 setup.py를 작성할 일이 많습니다. 아무래도 Falsede.js의 package.json, Rust의 Cargo.toml 같이 의존성을 관리할 수 있는데다, 만든 프로그램을 패키지로 만들때도 필요한 물건이다보니 중요성이 높습니다. 의존성 관리는 requirements.txt같은 것으로도 충분하다고 생각하실 수 있겠지만, 이쪽이 더 깔끔하다고 생각합니다.

그래서 이번에 PyPI에 패키지를 하나 올리는 김에 사용되는 인자가 무엇이 있는지 알아보았습니다. 아래에 공식 자료들 중 제가 아는 선에서 자주 쓰이는 것들을 정리하였습니다.


name

  • 필수 필드: True
  • 필드 타입: str
  • 출처: distutils
  • 공식 설명: name of the package

패키지의 이름을 정할 때 씁니다. 보통의 경우에는 상관 없을 수도 있지만, pypi에 올리는 경우에는 이름이 겹치는 것은 없는지 주의해야 합니다.

version

  • 필수 필드: True
  • 필드 타입: str
  • 출처: distutils
  • 공식 설명: version of this release

패키지의 현재 버전을 적으면 됩니다. Python쪽에선 major.miFalser[.patch[.sub]] 형태로 작성할 것을 추천하고 있습니다. Python 내부적으로는 버전 표현에 tuple을 쓰는 것과는 대조적이므로 주의해야 합니다.

author

  • 필수 필드: Half
  • 필드 타입: str
  • 출처: distutils
  • 공식 설명: package author’s name

패키지 작성자의 이름을 적으면 됩니다. 아래 나올 maintainerauthor 중의 하나는 반드시 작성되어야 합니다.

author_email

  • 필수 필드: Half
  • 필드 타입: str
  • 출처: distutils
  • 공식 설명: email address of the package author

패키지 작성자의 메일 주소를 적으면 됩니다. email 주소이긴 하지만 email.headerregistry.Address 같은 것을 요구하는 것은 아니므로 그냥 문자열로 적으면 됩니다. 아래 나올 maintainer_emailauthor_email 중의 하나는 반드시 작성되어야 합니다. 또 하나 주의할 점이라면 이 메일을 수집해서 스팸을 보낼 수도 있으므로 적당히 가공을 하는 편이 좋습니다. 예를 들면 아래처럼 할 수 있습니다.

setup(
    ...,
    author_email='item4_hun' '@' 'hotmail.com',
    ...,
)

사실 조금만 더 열심히 파싱하면 들통날 방법이지만, 적어도 직통으로 스팸이 오는 것은 막아줍니다.

maintainer

  • 필수 필드: Half
  • 필드 타입: str
  • 출처: distutils
  • 공식 설명: package maintainer’s name

패키지 관리자의 이름을 적으면 됩니다. 위에 나온 authormaintainer 중 하나는 반드시 작성되어야 합니다.

author_email

  • 필수 필드: Half
  • 필드 타입: str
  • 출처: distutils
  • 공식 설명: email address of the package maintainer

패키지 관리자의 메일 주소를 적으면 됩니다. email 주소이긴 하지만 email.headerregistry.Address 같은 것을 요구하는 것은 아니므로 그냥 문자열로 적으면 됩니다. 위에 나온 author_emailmaintainer_email 중의 하나는 반드시 작성되어야 합니다.

url

  • 필수 필드: True
  • 필드 타입: str
  • 출처: distutils
  • 공식 설명: home page for the package

패키지의 웹 사이트를 적으면 됩니다. 별도의 웹 사이트가 있는 경우엔 웹 사이트를 적으면 되고, 적당히 GitHub 등의 저장소 주소를 적어도 됩니다.

description

  • 필수 필드: False
  • 필드 타입: str
  • 출처: distutils
  • 공식 설명: short, summary description of the package

패키지에 대한 짧은 설명입니다. GitHub으로 예를 들자면 저장소 소개를 짧게 적는 칸 같은 느낌입니다. 너무 길지 않게 적는 것이 좋습니다.

long_description

  • 필수 필드: False
  • 필드 타입: bytes
  • 출처: distutils
  • 공식 설명: longer description of the package

PyPI에서 패키지 설명 본문으로 사용됩니다. 보통 README로 작성된 것을 읽어서 불러들여서 씁니다. 주의할 점은, 이 부분은 Restructured Text로 작성되어야만 합니다. markdown 등의 포맷은 전혀 지원되지 않으니 주의를 요합니다.

download_url

  • 필수 필드: False
  • 필드 타입: str
  • 출처: distutils
  • 공식 설명: location where the package may be downloaded

패키지를 어디서 다운받을 수 있는지를 적습니다. 실제 다운로드에 쓰이는 것은 아니고, PyPI 사이트에 출력하는 용도로 쓰입니다. 보통 저장소에서 제공하는 tarball 등을 다운로드 대상으로 삼습니다.

classifiers

  • 필수 필드: False
  • 필드 타입: list of str
  • 출처: distutils
  • 공식 설명: a list of classifiers

이 패키지가 어느 분류에 속하는지 설명하는 용도로 쓰입니다. 넣을 수 있는 속성은 아무렇게나 넣어도 동작은 하는 것 같지만, 대체적으로 이미 정형화되어있는 단어들을 쓰는 편입니다. PyPI의 공식 목록을 참고하시면 됩니다. PyPI 사이트에서 태깅 형태로 사용됩니다.

license

  • 필수 필드: False
  • 필드 타입: str
  • 출처: distutils
  • 공식 설명: license for the package

패키지의 저작권을 적는 필드입니다. 본디 용도는 classifiers만으로 설명이 안되는 저작권을 설명하는 용도입니다.

packages

  • 필수 필드: True
  • 필드 타입: list
  • 출처: distutils
  • 공식 설명: 없음

해당 패키지에 포함될 내용을 기입하는 용도로 쓰입니다. 보통 직접 작성 안하고 setuptools.find_packages 함수를 사용합니다.

zip_safe

zip 파일로 만들어서 실행해도 패키지가 정상적으로 동작하는지에 대한 설정입니다.

install_requires

  • 필수 필드: False
  • 필드 타입: str or list
  • 출처: setuptools
  • 공식 설명: 공식 자료 참조

패키지를 사용하기 위해 필요한 의존성 목록입니다. 의존성 목록은 문자열로 줘도 알아서 잘 인식하지만 보통 listset형을 사용해서 표현합니다.

setup(
    ...,
    install_requires={
        'click >= 5.1',
    },
    ...,
)

entry_points

해당 값을 지정하면 Command line 명령어를 만들어줍니다. 실제로 어떻게 사용되는지 예제를 들자면 다음과 같습니다.

setup(
    ...,
    entry_points={
        'console_scripts': [
            'ugoira=ugoira.cli:ugoira',
        ],
    },
    ...,
)

이렇게 지정하면 터미널에서 ugoira라는 명령어를 실행하면 내부적으로 ugoira.cliugoira 함수가 실행됩니다.

extras_require

install_requires와 작성 요령이 비슷합니다.

setup(
    ...,
    extras_require={
        'tests': {'pytest >= 2.8.3',},
        'docs': {'Sphinx >= 1.3.1',},
    },
    ...,
)

이런 식으로 지정해놓으면 나중에 추가 의존성들을 설치할 때 용이합니다. 가령 위에서 지정한 docs의 의존성들을 설치하려면 다음과 같이 합니다.

$ pip install -e .[docs]

tests_require

  • 필수 필드: False
  • 필드 타입: str or list
  • 출처: setuptools
  • 공식 설명: 공식 자료 참조

install_requires와 작성 요령이 아예 같습니다. 다만 여기에 지정된 의존성은 테스트용으로 지정됩니다.


사실 이 외에도 더 많은 속성들이 존재합니다만, 이 정도만 있어도 일반적인 패키지 작성엔 부족함이 없다고 생각합니다. 이 이상의 기능으로 패키지 구성이 필요한 경우라면 setuptools 공식 문서를 참고하시면 됩니다.1


  1. 사실 제가 이것 이상으로 복잡한 무언가를 구성해보지 못했습니다.