Предварительная фиксация не обнаруживает пакеты Python

Я использую pyenv для поддержки разных версий python.

В проекте, использующем python 3.7, я также хочу, чтобы линтинг с предварительной фиксацией выполнялся при изменении кода.

Но когда правила lint работают, кажется, что предварительная фиксация ищет пакеты python в папке кеша под пользователем и, таким образом, не может их найти ... даже если они установлены на системном уровне. Например:

>git ci -m'lint test'  
...
...
/Users/[]/.cache/pre-commit/repo180cws4u/py_env-python3.7/lib/python3.7/site-packages/ 
...
ModuleNotFoundError: No module named 'six'


>pip list | grep six
six                 1.11.0

Как я могу это решить. (Коллега выполнил запуск /Users/[]/.cache/pre-commit/repo180cws4u/bin/python install -m six, который решил проблему, но считает, что это не так ... должна быть возможность настроить для использования системных пакетов или аналогичных ..?


person Tomas B    schedule 12.02.2021    source источник
comment
пожалуйста, покажите вашу фактическую конфигурацию и неотредактированный результат - вы скрыли полезную информацию   -  person Anthony Sottile    schedule 12.02.2021


Ответы (1)


pre-commit устанавливает изолированные среды для каждого из инструментов, чтобы они не мешали локальной разработке. Похоже, вам не хватает зависимостей в этой среде

Выполнение pip install внутри сред кеширования очень не поддерживается, и вы, вероятно, нарушите предварительную фиксацию, сделав это. Они преднамеренно являются частными деталями реализации, поэтому вы не можете с ними связываться!

У вас есть два основных варианта:

заставить ваши скрипты работать изолированно (поддерживаемый способ)

настройте свои инструменты так, чтобы они правильно указывали свои зависимости (вы не показали свою конфигурацию, но я предполагаю, что вы вызываете какой-то скрипт?)

для устанавливаемых репозиториев зависимости вашего инструмента должны быть указаны в ваших метаданных установки (обычно setup.py / setup.cfg / pyproject.toml)

Например, pre-commit/pre-commit-hooks указывает / а>:

# setup.cfg
install_requires =
    ruamel.yaml>=0.15
    toml

для local репозиториев с language: python вы должны указать свои зависимости в additional_dependencies - например:

-   repo: local
    hooks:
    -   id: run-the-thing
        name: run the thing
        entry: ./scripts/lint
        additional_dependencies: [six, ...]
        language: python
        types: [python]

локальные хуки репозитория (аварийный люк)

с language: system / language: script предварительная фиксация не подготавливает среду. Каждый пользователь несет ответственность за создание такой среды. это выход из обычного пути, потому что они как бы побеждают цель фреймворка в первую очередь (которая заключается в предоставлении необходимых инструментов самостоятельно - без необходимости каждого разработчика тщательно управлять кучей инструментов)

Для repo: local вы должны использовать language: system и просто надеяться, что ваш скрипт выдаст полезное сообщение об ошибке. если среда пользователя неправильно настроена

-   repo: local
    hooks:
    -   id: run-the-thing
        name: run the thing
        entry: ./scripts/lint
        language: system
        types: [python]

отказ от ответственности: я создал предварительную фиксацию

person Anthony Sottile    schedule 12.02.2021
comment
Спасибо, хороший и точный ответ! Похоже, это должно немного помочь. Однако я не могу найти нашу конфигурацию ... мы устанавливаем предварительную фиксацию с помощью pip install. У нас есть несколько дополнительных правил линтинга, но нет никаких конфигурационных файлов для предварительной фиксации, которые я могу найти ... ни в репо, ни в моей домашней папке. Где мне искать? - person Tomas B; 13.02.2021
comment
конфигурация предварительной фиксации живет по адресу ./.pre-commit-config.yaml - person Anthony Sottile; 13.02.2021