pip package 만들기!

3 minute read

package 만들게된 동기

이번에 computer vision에서 사용되는 explainable AI에 대한 연구를 하면서 이것저것 pytorch로 구현했었습니다. tensorflow는 saliency라는 패키지로 이미 잘 구현이 되어있어서 저는 pytorch로 만들어서 패키지를 올려야겠다라구 생각했습니다.

그런데 다 만들고나서 ICCV 2019에 나온 논문들을 다시 보다보니…


음?? 잘못봤나? 싶어서 다시 봤더니… 아하… 역시 페이스북에서도 안만들리가 없었지…. 심지어 repository 만든날짜도 나보다 한 달 더 빠르다..


torcyray github : https://github.com/facebookresearch/TorchRay

GradCAM example이라는데 내가 구현한거랑 방식이 굉장히 유사하다.

    from torchray.attribution.grad_cam import grad_cam
    from torchray.benchmark import get_example_data, plot_example
    
    # Obtain example data.
    model, x, category_id, _ = get_example_data()
    
    # Grad-CAM backprop.
    saliency = grad_cam(model, x, category_id, saliency_layer='features.29')
    
    # Plots.
    plot_example(x, saliency, 'grad-cam backprop', category_id)

그래도 만들어 놓은게 있는데 이후에도 나는 계속 구현할 것이기 때문에 이것저걱 다 올려버리겠다는 각오로 우선 패키지를 만들고보자라는 생각으로 만들고 봤다.

준비

우선 pip 패키지를 만들기 위해서는 아래와 같이 먼저 각 파일을 만들어야한다.

  • Repository (패키지로 올릴 레포)
  • setup.py
  • setup.cfg
  • Release 파일
  • PyPI 회원가입

Intall packages

pip install wheel
pip install twine

Repository

Repo는 github에서 만들면된다. 만드는 부분은 여기서 생략하겠다.

나는 내 닉네임이 TooTouch기 때문에 이를 본따서 tootorch로 지었다. [Github]


setup.py

우선 setup.py를 통해서 기본 설정을 정해야한다. 아래 내용을 그대로 가져다 붙이고 각 옵션들을 본인에 코멘트로 달아놓은 설명에 맞게 본인 내용으로 작성하면된다. 첫 release라면 version은 0.1로 하는게 좋다.

    from setuptools import setup, find_packages
    
    with open('README.md', encoding='utf-8') as f: # README.md 내용 읽어오기
        long_description = f.read()
    
    setup(
        name                = 'tootorch',
        version             = '0.1', # PyPI에 올릴 version 
        long_description    = long_description, # README.md 내용을 PyPI project Description에 넣기
        long_description_content_type = 'text/markdown', # 형식은 markdown으로 지정
        description         = 'Implemetation XAI in Computer Vision (Pytorch)', # 짦은 소개
        author              = 'Jaehuck Heo', # 이름
        author_email        = 'wogur379@gmail.com', # 메일 
        url                 = 'https://github.com/TooTouch/tootorch', # github url
        download_url        = 'https://github.com/TooTouch/tootorch/archive/v0.1.tar.gz', # release 이름
        install_requires    =  ["torch","torchvision","h5py","tqdm","pillow","opencv-python"], # 패키지 사용시 필요한 모듈
        packages            = find_packages(exclude = []),
        keywords            = ['tootorch','XAI'], # 키워드
        python_requires     = '>=3.6', # python 필요 버전
        package_data        = {}, 
        zip_safe            = False,
        classifiers         = [   
            'Programming Language :: Python :: 3',
            'Programming Language :: Python :: 3.6',
            'Programming Language :: Python :: 3.7',
            "Topic :: Scientific/Engineering :: Artificial Intelligence",
            "Topic :: Software Development :: Libraries :: Python Modules",
        ],
    )

만약 아래와 같이 PyPI project description에 내용을 달고 싶다면 README.md에 작성한 후 아래 long_description을 꼭 작성해야한다.


setup.ckg

이 부분 그냥 아래내용을 그대로 붙여넣기하면 된다. Description 파일을 어떤걸로 쓸것인지 물어보는 파일이다.

[metadata]
description-file = README.md

Release 파일 만들기

Release 파일을 만드는 방법은 간단하다 github repo에 들어가서 화면과 같이 release라고 써있는 곳을 들어간다.


그리고나면 아래 화면에서 Create a new release 버튼을 누르고


빈칸에 내용을 입력하면 된다. 버전을 어떤식으로 써야할지 모르겠다면 오른쪽 suggestion을 참고해도 좋다. 참고로 첫 release라면 v0.1로 하는 것이 좋다.


파일을 만들면 아래와 같이 zip이나 tar.gz로 받을 수 있게 된다.


Project Upload

이제 준비가 다 끝났으니 Project를 올리기만 하면된다. 아래와 같이 명령어를 입력하면 dist라는 폴더가 생기고 안에 ~~.whl 이라는 파일이 생성된다.

    python setup.py bdist_wheel

그리고나서 아래 명령어를 통해 PyPI에 업로드해주면 된다! 뒤에 .whl 파일은 앞서 생성된 이름으로 바꿔넣도록 하자

    twine upload dist/tootorch-1.1-py3-none-any.whl

아래와 같이 username과 password를 입력하라고 나오는데 PyPI 홈페이지에서 회원가입하고 가입한 내용을 적으면 된다.

    D:\bllfpc_github\tootorch>twine upload dist/tootorch-1.1-py3-none-any.whl
    Uploading distributions to https://upload.pypi.org/legacy/
    Enter your username: tootouch
    Enter your password:
    Uploading tootorch-1.1-py3-none-any.whl
    100%|█████████████████████████████████████████████████████████████| 39.5k/39.5k [00:02<00:00, 15.8kB/s]
    
    View at:
    https://pypi.org/project/tootorch/0.1/

Import tootorch

이제 python에서 내가 올린 패키지를 import해보면 끝이다. 완성!


Trouble Shooting

중간에 PyPI에 업로드 했다가 내용이 잘못돼서 PyPI에 있는 release 파일을 삭제한 후 다시 twine으로 업로드하려고 하니 HTTPError가 발생한다. 이는 이전에 내가 같은 이름으로 whl 파일을 업로드했어서 그렇다.

근데 PyPI에 있는 release파일을 삭제했는데도 그래서 이상하다하고 찾아봤더니 삭제했어도 같은이름은 안된다고한다. 그러면 방법은 단순하다.

    D:\bllfpc_github\tootorch>twine upload dist/tootorch-0.1-py3-none-any.whl
    Uploading distributions to https://upload.pypi.org/legacy/
    Enter your username: tootouch
    Enter your password:
    Uploading tootorch-0.1-py3-none-any.whl
    100%|█████████████████████████████████████████████████████████████| 33.5k/33.5k [00:01<00:00, 23.8kB/s]
    NOTE: Try --verbose to see response content.
    HTTPError: 400 Client Error: This filename has already been used, use a different version. See https://pypi.org/help/#file-name-reuse for url: https://upload.pypi.org/legacy/

그냥 whl 파일 이름을 다르게 변경하고 업로드하면 해결된다.

    twine upload dist/tootorch-0.1-py3-none-any.whl # 이전이름
    twine upload dist/tootorch-1.1-py3-none-any.whl # 바꾼이름

Categories:

Updated:

Leave a comment