导入错误:无法从'markupsafe'中导入'soft_unicode'名称

117

我正在尝试构建一个包含Airflow和Postgres的docker容器,但在构建过程中遇到了许多错误,如下所示。我已经尝试按照以下方式通过降级requirements.txt中的markupsafe来解决此问题,但并没有帮助。我该怎么办才能解决这个问题?

# I tried this version:
markupsafe==2.1.1
# and then also this one:
markupsafe==2.0.1

错误信息:

ImportError: cannot import name 'soft_unicode' from 'markupsafe' (/usr/local/lib/python3.7/site-packages/markupsafe/__init__.py)

我的docker-compose.yml文件:

version: '3'
services:
  postgres:
    image: postgres:11.2
    environment:
      - POSTGRES_USER=airflow
      - POSTGRES_PASSWORD=airflow
      - POSTGRES_DB=airflow
    ports:
      - "5432:5432"

  webserver:
    image: puckel/docker-airflow:1.10.4
    build:
      context: https://github.com/puckel/docker-airflow.git#1.10.4
      dockerfile: Dockerfile
      args:
        AIRFLOW_DEPS: gcp_api,s3
    restart: always
    depends_on:
      - postgres
    environment:
      - LOAD_EX=n
      - EXECUTOR=Local
      - FERNET_KEY=jsDPRErfv8Z_eVTnGfF8ywd19j4pyqE3NpdUBA_oRTo=
    volumes:
      - ./sparkify/dags:/usr/local/airflow/dags
      # Uncomment to include custom plugins
      - ./sparkify/plugins:/usr/local/airflow/plugins
    ports:
      - "8081:8081"
    command: webserver
    healthcheck:
      test: ["CMD-SHELL", "[ -f /usr/local/airflow/airflow-webserver.pid ]"]
      interval: 30s
      timeout: 30s
      retries: 3

  requirements:
    image: python:3.8-alpine
    volumes:
      - .:/sparkify
    working_dir: /sparkify
    command: pip3 install -r requirements.txt

我的requirements.txt文件:

markupsafe==2.0.1

完整的堆栈跟踪:

