Advertisement
  1. Code
  2. Python

파이썬 패키지를 공유하는 법

Scroll to top
Read Time: 6 min

Korean (한국어) translation by Dae-yeop Lee (you can also view the original English article)

개요

파이썬 패키지는 파이썬 애플리케이션의 기본 요소입니다. 파이썬 패키지는 여러 애플리케이션과 시스템에서 임포트해서 사용할 수 있는 응집성 있는 기능을 캡슐화합니다. 하지만 먼저 개발자는 패키지를 찾아서 설치할 수 있어야 합니다. 파이썬은 패키지에 대한 무료 공개 저장소를 제공합니다. 이는 파이썬 패키지를 공유하기 위한 사실상의 표준입니다. 독점적인 패키지를 위한 전용 패키지 저장소를 사용할 수도 있습니다.

이번 튜토리얼에서는 여러분의 패키지를 커뮤니티와 공유하는 방법을 배우겠습니다. 회사 내에서 공유해야 하는 독점 패키지가 있다면 그렇게 하는 방법도 배울 것입니다.

배경 지식을 쌓기 위해서는 파이썬 패키지를 사용하는 법파이썬 패키지를 작성하는 법을 참고합니다.

PyPI란?

PyPI는 Python Package Index의 약자입니다. PyPI는 패키지를 업로드하기 위한 공용 저장소입니다. pip는 PyPI를 인식하고 있으며 PyPI에서 패키지를 설치 및/또는 업그레이드할 수 있습니다. PyPI는 몬티 파이썬(Monty Python)의 유명한 스케치를 따라 "치즈샵(Cheese Shop)"이라고 불리곤 했습니다. 사람들이 파이썬 패키징과 관련된 이야기를 나눌 때 "치즈샵"이라는 말을 하는 것을 듣더라도 놀라지 마십시오. 그저 PyPI를 가리키는 말일 뿐입니다.

패키지 업로드 준비

패키지를 업로드하기에 앞서 먼저 업로드할 패키지가 있어야 합니다. 여기서는 파이썬 패키지 패키지를 작성하는 법에서 소개한 conman 패키지를 사용하겠습니다. PyPI에는 수천 개의 패키지가 들어 있어서 사람들이 찾을 수 있게 하려면 패키지를 적절히 설명할 수 있어야 합니다. PyPI는 사람들이 작업에 적합한 패키지를 찾을 수 있게 해주는 인상적인 메타데이터 태그를 지원합니다.

setup.py 파일에는 패키지를 설치하는 데 사용되는 여러 중요한 정보가 들어 있습니다. 또한 PyPI에서 패키지를 분류하는 데 사용되는 메타데이터도 담을 수 있습니다. 패키지는 여러 메타데이터 태그를 이용해 분류됩니다. 메타데이터 태그 중 일부는 텍스트이고 일부는 가능한 값의 리스트를 담기도 합니다. 전체 목록은 PyPI의 리스트 분류자(List Classifier) 페이지에서 확인할 수 있습니다.

setup.py에 몇 가지 분류자를 추가해 봅시다. 메타데이터에 버전 번호만 있고 코드는 그대로일 경우 버전 번호를 높일 필요가 없습니다.

1
from setuptools import setup, find_packages
2
3
4
5
setup(name='conman',
6
7
      version='0.3',
8
9
      url='https://github.com/the-gigi/conman',
10
11
      license='MIT',
12
13
      author='Gigi Sayfan',
14
15
      author_email='the.gigi@gmail.com',
16
17
      description='Manage configuration files',
18
19
      classifiers=[
20
21
          'Development Status :: 3 - Alpha',
22
23
          'Intended Audience :: Developers',
24
25
          'Topic :: Software Development :: Libraries',
26
27
          'License :: OSI Approved :: MIT License',
28
29
          'Programming Language :: Python :: 2',
30
31
          'Programming Language :: Python :: 2.6',
32
33
          'Programming Language :: Python :: 2.7',
34
35
      ],
36
37
      packages=find_packages(exclude=['tests']),
38
39
      long_description=open('README.md').read(),
40
41
      zip_safe=False,
42
43
      setup_requires=['nose>=1.0'],
44
45
      test_suite='nose.collector')

계정 생성

패키지를 업로드하려면 PyPI에 계정을 만들어야 합니다. 이 양식을 채우고 확인 이메일의 URL을 클릭해서 신원을 확인합니다. 이제 패키지를 업로드하는 데 필요한 정보가 담길 .pypyrc 파일을 홈 디렉터리에 만들어야 합니다.

