본문 바로가기
Python/Study

[Package] 파이썬 코드 패키지화 → setup.py

by beeny-ds 2022. 7. 11.

들어가는 글

파이썬을 사용하다 보면 사용하고자 하는 패키지를 다운로드 할 때 'pip install {package_name}' 를 써 본적이 있을 것이다. middle level user의 경우, 패키지 내부를 수정해서 자신이 원하는 목적에 맞게 수정한 경우가 많을 것이다. 이때 자세히 살펴보는 코드가 github으로 배포된 코드인데 간혹 setup.py 스크립트를 보고 '이게 뭐지..?' 생각했다면 본 포스팅을 살펴보길 권장한다.

 

모듈과 패키지

setup.py를 살펴보기 앞서 모듈과 패키지가 무엇인지 소개하고자 한다. 소개 글은 ( link )의 글을 인용했다.

https://www.holaxprogramming.com/2017/06/28/python-project-structures/

프로그래밍은 문제를 해결하는 과정을 프로그래밍 언어로 표현한 것이다. 그리고 대부분의 문제들은 다시 반복되며 우리는 이를 해결하기 위해 한 번 작성한 코드를 재사용하기 위해 노력하고 있다.

모듈(Module)은 파이썬에서 재사용이 가능한 기본 단위이다. 
.py 라는 확장자를 갖는 단일 파일에 작성되며 여러 모듈들은 다시 패키지(Package)라는 단위로 관리된다. 우리가 지금까지 작성한 결과를 구조적으로 표현하면 다음과 같은 프로젝트의 형태를 가진다.
ROOT
├── setup.py
├── algorithms
|  ├── __init__.py
|  ├── array.py
└── tests
    ├── __init__.py
    └── test_array.py

 

 

github에 자신이 개발한 코드를 패키지화 해봤다면 단순히 함수가 있는 스크립트는 패키지화 되지 못한다는 사실을 알고 있을 것이다. 필자는 처음 패키지를 개발할 때 "pip install {my_package}" 사용하여 pypi 에 패키지가 다운로드 될 수 있도록 구성하고자 했지만 '왜 안 될까...?' 고민에 빠져 구글링을 했던 기억이 있다. 이때 중요한 스크립트가 바로 setup.py 와 __init__.py 다. 본 포스팅에서는 setup.py를 먼저 살펴보고자 한다.


 

setup.py

해당 스크립트는 개발이 완료된 라이브러리를 배포할 때 필요한 메타 데이터를 제공하는 기능을 한다. 예를 들어 라이브러리 이름, 버전, dependency, author 등이 있다. dependency의 경우, 기록된 라이브러리가 함께 다운로드 되기 때문에 코드 개발 시 나의 패키지에 대한 dependency 확인을 잘 하도록 하자. 그럼 setup.py의 기본 형태를 살펴보겠다.

# encoding: utf-8
from setuptools import setup, find_packages

if __name__ == '__main__':
    setup(
        name='package_name',
        version='package_version',
        description='package_description',
        url='package_url',
        install_requires=[
            "package_dependency"
        ],
        author='package_author',
        author_email='package_author_email',
        license='package_license',
        packages=find_packages(where='src'),
        package_dir={'': 'src'},
        zip_safe=False,
        include_package_data=True,
        package_data={'': ['*.pickle']}
    )

"setup()" 에서 인자 중 하나인 "packages" 를 주목해보자. 해당 인자에는 패키지 이름을 적어줘야 한다. 문제는 패키지 이름을 일일이 적어줬어야 했다는 점이다. 이 단점을 보완할 수 있는 기능이 바로 find_packages() 함수이다. 이 함수를 사용하면 패키지 이름을 일일이 적어주지 않아도 지정된(where='src') 폴더 내에 있는 패키지들의 목록을 만들어 준다.그 외에도 setup.py 에서 구성할 수 있는 다양한 기능들이 존재한다. 해당 기능은 보다 잘 설명된 블로그를 참고하길 바란다. 블로그 링크는 아래와 같다.https://data-newbie.tistory.com/770

 

Python) 파이썬 프로젝트를 패키지화하기(setup.py)

일반적으로 우리가 분석을 하다 보면, 다양한 함수나 클래스들을 정의하게 된다. 이럴 경우 가장 귀찮은 경우가 이러한 함수들을 매번 관리하는 것이나, 호출해오는데 많은 어려움이 있다. 아래

data-newbie.tistory.com

 


 

마무리 글

필자는 setup.py를 만들어 pypi에 install할 수 있도록 구성하고자 할 때 다음과 같은 문제를 직면했다.

  1. wheel file을 만들기 위해 "python setup.py bdist_wheel --universal" 실행 시 개발한 스크립트가 제외된 현상
    문제의 해답은 __init__.py에 있었다. 각 폴더에 __init__.py를 생성하니 문제가 해결 되었다.
  2. dependency 문제도 있었다. 나의 패키지와 dependency가 있는 라이브러리의 버전을 명시하다보니 라이브러리 버전 에러가 발생했다.
    문제의 해답은 dependency 설정 시 버전을 명시하기 보다는 버전을 이상, 이하로 표시하거나 버전을 명시하지 않는 것이다.

 

부디 즐거운 코딩, 즐거운 패키지 만들기 되시길 바랍니다. setup.py를 이용해 본인의 패키지가 잘 동작하는지 확인하기 위해서는 패키지가 있는 dir에 들어가 "pip install ." 만 하면 되니 wheel file을 만들고 테스트하고 다시 만들고 테스트하는 불편함을 줄이시길 바랍니다.

반응형

댓글