프로그래밍 언어/Python

파이썬(PYTHON) #25_ 파이썬 패키지 등록하기 (pip 배포하기)

Tigercow.Door 2019. 12. 11. 23:26


안녕하세요. 문범우입니다.

이번 포스팅에서는 파이썬 패키지를 배포하는 방법에 대해서 함께 살펴보도록 하겠습니다.



1. pip: 파이썬 패키지 관리자


파이썬 패키지를 배포하는 방법에 대해 설명드리기에 앞서 간단하게 pip, 파이썬 패키지 관리자에 대해 짚고 넘어가보겠습니다.

파이썬을 공부하고 어느정도 사용을 해본 분들이라면 자연스럽게 pip를 사용해 보셨을 것이라고 생각합니다.


가령, 데이터 분석을 위해서 주로 numpy나 pandas, 웹 개발을 할 때에는 django, flask 등을 이용하기 위해 아래와 같이 pip를 이용하여 필요한 라이브러리를 다운받아 사용하셨을 겁니다.


1
pip install <라이브러리 이름>
cs


이때 우리가 사용하는 pip는 무엇일까요?

pip란, Python Package Index(PyPI)라는 저장소에서 제공되는 파이썬 패키지 소프트웨어를 설치 및 관리하는 패키지 관리 시스템입니다.

즉 우리가 그 동안 pip를 통해 설치한 다양한 라이브러리(패키지)들은 모두 PyPI라는 곳에 저장되어 있으며 실제로 아래 PyPI사이트에서 검색을 통해 확인해볼 수 있습니다.


https://pypi.org/


그리고 위의 PyPI사이트에 일정한 템플릿을 맞추어 자신의 패키지를 어렵지 않게 등록할 수 있습니다.

별도의 승인과정이나 절차가 없으며 단순히 특정 파일들만 잘 셋팅하면 어렵지 않게 자신만의 라이브러리(패키지)를 등록하여, pip로 설치할 수 있게 되는 것 입니다.


자신이 구현한 알고리즘이나, 특정 기능을 하는 함수를 더 많은 사람들에게 공유하고, 기회가 된다면 피드백을 받아 보다 좋은 코드로 발전시키는 것은 언제나 중요하고 보람찬 일이라고 생각합니다.


그럼 이제, 어떻게 PyPI 사이트에 자신의 코드를 등록할 수 있는지 살펴보도록 하겠습니다.



2. 준비 단계


2-1. PyPI 회원가입


제일 먼저 PyPI에 회원가입을 진행합니다.

아래 사이트에서 우측 상단의 Register를 클릭하고 이름과 이메일, 비밀번호를 입력 후 이메일 인증만 진행하면 됩니다.

추후 패키지를 등록하고자 할 때 PyPI의 계정이 필요하니 미리 가입을 해두는 것을 추천드립니다.


https://pypi.org/



2-2. 패키지 이름 중복 확인


가입이 완료되었다면, 위의 사이트에서 search를 통해 자신이 등록하고자 하는 패키지의 이름의 있는지 확인합니다. 패키지 이름은 추후 사용해야 할 곳이 많으니 자신이 쓰고자 하는 패키지의 이름이 중복되지 않는지를 먼저 확인 후 이후 과정을 진행하시는 것이 편리합니다.

만약, 이름이 중복된다면 다양한 것들을 수정해야 할 수 있습니다.


저는 doorbw-test 라는 이름으로 패키지가 없는 것을 확인하였기에 해당 이름으로 패키지 생성 및 등록을 진행해보도록 하겠습니다.



2-3. 등록하고자 하는 파일(함수) 구현


또한 제가 등록하고자 하는 함수는 test_function()으로써 아래와 같이 코드를 작성하였습니다.


1
2
3
4
def test_function(input_str):
    print("Hello, I'm beomwoo.moon")
    print("Your input string is,",input_str)
    print("Bye!")
cs


위의 코드를 test.py라는 파일로 저장하였습니다.

추후 우리가 doorbw_test라는 이름으로 패키지를 등록하면, 위의 함수를 사용하기 위해서 doorbw-test를 pip로 설치한 후에 다음과 같이 호출해야 합니다.


(패키지 등록시 대시('-')가 아닌 언더바('_')를 사용해야 합니다.

파이썬에서 import할때 대시를 포함한 라이브러리를 호출하려면 다른 작업이 필요하기 때문입니다. 하지만 언더바를 사용하더라도 PyPI에서는 대시로 나타나니 혼동하지 않기 바랍니다.)


1
2
3
from doorbw_test import test
 
test.test_function("[pip deploy test]")
cs



우리가 등록하는 패키지 이름으로부터 test.py를 import하고 test안에 있는 test_function을 실행하는 모습입니다.



2-4. github repository 구성


