회사 프로젝트를 하는데, venv + requirements.txt 로 의존성 하기가 너무 귀찮았음
분명 로컬 환경에서는 잘 됐는데 workflow의 일부 테스트환경에서는 실패하고,, 처음엔 requirements.txt 하나하나 수정했었는데 너무 귀찮더라고요
poetry 란?
- python 의존성 관리와 패키지 배포를 도와주는 도구
- pip + virtualenv 조합을 대체할 수 있음
- pyproject.toml 파일을 사용해 프로젝트 설정과 의존성 관리
- poetry.lock 파일은 의존성이 해결된 후 생성되어, 의존성 트리에 있는 모든 패키지 정보를 lock/기록
이렇게 add 하려고 할 때, 자동으로 의존성 관리를 해줍니다.
물론 프로젝트 초기부터 poetry 세팅하고 의존성 하나하나 add 해줬다면 좋겠지만, 지금은 venv로 관리하던 의존성을 poetry 환경으로 옮겨야 하니까..
.venv 에서 poetry 로 포팅하기
poetry 설치
# mac, linux, windows(wsl)
curl -sSL https://install.python-poetry.org | python3 -
# windows
(Invoke-WebRequest -Uri https://install.python-poetry.org -UseBasicParsing).Content | python -
설치된 poetry를 업데이트하고 싶다 (너무 예전에 설치해놓은 것 같다)
poetry self update
기존 venv는 삭제합니다
rm -rf .venv
(삭제 안하면 기존 .venv 폴더를 사용해버림)
프로젝트 초기화
poetry init
⇒ pyproject.toml 파일이 생성됩니다
⇒ 패키지 이름, 버전, 설명, 작성자 정보, 파이썬 버전 호환성, 의존성 추가 여부 물어봄 (이후 수정 가능)
pyproject.toml 기타 설정
[tool.poetry]
...
package-mode = false
[tool.poetry.dependencies]
python = ">=3.8,<3.11"
패키지로 관리하지 않고 의존성 관리만 하고싶으면 패키지 모드를 false로 바꾸면 되고,
기존 dependencies가 특정 파이썬 버전들에서만 동작해서 제한해야 하면 버전 범위를 설정하면 됩니다 (저 줄 생략되면 poetry add 가 계속 실패함!!!)
cf) 패키지로 관리하고 싶다면 python 파일들이 포함된 디렉토리를 만들고, __init__.py 를 추가하여 패키지로 인식되도록 함
원래 poetry add ~~ 하나하나 해줘야하는데 requirements.txt 의 dependencies를 바로 포팅해오려면
poetry add $(cat requirements.txt | xargs)
⇒ 이거 하면 pyproject.toml 파일의 [tool.poetyr.dependencies] 아래 쭉 dependencies들이 추가되고
⇒ poetry.lock 파일이 새롭게 생기며 모든 의존성이 고정됨
⇒ requirement.txt는 필요없으므로 지워도 됨
이후 프로젝트 진행하다 dependency 추가하려면
poetry add rootutils
⇒ 자동으로 의존성 충돌 확인하고 없으면 반영
생성된 poetry를 사용하려면
poetry shell # 또는
source /Users/kimminseo/Library/Caches/pypoetry/virtualenvs/gaze-auto-labeling-lQ8YXbiU-py3.10/bin/activate
이렇게 아예 가상환경에 진입하거나
poetry run pytest -v
이렇게 진입하지 않고 밖에서 실행만 시킬수도 있음
가상환경에서 나오기
deactivate
특정 패키지 삭제
poetry remove pygobject
트러블슈팅 몇 가지
1. 가끔 가상환경에서 deactivate 로 빠져나오고 다시 poetry shell로 접근하려고 할 때 이미 돌고 있다고 하는 경우가 있는데
⇒ 그냥 터미널 껐다 키면 해결되더라고요
2. poetry 세팅할 때 현재 프로젝트 root를 패키지로 관리하고자 했는데 아래와 같은 에러가 남
Installing the current project: gaze-auto-labeling (0.1.0)
tuple index out of range
⇒ 프로젝트 구조가 잘못된 것
⇒ package 만들고자 하는 root directory에는 .py 파일들이 존재해서는 안됨
3. github workflow step을 약간 수정해야함
- name: Install dependencies
run: |
python -m pip install --upgrade pip
pip install -r requirements.txt
pip install pytest
pip install sh
- name: List dependencies
run: |
python -m pip list
- name: Run pytest
run: |
pytest -v
이런 식에서
- name: Install Poetry
run: |
curl -sSL https://install.python-poetry.org | python3 -
- name: Install dependencies
run: |
poetry install
- name: List dependencies
run: |
poetry show
- name: Run pytest
run: |
poetry run pytest -v
이런 식으로 (mac, ubuntu)
- name: Install Poetry
run: |
(Invoke-WebRequest -Uri https://install.python-poetry.org -UseBasicParsing).Content | python -
- name: Install dependencies
run: |
C:\Users\runneradmin\AppData\Roaming\Python\Scripts\poetry install
- name: List dependencies
run: |
C:\Users\runneradmin\AppData\Roaming\Python\Scripts\poetry show
- name: Run pytest
run: |
C:\Users\runneradmin\AppData\Roaming\Python\Scripts\poetry run pytest -v
윈도우의 경우 설치 후에 poetry를 못찾는 상황이 종종 있음, 환경변수 추가해줘도 인식을 못하더라고요.
그래서 실패 로그 보고 그냥 절대경로 넣어주니까 해결
- name: Install Poetry
run: |
curl -sSL https://install.python-poetry.org | python3 -
- name: Install dependencies
run: |
poetry install
poetry add --dev pytest pytest-cov
pytest로 커버리지 측정 시 pytest-cov 가 poetry dependencies 리스트에 있어도 왠지 모르겠는데 인식이 안돼서 poetry install 후 추가로 poetry add 진행했더니 해결
4. poetry shell로 실행 시 사용 가능한 파이썬 버전들 중 설치된 제일 낮은 버전 (ex. 3.8) 자동으로 실행
특정 버전을 지정하고 싶으면
poetry env use 3.10
poetry install
버전을 바꾼다면 다시 dependencies 설치해야함 (3.10 가상환경에는 설치 안되어있을것이므로)
'etc' 카테고리의 다른 글
PyTorch와 PyTorch Lightning (0) | 2024.08.29 |
---|---|
rootutils로 프로젝트 구조 관리하기 (0) | 2024.08.29 |
pinball loss란 (0) | 2024.08.29 |
github dependabot (0) | 2024.08.29 |
[논문] Gaze360: Physically Unconstrained Gaze Estimation in the Wild (0) | 2024.08.29 |