1
[distutils]
2
3
index-servers=pypi
4
5
6
7
[pypi]
8
9
repository = https://pypi.python.org/pypi
10
11
username = the_gigi
12

비밀번호를 추가할 수도 있지만 어떤 나쁜 요소가 여러분의 노트북에 들어올 경우에 대비해 비밀번호를 추가하지 않는 편이 더 안전합니다. 누군가가 여러분의 패키지를 업로드하거나 업그레이드할 수 있는 경우 이 패키지를 사용하는 모든 사람들이 취약점에 노출되기 때문에 인기 있는 패키지를 업로드하는 경우에는 특히 중요합니다.

테스트

패키지 등록 및 업로드 프로세스를 테스트하고 불완전한 것을 게시하는 것에 대한 걱정이 없으면 다른 PyPI 테스트 사이트에서 작업할 수 있습니다. 'pypitest' 섹션이 포함되도록 ~/.pypirc 파일을 확장합니다.

1
[distutils]
2
3
index-servers=
4
5
    pypi
6
7
    pypitest
8
9
10
11
[pypitest]
12
13
repository = https://testpypi.python.org/pypi
14
15
username = the_gigi
16
17
18
19
[pypi]
20
21
repository = https://pypi.python.org/pypi
22
23
username = the_gigi
24

테스트 사이트는 정기적으로 정리되므로 테스트 사이트에 의존해서는 안 됩니다. 테스트 사이트는 테스트 용도로만 사용됩니다.

패키지 등록

패키지를 처음으로 릴리스하는 경우 PyPI에 패키지를 등록해야 합니다. Twine에 등록 명령이 있지만 저는 어떻게 사용하는지 잘 모르겠습니다. 문서를 따라하면 오류가 발생하고 twine에 대한 단위 테스트에는 register 명령에 대한 테스트가 없습니다. 어쩔 수 없죠. 이 양식을 이용해 직접 PKG-INFO 파일을 업로드할 수도 있습니다. 파이썬 2.7.9+ 또는 파이썬 3.2+를 사용하는 경우 python setup.py register를 이용해 안전하게 등록할 수도 있습니다.

conman을 PyPI 테스트 사이트에 등록해 봅시다. 참고로 ~/.pypirc의 섹션을 토대로 하는 -r pypitest를 지정했으므로 테스트 사이트에 등록할 것입니다.

1
python setup.py register -r pypitest
2
3
running register
4
5
running egg_info
6
7
writing conman.egg-info/PKG-INFO
8
9
writing top-level names to conman.egg-info/top_level.txt
10
11
writing dependency_links to conman.egg-info/dependency_links.txt
12
13
reading manifest file 'conman.egg-info/SOURCES.txt'
14
15
reading manifest template 'MANIFEST.in'
16
17
writing manifest file 'conman.egg-info/SOURCES.txt'
18
19
running check
20
21
Password:
22
23
Registering conman to https://testpypi.python.org/pypi
24
25
Server response (200): OK

Twine

python setup.py upload로 패키지를 업로드할 수는 있지만 파이썬 2.7.9 및 파이썬 3.2 전까지는 HTTP를 통해 사용자 이름과 암호를 보낼 때 보안이 적용되지 않습니다. Twine은 항상 HTTPS를 사용하며, 사전 생성된 배포본을 업로드하는 것과 같은 추가적인 이점이 있으며 wheel을 비롯한 모든 패키지 형식을 지원합니다. 여기서는 실제 업로드에 twine을 사용하겠습니다.

Twine은 표준 라이브러리에 포함돼 있지 않으므로 pip install twine으로 설치해야 합니다.

패키지 업로드

마지막으로 실제로 패키지를 업로드할 차례입니다.