마지막으로는 해당 코드를 공유할 github repository를 만들어 줍니다.

해당 과정은 필수는 아닙니다.

일반적으로 배포하고자 하는 패키지이름과 동일하게 github repository를 만들어주지만, 저는 설명을 위한 배포이기 때문에 repository 이름은 'pypi_deploy_test'로 진행하였습니다.



이제 위에서 준비한 내용들을 바탕으로 PyPI에 등록해보도록 하겠습니다.



3. 등록 단계


3-1. 폴더 구성


처음에도 말씀드렸듯이, PyPI에 패키지를 등록하려면 별도의 승인과정 같은 것은 없지만 일정한 템플릿을 구성해야 한다고 말씀드렸습니다.

먼저 패키지를 등록할 폴더를 만듭니다. 패키지를 등록할 폴더는 패키지 이름과 동일해야 합니다.

따라서 저같은 경우는 doorbw_test라는 폴더를 만들었으며, 해당 폴더안에 동일한 이름의 폴더를 하나 더 만들고 위에서 작성한 test.py파일을 넣어줍니다.

현재까지의 디렉토리 상태를 트리구조로 본다면 다음과 같습니다.


doorbw_test

   - doorbw_test

      - test.py



3-2. setup.py 파일 구성


위와 같은 상태에서 두번째 doorbw_test와 같은 경로상에 setup.py 파일을 만들고 아래와 같이 작성합니다.


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
from setuptools import setup, find_packages
 
setup(
    # 배포할 패키지의 이름을 적어줍니다. setup.py파일을 가지는 폴더 이름과 동일하게 합니다.
    name                = 'doorbw_test',
    # 배포할 패키지의 버전을 적어줍니다. 첫 등록이므로 0.1 또는 0.0.1을 사용합니다.
    version             = '0.1',
    # 배포할 패키지에 대한 설명을 작성합니다.
    description         = 'for explain about pypi deploy',
    # 배포하는 사람의 이름을 작성합니다.
    author              = 'beomwoo.moon',
    # 배포하는 사람의 메일주소를 작성합니다.
    author_email        = 'doorbw@outlook.com',
    # 배포하는 패키지의 url을 적어줍니다. 보통 github 링크를 적습니다.
    url                 = 'https://github.com/doorBW/pypi_deploy_test',
    # 배포하는 패키지의 다운로드 url을 적어줍니다.
    download_url        = 'https://github.com/doorBW/pypi_deploy_test/archive/master.zip',
    # 해당 패키지를 사용하기 위해 필요한 패키지를 적어줍니다. ex. install_requires= ['numpy', 'django']
    # 여기에 적어준 패키지는 현재 패키지를 install할때 함께 install됩니다.
    install_requires    =  [],
    # 등록하고자 하는 패키지를 적는 곳입니다.
    # 우리는 find_packages 라이브러리를 이용하기 때문에 아래와 같이 적어줍니다.
    # 만약 제외하고자 하는 파일이 있다면 exclude에 적어줍니다.
    packages            = find_packages(exclude = []),
    # 패키지의 키워드를 적습니다.
    keywords            = ['pypi deploy'],
    # 해당 패키지를 사용하기 위해 필요한 파이썬 버전을 적습니다.
    python_requires     = '>=3',
    # 파이썬 파일이 아닌 다른 파일을 포함시키고 싶다면 package_data에 포함시켜야 합니다.
    package_data        = {},
    # 위의 package_data에 대한 설정을 하였다면 zip_safe설정도 해주어야 합니다.
    zip_safe            = False,
    # PyPI에 등록될 메타 데이터를 설정합니다.
    # 이는 단순히 PyPI에 등록되는 메타 데이터일 뿐이고, 실제 빌드에는 영향을 주지 않습니다.
    classifiers         = [
        'Programming Language :: Python :: 3',
        'Programming Language :: Python :: 3.2',
        'Programming Language :: Python :: 3.3',
        'Programming Language :: Python :: 3.4',
        'Programming Language :: Python :: 3.5',
        'Programming Language :: Python :: 3.6',
        'Programming Language :: Python :: 3.7',
    ],
)
cs


각각에 대한 설명은 주석으로 달아두었습니다.



3-3. __init__.py / README.md /

setup.cfg / .gitignore / git init


이번에는 5개의 작업을 진행합니다.


먼저 우리가 앞에서 만들었던 test.py 파일과 같은 경로에 __init__.py 파일을 만들어 줍니다.

해당 파일 안에는 비워두셔도 되고 단순히 print문을 입력하셔도 됩니다.


이후 setup.py 파일과 동일한 경로에 README.md 파일을 만들어 패키지에 대한 간략한 설명을 작성해 줍니다.


1
2
3
4
5
# HELLO
This is just explain for PyPI deploy  
 
