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