1
> twine upload -r pypitest -p ******* dist/*
2
3
Uploading distributions to https://testpypi.python.org/pypi
4
5
Uploading conman-0.3-py2-none-any.whl
6
7
Uploading conman-0.3-py2.py3-none-any.whl
8
9
Uploading conman-0.3.tar.gz

Twine이 모든 배포 형식(소스와 wheel 모두)을 업로드했습니다.

Twine uploaded all the distribution formatsTwine uploaded all the distribution formatsTwine uploaded all the distribution formats

패키지 테스트

패키지가 PyPI에 올라갔으면 패키지를 설치할 수 있고 모든 것이 제대로 작동하는지 확인해야 합니다. 여기서는 일회성 가상 환경을 만들고 PyPI 테스트 사이트로부터 pip install conman 명령을 통해 패키지를 설치한 다음 임포트하겠습니다. 패키지에 대해 좀 더 철저한 테스트를 수행하고 싶을지도 모르겠습니다.

1
> mkvirtualenv test_conman_pypi
2
3
New python executable in test_conman_pypi/bin/python2.7
4
5
Also creating executable in test_conman_pypi/bin/python
6
7
Installing setuptools, pip...done.
8
9
Usage: source deactivate
10
11
12
13
removes the 'bin' directory of the environment activated with 'source

14


15
activate' from PATH.
16
17
(test_conman_pypi) > pip install -i https://testpypi.python.org/pypi conman
18
19
Downloading/unpacking conman
20
21
  Downloading conman-0.3-py2-none-any.whl
22
23
  Storing download in cache at /Users/gigi/.cache/pip/https%3A%2F%2Ftestpypi.python.org%2Fpackages%2Fpy2%2Fc%2Fconman%2Fconman-0.3-py2-none-any.whl
24
25
Installing collected packages: conman
26
27
Successfully installed conman
28
29
Cleaning up...
30
31
(test_conman_pypi) > python
32
33
Python 2.7.10 (default, Jun 10 2015, 19:43:32)
34
35
[GCC 4.2.1 Compatible Apple LLVM 6.0 (clang-600.0.57)] on darwin
36
37
Type "help", "copyright", "credits" or "license" for more information.
38
39
>>> import conman
40
41
>>>

참고로 wheel 배포본은 기본적으로 설치됐습니다.

버전 관리

패키지를 발전시키고 새 버전을 업로드할 때는 현명한 버전 관리 체계를 따르는 것이 중요합니다. 의도하지 않은 업그레이드로 인해 코드가 손상되면 사람들이 상당히 불쾌할 것입니다. 버전 관리 체계는 PEP-440 -- 버전 식별 및 의존성 명세를 준수해야 합니다.

이 명세에서는 다중 스키마를 선택할 수 있도록 허용합니다. 저는 인기 있는 시맨틱 버전 관리 체계를 사용하길 권장합니다. 이것은 대체로 "<major>.<minor>.<patch>"에 해당하며, PEP-440의 "<major>.<minor>.<micro>"와 대응됩니다. PEP-440와 호환되지 않는, 하이픈 또는 더하기 기호를 사용하는 버전에 주의합니다.

전용 패키지 저장소

PyPI는 훌륭하지만 때로는 패키지를 공유하고 싶지 않을 때도 있습니다. 많은 기업과 조직에서 파이썬을 사용하고 패키지를 공유해야 하는 엔지니어링 팀을 보유하고 있지만 PyPI에서 공개적으로 공유하는 것은 허용하지 않습니다. 이것은 문제가 아닙니다. 여러분의 통제하에 있는 전용 패키지 저장소에서 패키지를 공유하면 됩니다.

때로는 서드파티 의존성을 관리하기 위해 여러분이 통제할 수 있는 전용 패키지 저장소가 필요할 수 있습니다. 예를 들어, 패키지 제작자가 PyPI에서 패키지를 삭제하기로 결정할 수 있습니다. 시스템에서 이 패키지를 PyPI로부터 설치할 수 있는 기능에 의존한다면 문제가 생길 수 있습니다.

Devpi

Devpi(Development Package Index의 약자)는 공용 PyPI 서버의 대체재입니다. Devpi는 오픈소스이자 MIT 라이선스가 적용돼 있으므로 방화벽 내에서 실행할 수 있습니다. Devpi는 매우 강력하고 궁극적인 패키징 서버로 사용할 수 있도록 여러 기능을 갖추고 있습니다.

  • 빠른 PyPI 미러
  • 전용 인덱스를 이용한 업로드, 테스트, 스테이징
  • 인덱스 상속
  • 웹 인터페이스와 검색
  • 복제
  • 가져오기/내보내기
  • 젠킨스 통합

Devpi는 뛰어난 문서와 플러그인 시스템을 보유하고 있으며, 활발한 커뮤니티와 함께 활발하게 개발되고 있습니다.

결론

파이썬은 패키지를 호스팅하고 동료 파이썬주의자가 사용할 수 있도록 완전한 솔루션을 제공합니다. 패키지를 패키징 및 업로드하고, 패키지를 손쉽게 찾아서 설치하는 도구의 지원을 받는 능률화된 프로세스가 있습니다.

패키지를 비공개로 유지해야 하는 경우 성숙하고 견고한 개인 패키지 저장소로서 Devpi를 활용할 수 있습니다.

Advertisement
Did you find this post useful?
Want a weekly email summary?
Subscribe below and we’ll send you a weekly email summary of all new Code tutorials. Never miss out on learning about the next big thing.
Advertisement
Looking for something to help kick start your next project?
Envato Market has a range of items for sale to help get you started.