😠
RasPi開発でのsense-hat・paho-mqtt依存関係エラー
概要
IoT CoreからのMQTTメッセージをRaspberry Piに表示するシステム開発において、仮想環境でのsense-hatとpaho-mqttインストール時に発生したエラーと、その解決方法について解説します。
発生したエラー
エラー1: numpyインポートエラー
RuntimeError: You should not try to import numpy from within the numpy installation directory
エラー2: RTIMUモジュール不足エラー
ModuleNotFoundError: No module named 'RTIMU'
解決方法
以下の手順で問題を解決できます:
1. システムパッケージのインストール
sudo apt update
sudo apt install -y python3-sense-hat python3-numpy python3-rtimulib
2. システムパッケージ込み仮想環境の作成
python3 -m venv test --system-site-packages
source test/bin/activate
3. アプリケーション依存パッケージのインストール
pip install paho-mqtt
4. プログラムの実行
python mqttAllRequest.py
エラーの原因
1. RuntimeError: You should not try to import numpy from within the numpy installation directory
このエラーの根本原因は、仮想環境でのnumpyの不完全なインストールにあります。
詳細な発生メカニズム
- 仮想環境で
pip install sense-hat
を実行した際、依存関係としてnumpy
が自動的にインストールされる - Raspberry PiのARM64アーキテクチャでは、numpyをソースからビルドする必要がある
- ビルドプロセス中に一部のC拡張モジュール(
_multiarray.so
、umath.so
等)のコンパイルが失敗 - 結果として、
numpy
パッケージは存在するが、重要な機能が欠如した「不完全な状態」となる
エラーが発生するタイミング
from sense_hat import SenseHat # この行でエラー発生
# ↓ sense_hat内部でnumpyをimport
# ↓ 不完全なnumpyが読み込まれる
# ↓ numpy内部の整合性チェックで異常検出
# ↓ RuntimeError発生
不完全なnumpyの状態
numpy/
├── __init__.py ✅ 正常
├── core/
│ ├── __init__.py ✅ 正常
│ ├── _multiarray.so ❌ コンパイル失敗
│ └── umath.so ❌ コンパイル失敗
├── linalg/
│ └── lapack_lite.so ❌ コンパイル失敗
└── random/
└── mtrand.so ❌ コンパイル失敗
2. ModuleNotFoundError: No module named 'RTIMU'
このエラーは、RTIMUライブラリのビルド失敗が原因です。
技術的背景
-
sense_hat
は内部でRTIMU(Real Time Inertial Measurement Unit)ライブラリに依存 - RTIMUはC++で書かれたハードウェア制御ライブラリで、Pythonバインディングが必要
- 仮想環境での
pip install
時に、RTIMUのソースコードを取得してビルドを試行 - しかし、必要な開発ツール(cmake、build-essential)やヘッダーファイルが不足
- 結果として、RTIMUライブラリのビルドが失敗し、モジュールが存在しない状態となる
具体的なビルドエラー例
cc1plus: fatal error: ../../RTIMULib/IMUDrivers/RTHumidity.cpp: そのようなファイルやディレクトリはありません
compilation terminated.
error: command '/usr/bin/arm-linux-gnueabihf-gcc' failed with exit code 1
なぜこの方法で解決することができたのか
1. システムパッケージの活用による安定性確保
sudo apt install -y python3-sense-hat python3-numpy python3-rtimulib
解決ポイント
- 事前ビルド済みパッケージ: Raspberry Pi OS公式リポジトリのパッケージは、ARM64アーキテクチャ向けに最適化され、完全にテスト済み
- 一貫した依存関係: 同じビルド環境で作成されたパッケージ群のため、相互の互換性が保証される
- ハードウェア最適化: Raspberry Pi固有のハードウェア(I2C、SPI、GPIO)との連携が適切に設定済み
システムパッケージの構成例
/usr/lib/python3/dist-packages/numpy/
├── __init__.py
├── core/
│ ├── _multiarray.cpython-311-aarch64-linux-gnu.so ✅ ARM64向けビルド済み
│ └── umath.cpython-311-aarch64-linux-gnu.so ✅ 最適化済み
├── linalg/
│ └── lapack_lite.cpython-311-aarch64-linux-gnu.so ✅ BLAS/LAPACK連携
└── random/
└── mtrand.cpython-311-aarch64-linux-gnu.so ✅ 完全動作
2. --system-site-packagesによるハイブリッド環境
python3 -m venv test --system-site-packages
技術的効果
- パッケージ参照の優先順位: 仮想環境のパッケージを優先し、存在しない場合はシステムパッケージを参照
- 依存関係の整合性維持: ハードウェア依存パッケージはシステム、アプリケーション依存パッケージは仮想環境で分離管理
- 開発環境の柔軟性: プロジェクト固有のパッケージ(paho-mqtt等)は仮想環境で独立管理可能
Pythonパスの構成例
import sys
print(sys.path)
# [
# '/home/admin/internship2025/test/lib/python3.11/site-packages', # 仮想環境
# '/usr/lib/python3/dist-packages', # システムパッケージ
# '/usr/lib/python311.zip',
# '/usr/lib/python3.11',
# ]
3. 依存関係の完全性確保
解決前の状態
仮想環境:
├── sense_hat (不完全)
├── numpy (部分的にビルド失敗)
└── RTIMU (存在しない)
解決後の状態
システムパッケージ:
├── python3-sense-hat ✅ 完全動作
├── python3-numpy ✅ 最適化済み
└── python3-rtimulib ✅ ハードウェア連携
仮想環境:
└── paho-mqtt ✅ プロジェクト固有
4. 技術的検証
この解決方法の有効性を確認:
# 解決後の動作確認
import numpy as np
print(f"numpy version: {np.__version__}") # 正常に表示
print(f"numpy location: {np.__file__}") # /usr/lib/python3/dist-packages/numpy
from sense_hat import SenseHat
sense = SenseHat() # エラーなしで初期化成功
import RTIMU
print("RTIMU module loaded successfully") # 正常にロード
教訓とベストプラクティス
IoTデバイス開発における依存関係管理
1. ハードウェア依存パッケージ
システムパッケージを使用
- sense-hat
- GPIO制御ライブラリ
- カメラモジュール制御
- I2C/SPI通信ライブラリ
2. アプリケーション依存パッケージ
仮想環境で管理
- MQTT通信ライブラリ(paho-mqtt)
- HTTP通信ライブラリ(requests)
- データ処理ライブラリ(pandas)
- Web框架(Flask、FastAPI)
3. ハイブリッド環境の活用
--system-site-packages
オプションで両方の利点を享受
トラブルシューティングの指針
エラーの種類 | 対処方法 |
---|---|
ハードウェア関連のエラー | システムパッケージを確認 |
コンパイルエラー | 事前ビルド済みパッケージの利用を検討 |
依存関係の競合 | パッケージの管理戦略を見直し |
検証コマンド
環境が正しく構築されたかを確認:
# システムパッケージの確認
dpkg -l | grep sense-hat
dpkg -l | grep rtimu
# Pythonでの動作確認
source test/bin/activate
python3 -c "
from sense_hat import SenseHat
import RTIMU
import numpy as np
print('✅ 全ての依存関係が正常に動作')
"
まとめ
この解決方法により、Raspberry Piでの安定したIoTアプリケーション開発環境を構築することができました。重要なポイントは、ハードウェア依存のパッケージとアプリケーション依存のパッケージを適切に分離管理することです。
Discussion