预提交找不到python包

2024-09-29 23:24:00 发布

您现在位置:Python中文网/ 问答频道 /正文

我使用pyenv来支持不同版本的python

在使用python3.7的项目中,我还希望在进行代码更改时运行pre-commit的linting

但是当lint规则运行时,pre-commit似乎在用户下的缓存文件夹中查找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解决了问题,但感觉不对..必须可以配置为使用系统包或类似


Tags: 项目代码用户版本pyenvcache规则系统
1条回答
网友
1楼 · 发布于 2024-09-29 23:24:00

pre-commit为每个工具安装隔离的环境,这样它们就不会干扰本地开发。听起来您在该环境中缺少依赖项

在缓存环境中运行pip install是不受支持的,这样做可能会破坏预提交。它们是有意的私有实现细节,所以您不会弄乱它们

您有两个主要选择:

使脚本独立工作(受支持的方式)

设置您的工具,以便它们正确地指定它们的依赖关系(您还没有显示配置,但我猜您正在调用一些脚本?)

对于已安装的存储库,应在安装元数据中列出工具的依赖项(通常为setup.py/setup.cfg/pyproject.toml

例如,pre-commit/pre-commit-hooks指定these dependencies

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

对于具有language: pythonlocal存储库,您应该在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,预提交不提供环境。建立这样的环境是每个用户的责任。这些都是正常方式的逃生舱,因为它们首先有点违背了框架的目的(即提供自己所需的工具,而每个开发人员都不需要仔细管理一堆工具)

对于^{},您应该使用language: system,如果用户的环境配置错误,希望您的脚本生成有用的错误消息

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

免责声明:我创建了预提交

相关问题 更多 >

    热门问题