[python] 패키지 관리를 위한 poetry(가상환경까지)

poetry소개

poetry는 python 개발시 패키지의 의존성을 관리하는 라이브러리 이며, 자바의 maven이나 gradle 비슷한 툴이라고 볼 수 있씁니다. 또한 virtualenv와 같이 가상환경 설정을 지원하여, 보다 포괄적인 의미의 기능도 있으며, build/publish 같은 배포까지도 가능한 범용적인 tool로도 사용할 수 있습니다.

(본 문서는 poetry를 이용한 기본 설치 및 사용법과 실제 chatops를 개발 하기 위해 적용한 사례의 예시 기반으로 작성 되었습니다.)

설치

Linux 에서 설치(ubuntu 20.04)

curl -sSL https://raw.githubusercontent.com/python-poetry/poetry/master/get-poetry.py | python3

설치 후 poetry 명령어를 수행하면 “command not found” 에러가 발생하는데, 설치 시 출력되는 설명처럼 $PATH에 $HOME/.protry/bin을 추가하거나 `source $HOME/.poetry/env`를 직접 입력하면 poetry 명령어를 수행 할 수 있습니다.

프로젝트 생성

첫번째, chatops의 server 프로젝트를 생성

poetry new chatops-server --src

두번째, chatops의 agent 프로젝트를 생성

poetry new chatops-agent --src

`–src` 옵션을 주면 생성된 프로젝트명 하위의 `src` 디렉토리에 소스가 위치하게되며, 생략시 프로젝트 명 하위에 소스가 위치하게 된다. 위와 같이 명령어를 실행 했을 경우 아래와 같은 디렉토리 구조가 됩니다.


chatops-server
chatops-agent

패키지 추가

이제 poetry를 사용하는 근본적 이유 이면서, 굉장히 막강한 기능인 패키지 추가 삭제를 해보겠습니다.

아래의 명령으로 패키지를 추가할 수 있다. 실제 chatops에서 cache를 위해 사용될 ExpiringDict 모듈을 설치해 볼 것입니다. 해당 명령어는 pyproject.toml 이 존재하는 디렉토리에서 실행 해야 합니다.

poetry add expiringdict
ExpiringDict 패키지 추가 완료 화면

위의 패키지 추가 완료 화면에서 보이는 문구중에 “Writing Lock File” 이 바로 poetry.lock 파일에 쓰기를 한다는 내용이며, 이 poetry.lock 파일이 있으면 지금 현재 프로젝트의 의존성과 완전히 동일한 의존성을 가지도록 구성할 수 있어, 해당 파일이 개발 환경 가이드라인의 배포 시에 같이 배포 될 수 있도록 하는 부분이 필요합니다. 예를 들면, git에 poetry.lock파일을 업로드 하여 개발 팀원들이 공유 받아서 사용하도록 할 수 있습니다.또한 pyproject.toml의 내용을 보면 방금 설치한 ExpiringDict 패키지의 의존성이 추가되어 있음을 확인 할 수 있습니다.

ExpiringDict 의존성 추가 확인

위의 의존성 추가 부분에서 “^” 이런 마크의 정확한 내용은 아래의 링크에서 확인 할 수 있는데, 위의 expiringdict를 예로 설명 들면 “>=1.2.1<2.0.0”을 의미합니다. 아래 링크를 참조 바랍니다.

https://python-poetry.org/docs/dependency-specification/

프로젝트 빌드

poetry는 build를 지원하여 배포가 가능한 파일도 생성 할 수 있습니다.

poetry build
build 후 화면

위 그림 처럼 build를 수행 하면, dist 디렉토리 하위에 배포가 가능한 파일들이 생성 되며, 이를 이용해 운영환경에 배포할 수 있습니다. 물론 setup.py를 이용하여 잘 정리된 build 파일로 만들어 질 수 있습니다.

Virtual Environments

poetry는 virtuanlenv와 동일한 가상환경(virtualenv)를 자체적으로 관리 할 수 있습니다.

가상환경 생성

그러면 가상환경을 실행하기 위해 아래의 명령어를 수행해 보도록 하겠습니다.

  poetry env use $PYTHON_HOME/bin/python3

가상환경 접속

생성한 가상환경을 사용하기 위해서는 다음의 shell 옵션을 추가해서 실행하면 됩니다.

  poetry shell

shell 접속을 하면 프롬프트에 접두어(위의 경우 `chatops-server-vywmTEbm-py3.8`)가 붙게 되며 해당 값은 아래의 명령어로 확인 할 수 있습니다.

  poetry env info

위의 그림에서 보듯이 `poetry env use` 명령으로 생성된 python은 $HOME/.cache/pypoetry/viertualenvs/ 하위 디렉토리에 위치하게 되며 가상환경의 shell로 접속하여 수행되는 poetry add 패키지는 해당 디렉토리에 설치가 됩니다.

expringdict를 가상환경에서 재설치

가상환경 접속종료

가상 환경을 종료 할때는 exit 명령을 수행 하여 빠져 나갈 수 있으며, 다시 다른 가상 환경을 사용하기 위해 접속해도 문제가 없이 실행 됩니다.

가상환경 삭제하기

가상환경을 삭제하기 위해서는 다음 명령어를 수행해야 합니다. virtualenv처럼 디렉토리 자체를 삭제하면 문제가 발생 할 수 있습니다.

 poetry env remove $PYTHON_HOME/bin/python3

requirements.txt 추출하기

poetry도 requirements.txt 파일을 추출 할 수 있으며, poetry export 명령어로 다음과 같이 수행하여 설치된 모듈만 배포할 수 있습니다. (pyproject.toml파일에 설치된 모듈의 목록이 잘 정리 되어 있어 poetry build를 이용하여 생성된 파일로 배포를 수행할 수도 있습니다.)

 poetry export -f requirements.txt > requirements.txt

Conclusion

오랜기간 java개발 만을 해왔고 최근에서야 python 개발을 본격적으로 시작하게 되어 python의 일반적인 개발 환경 설정부분이 궁금하여 virtualenv, pyenv등의 python 환경 설정 관련 패키지들을 공부하다가 poetry를 알게 되면서, 이제 개발 환경 설정 관련 부분은 poetry만 있으면 충분히 개발 할 수 있을 거라고 생각하게 되어 위의 문서를 작성 하게 되었습니다. 현재 poetry를 이용한 chatops개발을 진행 할 예정이며 향후에 개발이 완료 되었을 때 다시 한번 poetry의 실제 적용사례 및 배포관련된 부분의 내용을 작성 하도록 하겠습니다. python 기반의 프로젝트를 처음 시작하는 분들께 도움이 되었으면 좋겠습니다.

댓글 남기기