doorbw@outlook.com  
 
cs


위와 같이 README.md를 작성하였다면 동일한 경로에 setup.cfg 파일을 만들어 줍니다.


1
2
[metadata]
description-file = README.md
cs


위와 같이 setup.cfg를 만들어 주었다면 github등록 전 마지막으로 .gitignore파일을 아래와 같이 만들어 줍니다.


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
# vscode
.vscode/
 
# Byte-compiled / optimized / DLL files
__pycache__/
*.py[cod]
*$py.class
 
# C extensions
*.so
 
# Distribution / packaging
.Python
build/
develop-eggs/
dist/
downloads/
eggs/
.eggs/
lib/
lib64/
parts/
sdist/
var/
wheels/
pip-wheel-metadata/
share/python-wheels/
*.egg-info/
.installed.cfg
*.egg
MANIFEST
 
# PyInstaller
#  Usually these files are written by a python script from a template
#  before PyInstaller builds the exe, so as to inject date/other infos into it.
*.manifest
*.spec
 
# Installer logs
pip-log.txt
pip-delete-this-directory.txt
 
# Unit test / coverage reports
htmlcov/
.tox/
.nox/
.coverage
.coverage.*
.cache
nosetests.xml
coverage.xml
*.cover
.hypothesis/
.pytest_cache/
 
# Translations
*.mo
*.pot
 
# Django stuff:
*.log
local_settings.py
db.sqlite3
 
# Flask stuff:
instance/
.webassets-cache
 
# Scrapy stuff:
.scrapy
 
# Sphinx documentation
docs/_build/
 
# PyBuilder
target/
 
# Jupyter Notebook
.ipynb_checkpoints
 
# IPython
profile_default/
ipython_config.py
 
# pyenv
.python-version
 
# celery beat schedule file
celerybeat-schedule
 
# SageMath parsed files
*.sage.py
 
# Environments
.env
.venv
env/
venv/
ENV/
env.bak/
venv.bak/
 
# Spyder project settings
.spyderproject
.spyproject
 
# Rope project settings
.ropeproject
 
# mkdocs documentation
/site
 
# mypy
.mypy_cache/
.dmypy.json
dmypy.json
 
# Pyre type checker
.pyre/
cs


이제 해당 폴더를 앞에서 만든 github repository에 등록시켜주도록 합시다.

현재까지의 디렉토리 상태는 아래의 트리구조와 같습니다.


doorbw_test

   - doorbw_test

      - __init__.py

      - test.py

   - .gitignore

   - README.md

   - setup.cfg

   - setup.py


cmd또는 터미널에서 해당 폴더를 이전에 만든 github repository에 올려줍니다.




3-4. 필요한 라이브러리 설치 및 빌드


이제 우리가 만든 패키지를 배포하기 위한 마지막 작업으로 필요한 라이브러리를 설치합니다.

우선 setup.py파일에서 사용한 setuptools,

그리고 빌드시에 사용할 wheel,

배포시에 사용할 twine

총 3개를 아래의 명령어로 설치합니다.


1
pip install setuptools wheel twine
cs


이제 앞에서 구성한 setup.py을 통해 패키지 빌드를 시작합니다.

setup.py파일이 있는 경로상에서 아래와 같이 명령어를 입력합니다.


1
python setup.py bdist_wheel
cs


위의 명령어를 입력하고 나면 폴더에 build, dist, <자신의 패키지이름>.egg-info 이름의 3개의 폴더가 생성되었을 것입니다.

이 중에서 dist 폴더 내부에 있는 파일이름을 확장자까지 모두 복사합니다.



3-5. 등록하기


dist 폴더 내부에 있는 확장자를 포함한 파일 이름을 복사하셨다면 아래와 같이 명령어를 실행합니다.


1
2
# dist 폴더 아래에 있는 파일명이 doorbw_test-0.1-py3-none-any.whl 일때,
twine upload dist/doorbw_test-0.1-py3-none-any.whl
cs


위의 명령어를 입력하면 자신의 이름을 입력하라고 나옵니다.

이때 제일 처음에 가입했던 PyPI의 이름을 입력하시고 이어서 비밀번호를 입력하시면 됩니다.



위와 같이 결과가 출력된다면 정상적으로 등록된 것 입니다.

이제 PyPI에 가서 자신의 계정으로 로그인 후에 자신이 등록한 패키지를 확인할 수 있습니다.


이후 아래와 같이 실제로 자신이 등록한 패키지를 pip install로 다운받아서 사용하실 수 있습니다.





추가적으로 문의사항이 있으시거나 잘 해결되지 않는 점이 있다면

주저하지 마시고 언제든지 이메일 또는 카카오톡으로 연락주시면 빠르게 도움드리도록 하겠습니다.

감사합니다.

728x90