공부하고 기록하는, 경제학과 출신 개발자의 노트

학습일지/Language

EuroPython 2022 - From Pip to Poetry: Python ways of packaging and publishing

inspirit941 2023. 6. 11. 16:54
반응형

https://youtu.be/KlvOIuifE5c

From pip to poetry - Python ways of packaging and publishing

발표자: Vinícius Gubiani Ferreira

  • QA Senior Analyst at Azion (Security | Cells Squads)
  • Python Backend Engineer로 오래 일했다고 함

스크린샷 2023-06-10 오후 6 43 50

 

Package Managers

스크린샷 2023-06-10 오후 6 45 23스크린샷 2023-06-10 오후 6 45 28

Package Manager: Configuration Management을 위한 tool.

  • Configuration Management: System Engineering process for establishing consistence of our products attributes through its lifetime.

Consistence: Same ingredients & Same process -> Same Result.

  • 어느 머신에서든 동일한 실행환경을 구성할 수 있도록 하는 것.

Python Package Manager 종류는 정말 많다.

  • pip / pipenv / poetry 외에도 이것저것 많음.
  • conda - package manager for Data Community
  • OS package manager로도 python pkg를 설치할 수 있다.

pip

스크린샷 2023-06-10 오후 8 34 11스크린샷 2023-06-10 오후 8 44 10

 

예컨대 A 패키지에서 쓰는 특정 dependency인 a가 버전이 올라갔는데, 내 런타임 환경에서는 그 dependency를 쓸 수 없는 환경이라고 해보자.

  • 디버깅이 쉽지 않다. A 패키지의 a라는 dependency에 문제가 있다는 것을 확인하기 쉽지 않음
  • a라는 dependency를 내 런타임에서 실행할 수 있는 버전으로 내린다고 가정하자.
    • requirements.txt에 a의 특정 버전을 명시할 때, A 패키지보다 반드시 먼저 명시해야 함. 즉 requirements.txt에 파일의 dependency 서순이 중요할 때가 있다
  • 패키지가 커질수록 requirements.txt 파일의 크기가 커지고 지저분해진다.

pipenv

스크린샷 2023-06-11 오후 1 34 15

 

composer, cargo, yarn 등 다른 package manager의 영향을 받아 만들어진 python package manager.

  • virutalenv라는 독립된 가상환경을 설정해서 os의 package와 분리. -> sudo 등 시스템 명령어를 사용하지 않으므로 보안 면에서 훨씬 진보함
  • requirements.txt 대신 Pipfile 형식을 사용함
    • pipfile: keep tracks of the top level packages
    • pipfile.lock: keep tracks of lower dependencies

poetry

스크린샷 2023-06-11 오후 1 38 34

 

  • pipfile과 같은 기능을 하는 pyproject.toml와 poetry.lock을 사용함
  • pip / pipenv처럼 코드를 관리하는 것보다는 project를 관리하는 개념. publishing / packaging 가능
  • Python 2.7 지원하지 않음

각 패키지 매니저를 사용해서 packaging하기

스크린샷 2023-06-11 오후 1 43 02

 

별다른 기능 없는, 간단한 웹페이지를 생성한다고 가정

스크린샷 2023-06-11 오후 1 43 08스크린샷 2023-06-11 오후 1 44 40

 

프로젝트 디렉토리 구조는 위와 같다.

  • 라이센스, readme
  • pyproject.toml
  • setup.cfg
  • src / test

pip으로 packaging

스크린샷 2023-06-11 오후 2 42 37

 

requirements.txt를 생성한다

스크린샷 2023-06-11 오후 2 42 42스크린샷 2023-06-11 오후 2 42 48

 

pyproject.toml에서 setuptools 설정하고, setup.cfg에서 설정값을 지정한다

  • options 필드에서 package_dir 지정
  • client에서 해당 pkg 호출하기 위한 entry_point 설정한다 (options.entry_points)

스크린샷 2023-06-11 오후 2 42 54

 

빌드 명령을 수행하면 패키지가 생성된다.

  • dist 디렉토리가 생성되고, 디렉토리 안에는 .whl 파일과 tar.gz 파일이 생성됨
    • binary distribution: 패키징을 수행한 os 환경에 최적화된 binary. 패키지를 설치할 환경이 패키징한 os환경과 동일하다면 더 빨리 설치할 수 있다.
    • source distribution: tar.gz 파일. binary distribution을 쓸 수 없는 환경일 때 사용함.

스크린샷 2023-06-11 오후 2 46 09스크린샷 2023-06-11 오후 2 46 39스크린샷 2023-06-11 오후 2 46 44스크린샷 2023-06-11 오후 2 46 49

 

pypi repository에 업로드하기 위해서는 token이 필요하다. 강연에서는 test.pypi라는 stage 환경을 사용함.

  • .pypirc 파일에 토큰값 추가한뒤, pypi에 업로드하는 명령어를 실행하면 된다

pipenv로 packaging

스크린샷 2023-06-11 오후 2 54 53스크린샷 2023-06-11 오후 2 55 48

 

pipenv를 설치하고 dependency를 추가하면, pipfile이 생성된다.

  • pipfile.lock의 경우 lower dependency를 관리하기 위한 hash값이 있는 mess 파일. 삭제하지만 않으면 된다

스크린샷 2023-06-11 오후 2 56 52스크린샷 2023-06-11 오후 2 57 42

 

pip 대비 pipenv의 장점

  • 어떤 패키지에 어떤 dependency가 연결되어 있는지 그래프로 볼 수 있다는 것
  • 보안취약점 확인 가능
  • dev environment용으로 지정된 dependency만 설치해서 실행
  • 등등...

스크린샷 2023-06-11 오후 2 59 11

 

단, pypi에 패키지 업로드하는 로직은 pip과 거의 비슷하며, 좀더 복잡한 부분도 있음.

  • pipenv 사용법 설명하는 강연은 아니므로 poetry로 skip

poetry로 packaging

스크린샷 2023-06-11 오후 3 00 57스크린샷 2023-06-11 오후 4 31 03

 

프로젝트 디렉토리 구조가 pip / pipenv와 약간 다름.

  • 필요한 dependency는 poetry add 명령어로 추가하면 된다. poetry.lock과 pyproject.toml 에 dependency가 추가됨

스크린샷 2023-06-11 오후 4 33 52스크린샷 2023-06-11 오후 4 34 48스크린샷 2023-06-11 오후 4 37 11

 

pyproject.toml에서 'entrypoint script'를 지정할 수 있다.

  • 예시의 경우 deploy_today_poetry 패키지의 main.main 함수를 사용한다는 뜻

스크린샷 2023-06-11 오후 4 40 10스크린샷 2023-06-11 오후 4 48 29

 

poetry build 수행하면 source distribution / binary distribution을 생성함.

  • pypi 토큰도 poetry config command로 추가할 수 있다.

스크린샷 2023-06-11 오후 4 49 32스크린샷 2023-06-11 오후 4 49 40

 

repo에 publish / install도 poetry command로 할 수 있다.

스크린샷 2023-06-11 오후 4 50 51

반응형

'학습일지 > Language' 카테고리의 다른 글

GopherCon 2023 - the Secret life of Goroutine  (0) 2024.11.30
Writing Beautiful Package in Go  (0) 2022.05.29
Go - Context 정리  (0) 2022.05.26
JIT Compiler  (0) 2021.03.11
[Design Pattern] Facade  (0) 2020.12.28