※この記事は、個人技術ブログ CodeArchPedia.com の技術メモ(要約)です。
データ分析や機械学習のプロジェクトを進めていると、突然 ImportError に出くわすことがあります。特に scipy を使っていると、バージョンアップの波に乗った結果、依存関係が崩れてしまい、特定の関数が見つからなくなるのはよくある話です。
今回は、scipy.linalg から triu がインポートできなくなった件でハマったので、その時の調査と、二度と依存関係地獄に落ちないためのベストプラクティスをまとめます。
何が起きたか(課題)
プロジェクトのビルドや実行時に、以下のような ImportError が発生しました。
ImportError: cannot import name 'triu' from 'scipy.linalg'-
gensimなどの上流ライブラリが、想定外のバージョンのscipyを参照しようとしている。 - 環境が異なる開発者やCI/CD環境でビルドが失敗する。
このエラーの核心は、計算ライブラリである scipy のバージョン移行に伴う関数名の移動や、依存ライブラリ側の仕様変更にあります。
どう解決したか(概要)
解決のアプローチは論理的なステップを踏むことです。まず、環境の健全性を確認し、次に主要パッケージを最新化します。
Step 1: 仮想環境の再確認
システム環境ではなく、必ず venv や conda で作成した隔離された仮想環境内で作業していることを再確認しました。問題の切り分けのため、クリーンな環境でテストするのが鉄則です。
Step 2: 主要パッケージの強制アップグレード
最も単純で効果的なのは、問題を引き起こしているパッケージとその依存関係を最新版に更新することです。
pip install --upgrade scipy gensim
これにより、scipy の新しい関数配置に gensim が対応できるようになります。
Step 3: 依存関係の厳密な管理への移行
根本的な解決策として、requirements.txt への依存だけでなく、より強固な管理ツールへの移行を決定しました。このエラーの再発を防ぐため、プロジェクト全体で依存関係をロックする仕組みを導入しました。
この後、Poetry や Pipenv の導入により、環境の差異をなくす作業を行いました。
効果(Before/After)
手動でのバージョン調整や、特定のバージョンへのダウングレードを試みる試行錯誤がなくなりました。
-
Before: 環境構築時に毎回
scipyやnumpyの依存関係でビルドが失敗するリスクがあった。 -
After: 依存関係の不整合による
ImportErrorの発生頻度がほぼゼロになり、開発サイクルが安定した。
特に scipy のようなネイティブコードに依存するライブラリでは、環境のクリーンさが重要だと再認識しました。
🚀 詳細な設定とコードはこちら
具体的なWAFのルール設定や、より詳細なログ解析データは元のブログで公開しています。