导入错误:无法从“click”中导入名称“_unicodefun”。

174

在使用Python的Black包运行我们的lint检查时,会出现以下错误:

ImportError: 无法从'click'导入名称'_unicodefun' (/Users/robot/.cache/pre-commit/repo3u71ccm2/py_env-python3.9/lib/python3.9/site-packages/click/init.py)`

通过研究,我发现以下相关问题:

我该如何解决这个问题?这是linter的误报吗?我需要修改我的代码吗?


4
尽可能使用最新版本的软件包。 - MaGaroo
1
请问您能否[编辑]问题以澄清此处使用的版本?显然,这个错误在问题提出之前的2天已经被最新的black版本修复了,因此即使是“当时最新版本”也不是一个明智的猜测。 - MisterMiyagi
6个回答

224

这个问题已经被Black 22.3.0修复了。在此之前的版本将无法与click 8.1.0一起使用。

与 click 8.1.0 不兼容(ImportError:无法从 'click' 导入名称 '_unicodefun')#2964

例如:black.yml

          python-version: 3.8
      - name: install black
        run: |
-          pip install black==20.8b1
+          pip install black==22.3.0
      - name: run black
        run: |
          black . --check --line-length 100

https://github.com/Clinical-Genomics/cgbeacon2/pull/221/files

为解决此问题,请通过pip install --upgrade click==8.0.2click 锁定到最新版本。


38

如果您在pre-commit hook的YAML中使用black,您可以更新pre-commit文件(通常为.pre-commit-config.yaml)以引用更近期版本的black(>=22.3.0),例如:

# See https://pre-commit.com for more information
# See https://pre-commit.com/hooks.html for more hooks
repos:
-   repo: https://github.com/pre-commit/pre-commit-hooks
    rev: v3.2.0
    hooks:
    -   id: trailing-whitespace
    -   id: end-of-file-fixer
    -   id: check-yaml
    -   id: check-added-large-files
-   repo: https://github.com/psf/black
    rev: 22.3.0
    hooks:
    -   id: black
        exclude: ^dist/

如果YAML文件将black本身固定在特定版本上,那么运行pip安装新版本的black并不足以满足命令行pre-commit钩子的要求...,而pre-commit默认会这样做。另请参见Black的GitHub问题跟踪器。


17
如果以上方法都不起作用,你可能有一些来自代码之前更改的麻烦缓存。尝试运行:
pre-commit clean
pre-commit autoupdate

6

修复

这里有几个常见的用例:

解决预提交yaml中的错误

.pre-commit-config.yaml

- repo: https://github.com/psf/black
  rev: 22.3.0
  hooks:
    - id: black

如果问题在pre-commit阶段持续存在,很可能是因为旧版本被缓存了(正如这里所建议的)。运行pre-commit clean然后pre-commit install进行重置。

解决pyproject.toml中的错误

pyproject.toml

[tool.poetry.dev-dependencies]
black = {version = "^22.3.0", allow-prereleases = true}

[tool.black]
# https://github.com/psf/black
target-version = ["py39"]
line-length = 120
color = true

示例

需要在pyproject.toml文件上方使用

使用Makefile和Poetry

Makefile

#* Poetry
.PHONY: poetry-download
poetry-download:
    curl -sSL https://install.python-poetry.org | $(PYTHON) -

.PHONY: pre-commit-install
pre-commit-install:
    poetry run pre-commit install

#* Formatters
.PHONY: codestyle
codestyle:
    poetry run black --config pyproject.toml ./

.pre-commit-config.yaml

default_language_version:
  python: python3.9

default_stages: [commit, push]

repos:
  - repo: local
    hooks:
      - id: black
        name: black
        entry: poetry run black --config pyproject.toml
        types: [python]
        language: system

GitHub链接

以下链接详细描述了依赖冲突的情况。


1

您需要在additional_dependencies部分为黑色修订版20.8b1指定一个8.0.2的点击版本(能够清理python27代码),例如:

- repo: https://github.com/psf/black
  rev: 20.8b1
  hooks:
    - id: black
      name: Blacken python source
      additional_dependencies: ["click==8.0.2"]

0

如果您正在使用黑色格式化Python 2.7代码,并且由于不支持放弃Python 2.7,因此无法进行黑色更新,请尝试安装click==8.0.4。 以下是我为遗留的Python 2.7项目使用的GitHub操作的.github/workflows/black.yml

name: Black check

on: [pull_request]

jobs:
  black-check:
    runs-on: ubuntu-22.04
    name: Black
    steps:
      - uses: actions/checkout@v3
      - name: Set up Python
        uses: actions/setup-python@master
        with:
          python-version: 3.8
      - name: install black
        run: |
          pip install click==8.0.4 black==21.9b0
      - name: run black
        run: |
          black . -t py27 --check

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接