Creating network "airflowwithpostgres_default" with the default driver
Creating airflowwithpostgres_postgres_1     ... done
Creating airflowwithpostgres_requirements_1 ... done
Creating airflowwithpostgres_webserver_1    ... done
Attaching to airflowwithpostgres_requirements_1, airflowwithpostgres_postgres_1, airflowwithpostgres_webserver_1
postgres_1      | The files belonging to this database system will be owned by user "postgres".
postgres_1      | This user must also own the server process.
postgres_1      | 
webserver_1     | Tue May 10 18:38:28 UTC 2022 - waiting for Postgres... 1/20
postgres_1      | The database cluster will be initialized with locale "en_US.utf8".
postgres_1      | The default database encoding has accordingly been set to "UTF8".
postgres_1      | The default text search configuration will be set to "english".
postgres_1      | 
postgres_1      | Data page checksums are disabled.
postgres_1      | 
postgres_1      | fixing permissions on existing directory /var/lib/postgresql/data ... ok
postgres_1      | creating subdirectories ... ok
postgres_1      | selecting default max_connections ... 100
postgres_1      | selecting default shared_buffers ... 128MB
postgres_1      | selecting dynamic shared memory implementation ... posix
postgres_1      | creating configuration files ... ok
postgres_1      | running bootstrap script ... ok
postgres_1      | performing post-bootstrap initialization ... ok
postgres_1      | syncing data to disk ... 
postgres_1      | WARNING: enabling "trust" authentication for local connections
postgres_1      | You can change this by editing pg_hba.conf or using the option -A, or
postgres_1      | --auth-local and --auth-host, the next time you run initdb.
postgres_1      | ok
postgres_1      | 
postgres_1      | Success. You can now start the database server using:
postgres_1      | 
postgres_1      |     pg_ctl -D /var/lib/postgresql/data -l logfile start
postgres_1      | 
postgres_1      | waiting for server to start....2022-05-10 18:38:29.428 UTC [44] LOG:  listening on Unix socket "/var/run/postgresql/.s.PGSQL.5432"
postgres_1      | 2022-05-10 18:38:29.441 UTC [45] LOG:  database system was shut down at 2022-05-10 18:38:29 UTC
postgres_1      | 2022-05-10 18:38:29.446 UTC [44] LOG:  database system is ready to accept connections
postgres_1      |  done
postgres_1      | server started
postgres_1      | CREATE DATABASE
postgres_1      | 
postgres_1      | 
postgres_1      | /usr/local/bin/docker-entrypoint.sh: ignoring /docker-entrypoint-initdb.d/*
postgres_1      | 
postgres_1      | 2022-05-10 18:38:29.859 UTC [44] LOG:  received fast shutdown request
postgres_1      | waiting for server to shut down....2022-05-10 18:38:29.861 UTC [44] LOG:  aborting any active transactions
postgres_1      | 2022-05-10 18:38:29.865 UTC [44] LOG:  background worker "logical replication launcher" (PID 51) exited with exit code 1
postgres_1      | 2022-05-10 18:38:29.865 UTC [46] LOG:  shutting down
postgres_1      | 2022-05-10 18:38:29.882 UTC [44] LOG:  database system is shut down
postgres_1      |  done
postgres_1      | server stopped
postgres_1      | 
postgres_1      | PostgreSQL init process complete; ready for start up.
postgres_1      | 
postgres_1      | 2022-05-10 18:38:29.974 UTC [1] LOG:  listening on IPv4 address "0.0.0.0", port 5432
postgres_1      | 2022-05-10 18:38:29.974 UTC [1] LOG:  listening on IPv6 address "::", port 5432
postgres_1      | 2022-05-10 18:38:29.976 UTC [1] LOG:  listening on Unix socket "/var/run/postgresql/.s.PGSQL.5432"
postgres_1      | 2022-05-10 18:38:29.989 UTC [62] LOG:  database system was shut down at 2022-05-10 18:38:29 UTC
postgres_1      | 2022-05-10 18:38:29.994 UTC [1] LOG:  database system is ready to accept connections
requirements_1  | Collecting markupsafe==2.1.1
requirements_1  |   Downloading MarkupSafe-2.1.1-cp38-cp38-musllinux_1_1_x86_64.whl (29 kB)
requirements_1  | Installing collected packages: markupsafe
requirements_1  | Successfully installed markupsafe-2.1.1
requirements_1  | WARNING: Running pip as the 'root' user can result in broken permissions and conflicting behaviour with the system package manager. It is recommended to use a virtual environment instead: https://pip.pypa.io/warnings/venv
airflowwithpostgres_requirements_1 exited with code 0
postgres_1      | 2022-05-10 18:38:33.377 UTC [69] LOG:  incomplete startup packet
webserver_1     | Traceback (most recent call last):
webserver_1     |   File "/usr/local/bin/airflow", line 21, in <module>
webserver_1     |     from airflow import configuration
webserver_1     |   File "/usr/local/lib/python3.7/site-packages/airflow/__init__.py", line 39, in <module>
webserver_1     |     from airflow.models import DAG
webserver_1     |   File "/usr/local/lib/python3.7/site-packages/airflow/models/__init__.py", line 21, in <module>
webserver_1     |     from airflow.models.baseoperator import BaseOperator  # noqa: F401
webserver_1     |   File "/usr/local/lib/python3.7/site-packages/airflow/models/baseoperator.py", line 30, in <module>
webserver_1     |     import jinja2
webserver_1     |   File "/usr/local/lib/python3.7/site-packages/jinja2/__init__.py", line 33, in <module>
webserver_1     |     from jinja2.environment import Environment, Template
webserver_1     |   File "/usr/local/lib/python3.7/site-packages/jinja2/environment.py", line 15, in <module>
webserver_1     |     from jinja2 import nodes
webserver_1     |   File "/usr/local/lib/python3.7/site-packages/jinja2/nodes.py", line 19, in <module>
webserver_1     |     from jinja2.utils import Markup
webserver_1     |   File "/usr/local/lib/python3.7/site-packages/jinja2/utils.py", line 642, in <module>
webserver_1     |     from markupsafe import Markup, escape, soft_unicode
webserver_1     | ImportError: cannot import name 'soft_unicode' from 'markupsafe' (/usr/local/lib/python3.7/site-packages/markupsafe/__init__.py)
webserver_1     | Traceback (most recent call last):
webserver_1     |   File "/usr/local/bin/airflow", line 21, in <module>
webserver_1     |     from airflow import configuration
webserver_1     |   File "/usr/local/lib/python3.7/site-packages/airflow/__init__.py", line 39, in <module>
webserver_1     |     from airflow.models import DAG
webserver_1     |   File "/usr/local/lib/python3.7/site-packages/airflow/models/__init__.py", line 21, in <module>
webserver_1     |     from airflow.models.baseoperator import BaseOperator  # noqa: F401
webserver_1     |   File "/usr/local/lib/python3.7/site-packages/airflow/models/baseoperator.py", line 30, in <module>
webserver_1     |     import jinja2
webserver_1     |   File "/usr/local/lib/python3.7/site-packages/jinja2/__init__.py", line 33, in <module>
webserver_1     |     from jinja2.environment import Environment, Template
webserver_1     |   File "/usr/local/lib/python3.7/site-packages/jinja2/environment.py", line 15, in <module>
webserver_1     |     from jinja2 import nodes
webserver_1     |   File "/usr/local/lib/python3.7/site-packages/jinja2/nodes.py", line 19, in <module>
webserver_1     |     from jinja2.utils import Markup
webserver_1     |   File "/usr/local/lib/python3.7/site-packages/jinja2/utils.py", line 642, in <module>
webserver_1     |     from markupsafe import Markup, escape, soft_unicode
webserver_1     | ImportError: cannot import name 'soft_unicode' from 'markupsafe' (/usr/local/lib/python3.7/site-packages/markupsafe/__init__.py)
webserver_1     | Traceback (most recent call last):
webserver_1     |   File "/usr/local/bin/airflow", line 21, in <module>
webserver_1     |     from airflow import configuration
webserver_1     |   File "/usr/local/lib/python3.7/site-packages/airflow/__init__.py", line 39, in <module>
webserver_1     |     from airflow.models import DAG
webserver_1     |   File "/usr/local/lib/python3.7/site-packages/airflow/models/__init__.py", line 21, in <module>
webserver_1     |     from airflow.models.baseoperator import BaseOperator  # noqa: F401
webserver_1     |   File "/usr/local/lib/python3.7/site-packages/airflow/models/baseoperator.py", line 30, in <module>
webserver_1     |     import jinja2
webserver_1     |   File "/usr/local/lib/python3.7/site-packages/jinja2/__init__.py", line 33, in <module>
webserver_1     |     from jinja2.environment import Environment, Template
webserver_1     |   File "/usr/local/lib/python3.7/site-packages/jinja2/environment.py", line 15, in <module>
webserver_1     |     from jinja2 import nodes
webserver_1     |   File "/usr/local/lib/python3.7/site-packages/jinja2/nodes.py", line 19, in <module>
webserver_1     |     from jinja2.utils import Markup
webserver_1     |   File "/usr/local/lib/python3.7/site-packages/jinja2/utils.py", line 642, in <module>
webserver_1     |     from markupsafe import Markup, escape, soft_unicode
webserver_1     | ImportError: cannot import name 'soft_unicode' from 'markupsafe' (/usr/local/lib/python3.7/site-packages/markupsafe/__init__.py)
postgres_1      | 2022-05-10 18:38:35.020 UTC [70] LOG:  incomplete startup packet
webserver_1     | Traceback (most recent call last):
webserver_1     |   File "/usr/local/bin/airflow", line 21, in <module>
webserver_1     |     from airflow import configuration
webserver_1     |   File "/usr/local/lib/python3.7/site-packages/airflow/__init__.py", line 39, in <module>
webserver_1     |     from airflow.models import DAG
webserver_1     |   File "/usr/local/lib/python3.7/site-packages/airflow/models/__init__.py", line 21, in <module>
webserver_1     |     from airflow.models.baseoperator import BaseOperator  # noqa: F401
webserver_1     |   File "/usr/local/lib/python3.7/site-packages/airflow/models/baseoperator.py", line 30, in <module>
webserver_1     |     import jinja2
webserver_1     |   File "/usr/local/lib/python3.7/site-packages/jinja2/__init__.py", line 33, in <module>
webserver_1     |     from jinja2.environment import Environment, Template
webserver_1     |   File "/usr/local/lib/python3.7/site-packages/jinja2/environment.py", line 15, in <module>
webserver_1     |     from jinja2 import nodes
webserver_1     |   File "/usr/local/lib/python3.7/site-packages/jinja2/nodes.py", line 19, in <module>
webserver_1     |     from jinja2.utils import Markup
webserver_1     |   File "/usr/local/lib/python3.7/site-packages/jinja2/utils.py", line 642, in <module>
webserver_1     |     from markupsafe import Markup, escape, soft_unicode
webserver_1     | ImportError: cannot import name 'soft_unicode' from 'markupsafe' (/usr/local/lib/python3.7/site-packages/markupsafe/__init__.py)
webserver_1     | Traceback (most recent call last):
webserver_1     |   File "/usr/local/bin/airflow", line 21, in <module>
webserver_1     |     from airflow import configuration
webserver_1     |   File "/usr/local/lib/python3.7/site-packages/airflow/__init__.py", line 39, in <module>
webserver_1     |     from airflow.models import DAG
webserver_1     |   File "/usr/local/lib/python3.7/site-packages/airflow/models/__init__.py", line 21, in <module>
webserver_1     |     from airflow.models.baseoperator import BaseOperator  # noqa: F401
webserver_1     |   File "/usr/local/lib/python3.7/site-packages/airflow/models/baseoperator.py", line 30, in <module>
webserver_1     |     import jinja2
webserver_1     |   File "/usr/local/lib/python3.7/site-packages/jinja2/__init__.py", line 33, in <module>
webserver_1     |     from jinja2.environment import Environment, Template
webserver_1     |   File "/usr/local/lib/python3.7/site-packages/jinja2/environment.py", line 15, in <module>
webserver_1     |     from jinja2 import nodes
webserver_1     |   File "/usr/local/lib/python3.7/site-packages/jinja2/nodes.py", line 19, in <module>
webserver_1     |     from jinja2.utils import Markup
webserver_1     |   File "/usr/local/lib/python3.7/site-packages/jinja2/utils.py", line 642, in <module>
webserver_1     |     from markupsafe import Markup, escape, soft_unicode
webserver_1     | ImportError: cannot import name 'soft_unicode' from 'markupsafe' (/usr/local/lib/python3.7/site-packages/markupsafe/__init__.py)
webserver_1     | Traceback (most recent call last):
webserver_1     |   File "/usr/local/bin/airflow", line 21, in <module>
webserver_1     |     from airflow import configuration
webserver_1     |   File "/usr/local/lib/python3.7/site-packages/airflow/__init__.py", line 39, in <module>
webserver_1     |     from airflow.models import DAG
webserver_1     |   File "/usr/local/lib/python3.7/site-packages/airflow/models/__init__.py", line 21, in <module>
webserver_1     |     from airflow.models.baseoperator import BaseOperator  # noqa: F401
webserver_1     |   File "/usr/local/lib/python3.7/site-packages/airflow/models/baseoperator.py", line 30, in <module>
webserver_1     |     import jinja2
webserver_1     |   File "/usr/local/lib/python3.7/site-packages/jinja2/__init__.py", line 33, in <module>
webserver_1     |     from jinja2.environment import Environment, Template
webserver_1     |   File "/usr/local/lib/python3.7/site-packages/jinja2/environment.py", line 15, in <module>
webserver_1     |     from jinja2 import nodes
webserver_1     |   File "/usr/local/lib/python3.7/site-packages/jinja2/nodes.py", line 19, in <module>
webserver_1     |     from jinja2.utils import Markup
webserver_1     |   File "/usr/local/lib/python3.7/site-packages/jinja2/utils.py", line 642, in <module>
webserver_1     |     from markupsafe import Markup, escape, soft_unicode
webserver_1     | ImportError: cannot import name 'soft_unicode' from 'markupsafe' (/usr/local/lib/python3.7/site-packages/markupsafe/__init__.py)
airflowwithpostgres_webserver_1 exited with code 1

pip install MarkupSafe==2.0.1 - Ofer Rahat
15个回答

177

降级markupsafe至2.0.1

pip install markupsafe==2.0.1


13
很遗憾,在2023年这仍然是可行的解决方案。如果它卸载了2.1.1,你可能需要使用--force选项,然后从缓存中重新安装2.1.1版本。监视 pip 输出以查看最终安装了什么内容。 - D.Deriso

38
原来是因为markupsafe移除了soft_unicode导致了这个错误!https://github.com/pallets/markupsafe/issues/304 请在您的PYTHON_DEPS中添加MarkupSafe==2.0.1,如下所示:
  webserver:
    image: puckel/docker-airflow:1.10.4
    build:
      context: https://github.com/puckel/docker-airflow.git#1.10.4
      dockerfile: Dockerfile
      args:
        AIRFLOW_DEPS: gcp_api,s3
        PYTHON_DEPS: MarkupSafe==2.0.1 

然后运行 docker-compose down 然后 docker-compose up -d --build,所有服务都应该在运行中!

如果您遇到另一个 ImportError,可以像这样将包添加到 PYTHON_DEPS

PYTHON_DEPS: MarkupSafe==2.0.1 example==1.1.9

17
根据日志,问题的根源在于 jinja2(较旧?)与其依赖项 markupsafe(更新?)不兼容。某些因素使得 jinja2 固定在一个较旧且不兼容的版本上。您可以将“太新”的包降级(正如大多数答案通常建议在这种情况下的解决方法一样,但这将带来技术债务),或者(更好的方法是)升级“太旧”的包,即 jinja2 到最新版本。
例如,只需将 jinja2 固定到不兼容的版本(例如 jinja2==2.11.3 - 一个非常流行的“最新工作”版本固定点:),同时保持其他相关(反向依赖,也是递归的)软件包处于它们的最新版本(例如 Flask==2.2.2,itsdangerous==2.1.2,Werkzeug==2.2.2等),就可以重现此错误。取消固定 jinja2 并让其升级(到3.1.2)可解决 ImportError 问题。
注意,如果打印 MarkupSafe 的反向依赖关系,可以像这样:
# pip install pipdeptree
pipdeptree -r -p markupsafe

你将会看到哪些最低版本的包是 Jinja2 期望的:

# for pinned (obsolete) Jinja2: `MarkupSafe` has been automatically
# downgraded  by `pip` to `2.0.1` - hence the other answers 
# to this question:
MarkupSafe==2.0.1
  - Jinja2==2.11.3 [requires: MarkupSafe>=0.23]

#...versus unpinned:

# for unpinned (latest) Jinja2: using latest version of `MarkupSafe` 
# (in the same simple container as above)
MarkupSafe==2.1.1
  - Jinja2==3.1.2 [requires: MarkupSafe>=2.0]


5
简而言之:升级 jinja2。 ;) - Skippy le Grand Gourou

11

编辑:


问题在2023年末再次出现,但这次升级Jinja2没有起到作用。
我从路径"c:\users\name\anaconda3\lib\site-packages\"中删除了'MarkupSafe-2.0.1.dist-info'文件。

enter image description here

然后在Anaconda Prompt中使用以下命令重新安装MarkupSafe。
conda install markupsafe

我还对所有内容进行了彻底的更新,因为他们上次的更新已经超过1.5年了。
conda update anaconda-navigator

conda install conda=23.10.0

conda update anaconda

conda update python

现在Jupyter Notebook可以正常工作了。

这个已经不起作用了

如果在2023年打开Jupyter Notebook时遇到这个问题,只需升级Jinja2即可。

pip install --upgrade Jinja2

降级MarkeupSafe没有成功,因为其他包需要它的最新版本。

8

对我来说,仅此操作并没有解决问题。

pip install markupsafe==2.0.1

以下是所做的事情:
  1. 我卸载并重新安装了 zmq。
  2. 我安装了 markupsafe 2.0.1 版本。
  3. 打开 jupyter 笔记本。
pip uninstall zmq
pip install zmq
pip install markupsafe==2.0.1
jupyter notebook

7
我正在Linux上使用Python 3.7.6。在我的情况下,我只需要升级Flask版本,一切都正常运行:
pip install -U flask

3
我重新安装了一些必要组件后,我在处理自己的项目时发现问题。不仅可以降级软件包,如果您愿意的话,还可以修复应用程序。
此处所示,解决方案似乎很简单,只需将soft_unicode重命名为soft_str即可。

3
看起来 2.0.1 目前无法正常工作,降级到 2.0.0 对我来说有效。
pip install markupsafe==2.0.0

2

这个在 MAC 上可以正常工作,并且会自动卸载2.1.1版本,再次安装2.0.1版本:

pip install markupsafe==2.0.1

2
过去的解决方案都对我无效。我不得不手动从我的环境中删除这个库。
rm -rf /usr/.local/lib/python3.10/site-packages/markupsafe

为什么你有 /usr/.local/ 这个文件夹?很可能是 /home/youruser/.local/ - Valerio Bozz

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