Skip to content

ImportError: cannot import name 'soft_unicode'から'markupsafe'

このエラーは、Pythonプロジェクトで頻繁に発生する依存関係の問題で、特にJinja2テンプレートエンジンとMarkupSafeライブラリのバージョンの互換性に関連しています。

問題の原因

ImportError: cannot import name 'soft_unicode' from 'markupsafe' というエラーは、MarkupSafeライブラリのバージョン2.1.0以降でsoft_unicode関数が削除されたことに起因しています。

MarkupSafeの変更点

MarkupSafe 2.1.0で、soft_unicode関数はsoft_strに名称変更されました。古いバージョンのJinja2(3.0.0より前)はこの変更に対応していないため、インポートエラーが発生します。

bash
# エラーの発生源
from markupsafe import Markup, escape, soft_unicode  # soft_unicodeは存在しない

解決策

以下の解決策から、ご使用の環境に最も適した方法を選択してください。

方法1: MarkupSafeをダウングレード(緊急対応)

最も簡単な解決策は、MarkupSafeを互換性のあるバージョンにダウングレードすることです:

bash
pip install markupsafe==2.0.1
bash
pip install markupsafe==2.0.1
bash
conda install markupsafe=2.0.1

注意点

この方法は一時的な対応策です。長期的には、依存ライブラリのアップグレードを検討してください。

方法2: Jinja2をアップグレード(推奨)

根本的な解決策は、Jinja2を最新バージョンにアップグレードすることです:

bash
pip install --upgrade Jinja2

最新のJinja2(3.1.0以降)はsoft_strを使用するため、MarkupSafeの新しいバージョンと互換性があります。

方法3: Docker環境での対応

Dockerを使用している場合、docker-compose.ymlでPYTHON_DEPSを設定します:

yaml
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
  # その他の設定...

変更後、コンテナを再ビルドします:

bash
docker-compose down
docker-compose up -d --build

方法4: 仮想環境の再構築

仮想環境を使用している場合、環境を再構築することで問題が解決することがあります:

bash
# 仮想環境を削除
deactivate
rm -rf venv/

# 新しい仮想環境を作成
python -m venv venv
source venv/bin/activate  # Linux/Mac
# または
.\venv\Scripts\activate  # Windows

# 必要なパッケージを再インストール
pip install -r requirements.txt

方法5: 手動でのファイル削除と再インストール

場合によっては、既存のパッケージを完全に削除してから再インストールする必要があります:

bash
# MarkupSafeを完全に削除
pip uninstall markupsafe
# または強制削除(Linux/Mac)
rm -rf /path/to/python/site-packages/markupsafe
rm -rf /path/to/python/site-packages/MarkupSafe-*.dist-info

# 互換性のあるバージョンを再インストール
pip install markupsafe==2.0.1

根本的な原因と予防策

この問題は、依存関係のピン留め(pinning)が不適切な場合に発生します。以下のベストプラクティスを実践することで、将来同様の問題を防ぐことができます:

  1. 定期的な依存関係の更新:定期的にpip list --outdatedで古いパッケージを確認し、更新します。

  2. 互換性のあるバージョンの指定requirements.txtでは互換性のあるバージョン範囲を指定します:

    markupsafe>=2.0,<2.1
    Jinja2>=3.0
  3. 仮想環境の使用:プロジェクトごとに独立した仮想環境を使用し、グローバル環境の汚染を防ぎます。

  4. CI/CDパイプラインでのテスト:依存関係を更新したら、必ずテストを実行して互換性を確認します。

関連するエラーと解決策

soft_unicodeエラーに加えて、以下の関連エラーが発生する場合があります:

  • ImportError: cannot import name 'escape' from 'markupsafe'
  • AttributeError: module 'markupsafe' has no attribute 'soft_str'

これらの場合も、上記と同じ解決策が有効です。MarkupSafeとJinja2のバージョン互換性を確認してください。

トラブルシューティング

問題が解決しない場合は、以下のコマンドで依存関係ツリーを確認できます:

bash
pip install pipdeptree
pipdeptree -r -p markupsafe

結論

ImportError: cannot import name 'soft_unicode' from 'markupsafe'エラーは、バージョン互換性の問題によって発生します。一時的にはMarkupSafeのダウングレードで対応できますが、長期的にはJinja2のアップグレードなど、根本的な解決策の実施をお勧めします。

適切な依存関係管理と定期的な更新により、この種の問題を未然に防ぐことができます。