TigerCow.Door


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

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



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로 다운받아서 사용하실 수 있습니다.





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

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

감사합니다.

블로그 이미지

Tigercow.Door

Web Programming / Back-end / Database / AI / Algorithm / DeepLearning / etc

댓글을 달아 주세요


안녕하세요.

이번 포스팅에서는 파이썬에서 모듈과 패키지이 무엇인지, 그리고 어떻게 사용하는지 알아보도록 하겠습니다.


1. 모듈(Module)


모듈이란, 함수나 변수 또는 클래스 들을 모아놓은 파일을 말합니다.

즉, A.py 이라는 파일에 F1, F2 라는 함수와 C1, C2 라는 클래스를 만들었을때, B.py라는 파일에서 A.py를 모듈로써 사용하여 F1, F2 함수 또는 C1, C2 클래스를 사용할 수 있는 것입니다.

이러한 모듈을 통해 우리는 다른사람이 만들어 놓은 모듈을 사용하여 함수나 클래스를 사용할 수 있게됩니다.

그럼 간단한 모듈을 직접 만들어 보도록 하겠습니다.



위의 코드와 같은 파일을 module1.py 라고 저장하였습니다.

그리고 위의 파일을 모듈로써 사용하기 위해 우리는 import 를 사용합니다.

아래 코드에서 import를 통해 module1을 가져오고, module1에 있는 함수를 사용합니다.



위의 코드를 CMD에서 실행시키면 아래와 같이 올바른 결과가 출력됩니다.



import를 사용할때는, 


import 파일이름


와 같은 식으로 사용하며 파일이름 뒤에 있는 .py 라는 확장자는 생략합니다.



2. 모듈 사용 응용하기


모듈을 사용할때, 몇 가지 추가적인 방법이 있습니다.

먼저,


from 모듈이름 import 모듈함수


와 같은 방법입니다.

우리는 위의 코드에서 module1의 sum 함수를 사용하기 위해 module1.sum() 이라는 식으로 호출을 하였습니다.

하지만, from module1 import sum 과 같이 사용하면 sum함수를 이름 그대로 호출할 수 있습니다.



또한 두번째로, import문 맨 뒤에 as를 통해 자신이 함수이름을 다르게 설정할 수도 있습니다.

예를 들어, sum함수를 불러오는데 plus라는 이름의 함수로 사용하고 싶다면,


from module1 import sum as plus


와 같은 식으로 사용하면 됩니다.



세번째로 알아볼 내용은

if __name__ == "__main__":

입니다.

이를 제대로 확인하기 위해 먼저 module1.py 의 코드를 아래와 같이 수정합니다.



위의 코드와 같이 수정하고 다시 CMD창에서 module1.py를 사용하는 파일을 실행하면 다음과 같이 출력이 됩니다.



그런데, 우리는 prac.py에서 단순히 module1.py 의 함수만 사용하고 싶은데, module1.py에 있는 print()문 까지 함께 실행이 되어버렸습니다.

이러한 경우 우리는 if __name__ == "__main__": 를 통해 모듈을 호출할때 해당 파일의 함수나 클래스, 변수만 가져오도록 할 수 있습니다.

module1.py의 코드를 아래와 같이 수정합니다.



위의 코드처럼 수정하고 다시 prac.py를 실행하면 module1.py의 print()문은 실행되지 않는 것을 볼 수 있습니다.


if __name__ == "__main__": 에 대해서 간단히 살펴보면

이는 직접 해당 파일을 실행시켰을 때는 if 문이 참이되어 그 이하 문장이 실행되지만, 단순히 모듈로써 불러서 사용하는 경우에는 if문이 거짓이 되어 이하 문장이 실행되지 않는 구조입니다.


위에서는 주로 함수를 예로 들어 모듈에 대해서 알아보았는데 클래스나 변수 또한 함수와 같은 방식으로 사용할 수 있습니다.



3. 패키지


패키지는 간단히 말해, 여러개의 모듈을 묶은 집합입니다.

예를 들어 아래의 파일구조와 같이 package 라는 폴더에 module1.py module2.py 를 만들고 package라는 폴더와 같은 위치에 prac.py 라는 파일이 있다고 합시다.



이때 우리는 package라는 폴더를 하나의 패키지라고 합니다.

이러한 패키지를 이용하는 방법은 모듈에서 사용한 방법과 매우 유사합니다.

prac.py 에서 package라는 패키지에 있는 moduel1.py를 이용하고 싶을땐,


from package.module1 import sum


과 같은 방식으로 사용하면 됩니다.


이렇게 해서 파이썬에서 모듈과 패키지에 대해서 알아보았습니다.

잘 진행이 되지 않거나 추가적으로 궁금한 사항은 언제든지 댓글을 이용해주세요.


블로그 이미지

Tigercow.Door

Web Programming / Back-end / Database / AI / Algorithm / DeepLearning / etc

댓글을 달아 주세요