Backend

solved! windows python pre-commit error

뒷골목프로그래머 2023. 2. 16. 16:29
반응형

Windows 환경에서 적용 불가 에러 해결

 야심차게 Pre-commit을 잘 적용했고 동료들이 잘 썼지만 변수가 하나 있었습니다. 바로 Windows PC를 사용하는 환경에서는 pre-commit을 제대로 수행 할 수 없었습니다. 원인은 Python PATH 문제 였으며, 해결 방법으로 아래 처럼 pytest 수행 시 entry: 부분에 python path를 직접 넣는 방법이 있었습니다.

...
- id: pytest
  name: pytest
  entry: C:\\Users\\sobor\\anaconda3\\envs\\venv\\python.exe -m pytest -s
...

 하지만 이것은 아니라는 생각이 들었습니다. 각자 local 환경의 python PATH 를 위와 같이 입력하고, .pre-commit-config.yaml 파일을 .gitignore에 추가하고 각자 관리하자는 의견이 있었지만 사람 보다 시스템을 믿기에 수용하지 않았습니다. 대신에 아래와 같은 방법으로 직접 해결했습니다.

 

 발생하는 문제는 다음과 같았습니다. pytest 를 실행하고 싶지만, 그냥 pytest 만 입력 할 경우 python PATH 문제로 ModuleNotFoundError: No module named 'pytest' 가 발생하는 것이었습니다. 뿐만 아니라, Project Root 를 찾지 못한다던가 python 내장 모듈 등 다수의 에러가 발생했습니다.

그리하여 pre-commit 실행 시 바라보는 python PATH와 무관하게 실행 가능하도록 project에 적용 중인 requirements.txt 를 설치 후, pytest가 실행되도록 아래 runpytest 파일을 .pre-commit-config와 같은 위치에 작성했습니다.

#!/bin/sh
set -o errexit

cd "$(dirname $0)"

pip install -r requirements.txt

python -m pytest -s -v

  그런 다음 .pre-commit-config.yaml 파일의 entry 에서 위 스크립트를 실행하도록 아래와 같이 작성했습니다.

...
entry: sh ./run_pytest
...


######### 전체 .pre-commit-config.yaml
repos:
- repo: local
  hooks:
    - id: flake8
      additional_dependencies: [ flake8==6.0.0 ]
      name: PEP8 Check (flake8)
      entry: flake8
      args:
        - "--max-line-length=120"
      language: python
      types: [ python ]
      require_serial: true
    - id: unit test
      name: unit test
      entry: sh ./run_pytest
      language: system
      types: [ python ]

 

향후 추진

 위에서 진행한 모든 과정 덕분에 Windows, Mac, Ubuntu 환경에서 모두 사용 가능한 pre-commit을 적용했습니다. 하지만, 적용 후 'pytest 실행을 위해 local에서 매번 requirements.txt 를 실행시키는 것은 또 비효율이 아닌가?' 라는 생각을 하게되었습니다. 그리하여, 향후에는 pre-commit으로는 flake8, mypy와 같이 PyLint 관련 검사만 진행하고 pytest 는 GitLab에서 merge request 시, 수행하는 방향으로 수정하려 합니다. 해당 적용기 또한, 블로그에 업로드 하겠습니다.

반응형