etc

venv → poetry 로 포팅하기

민사민서 2024. 8. 29. 13:06

회사 프로젝트를 하는데, 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