※この記事は、個人技術ブログ CodeArchPedia.com の技術メモ(要約)です。
データ分析の現場でPythonを使っていると、scipyやgensimといった計算ライブラリ周りで依存関係に起因するエラーによく遭遇します。特に今回は、特定の関数が見つからないという、一見するとシンプルだが解決に手間取った ImportError: cannot import name 'triu' from 'scipy.linalg' にハマった話です。
何が起きたか(課題)
このエラーが発生した際、プロジェクトのビルドや実行が完全に停止しました。主な症状とリスクは以下の通りです。
-
ImportError: cannot import name 'triu' from 'scipy.linalg'というメッセージが表示される。 - 原因は、
gensimが参照しているscipyのバージョンが、現在インストールされているバージョンと一致していないことにあると推測された。 -
scipyのバージョンアップに伴い、triu関数がscipy.linalgから移動(あるいは削除)されたことが背景にある。 - 環境を更新しても一時的にしか直らず、再現性が高い。
どう解決したか(概要)
根本的な解決のためには、単にパッケージを再インストールするのではなく、環境管理の鉄則に立ち返る必要がありました。アプローチとしては以下の流れを辿りました。
-
仮想環境の確認と再構築: まずシステム環境への影響を避けるため、最新の仮想環境(
venv)をクリーンに作成し直した。 -
主要ライブラリの同期更新: エラーの原因となっている
scipyと、依存元であるgensimの両方を最新版にアップグレードした。pip install --upgrade scipy gensim -
依存管理の厳格化: 将来的な環境のブレを防ぐため、PoetryまたはPipenvを導入し、
scipyとgensimの互換性のあるバージョンを明示的にロックファイルに記録するようにした。
'triu' インポートエラーの具体的な原因
このエラーは、主にScipyの関数移動か、または依存ライブラリ(特にgensim)が古いバージョンのscipyを暗黙的に期待しているために発生します。Scipy 1.10以降の変更で顕著になりました。ネイティブコンパイルに依存するライブラリ特有の難しさです。
エラーを確実に解決するためのステップバイステップ手順
以下の手順で論理的に進めることで、再現性の高い解決が得られました。
Step 1: 仮想環境の再構築
古い環境の影響を完全に排除するために、新しい仮想環境を作成し有効化する。
Step 2: ScipyとGensimの最新バージョンへの更新
両者を同時に最新化することで、互換性の問題が解消されるケースが最も多い。
Step 3: 互換性のあるバージョンの特定と固定
もし最新版で問題が解決しない、または特定のプロジェクト要件で古いバージョンが必要な場合は、requirements.txt などで scipy==X.Y.Z と gensim==A.B.C を明示的に指定して固定する。
効果(Before/After)
この対応により、依存関係の不整合による ImportError は完全に解消しました。特にPoetryやPipenvの導入は、他のライブラリ間の依存競合を防ぐ大きな効果があり、開発の安定性が向上しました。
- Before: 不定期なインポートエラーとデプロイ時の環境差異に悩まされていた。
- After: 依存関係がロックされ、どの環境でも一貫したビルドが保証されるようになった。
🚀 詳細な設定とコードはこちら
具体的な依存関係の固定方法や、Poetry/Pipenvの初期設定コマンドの詳細、numpy.triu への切り替え方法など、より詳細な実装手順は元のブログで公開しています。