(タイトルは不要。いきなり書き出しから始める)
Pythonの科学計算スタックを使っていると、時に予期せぬインポートエラーに遭遇する。特にscipyやgensimのようなライブラリ間で、突然「ImportError: cannot import name 'triu' from 'scipy.linalg'」が出てプロジェクトが止まってしまった。コード自体は触っていないのに、だ。
シニアエンジニアとして、このようなエラーに直面した時、まず疑うべきはコードではなく実行環境の整合性だ。これは環境管理のベストプラクティスを適用すれば確実に解決できるケースだった。
何が起きたか(課題)
発生したImportErrorは、scipyライブラリが提供するはずのtriu関数が見つからないというものだった。この症状から、以下の原因が強く疑われた。
-
scipyのバージョンが古すぎる、または新しすぎるために、依存ライブラリ(例:gensim)との間で関数の配置場所が変わっていた。 - インストール過程でC/Fortranコンポーネントのビルドが失敗し、ライブラリの一部が欠落した状態になっていた。
- 同じPython環境内で、異なるプロジェクトが要求するライブラリバージョンが競合し、環境が破損していた(Dependency Hell)。
どう解決したか(概要)
最速かつ最も確実な解決策は、プロジェクトごとに独立した仮想環境を再構築し、ライブラリをクリーンインストールすることであると判断した。環境の破損や競合を一度リセットするアプローチだ。
まず、Python標準機能であるvenvを使用して新しい環境を作成し、それを有効化した。
# 1. 仮想環境の作成
python -m venv my_project_env
# 2. 仮想環境の有効化 (Linux/macOSの場合)
source my_project_env/bin/activate
次に、このクリーンな環境内で、関連する主要ライブラリ(scipy, gensim, numpy)を最新版で再インストールした。もしこれで解決しない場合は、conda環境での再インストールも検討する。condaはバイナリ依存関係の解決に優れているためだ。
# 必要なライブラリのクリーンインストール
pip install --upgrade scipy gensim numpy
また、根本原因として考えられるバージョンの不一致に対処するため、その後、使用しているライブラリのバージョンを確認し、requirements.txtでバージョンを明示的に固定する手順を踏んだ。これは将来的な環境再現性の確保に不可欠だ。
効果(Before/After)
仮想環境の再構築とライブラリのクリーンインストールを実施した結果、インポートエラーは完全に解消された。以前は環境を汚染しないように恐る恐る作業していたが、この手順を踏むことで、再現性の高い環境を即座に確保できるようになった。
| 項目 | Before (破損環境) | After (クリーン環境) |
|---|---|---|
triuインポート |
失敗 (ImportError) | 成功 |
| 環境の安定性 | 低い(他プロジェクトに影響の懸念) | 高い(完全に分離) |
これにより、コードのロジック検証に集中できるようになった。環境設定の確認にかかる時間を大幅に短縮できたのは大きな収穫だ。
🚀 詳細な設定とコードはこちら
具体的なWAFのルール設定や、より詳細なログ解析データは元のブログで公開しています。