みなさん、こんにちは。
Raspberry Piを使った開発は楽しいものですが、時にはインターネット接続がない環境で作業しなければならないこともあります。
インターネット接続がない環境では、ライブラリのインストールが大きな壁となりがちです。最近、まさにそうした状況で、PythonのAWS SDKであるboto3をRaspberry Piにインストールしなければならない状況に遭遇しました。
せっかくですから、オフライン環境のRaspberry Pi Bullseyeに、boto3を特定ユーザーでインストールする手順を解説したいと思います。boto3だけでなく、他のPythonライブラリをオフラインでインストールする際にも応用できる内容ですので、ぜひ最後までご覧ください。
Pythonライブラリboto3の準備
通常、Pythonのライブラリはpip install <ライブラリ名>コマンドひとつで簡単にインストールできます。しかし、インターネット接続がない環境では、このコマンドは機能しません。
pipはPyPI(Python Package Index)というオンラインのライブラリリポジトリからパッケージをダウンロードしてくるためです。
オフラインでインストールするには、あらかじめインターネットに接続できるPCで必要なパッケージファイルをダウンロードし、それをRaspberry Piに持ち込む必要があります。
また、今回は特定ユーザー権限でインストールしなければならないという制限もありました。特定のユーザーのみが利用できるようにすることで、セキュリティを向上させたり、環境の汚染を防いだりするためです。
前提条件
今回の手順を実行するにあたり、以下の環境が整っていることを前提とします。
- Raspberry Pi OS Bullseye (64-bit)
- Python3.9以上 と pip がインストール済みであること。
- 通常、Bullseyeには標準でPython3.9がインストールされています。
- インターネットに接続可能な別のPC
boto3はAWSのサービスを利用するためのライブラリであり、依存する複数のパッケージ(botocore, jmespathなど)が存在します。これらの依存関係を適切に解決しながら、順番にインストールしていくのが成功の鍵です。
事前準備 – インターネットがあるPCでパッケージをダウンロードする
まず、インターネットに接続できる別のPCで、これからRaspberry Piにインストールするすべてのパッケージファイルをダウンロードします。
1. Python環境の準備
もし、まだPython環境がない場合は、PCにPythonをインストールしてください。
2. 必要なパッケージのダウンロード
次に、pipコマンドを使って必要なパッケージの.whl(Wheel)ファイルをダウンロードします。.whlファイルは、ビルド済みのパッケージをまとめた形式で、オフライン環境でも簡単にインストールできるのが特徴です。
以下のコマンドを実行すると、指定したパッケージと、その依存関係にあるパッケージがすべてカレントディレクトリにダウンロードされます。
pip download boto3
このコマンドはboto3とそのすべての依存パッケージをダウンロードしてくれますが、今回はより明確な手順にするため、主要な依存パッケージを個別に指定してダウンロードします。
pip download boto3 botocore jmespath python-dateutil s3transfer six urllib3
なぜ個別に指定するのか?
boto3には多くの依存パッケージがあり、そのバージョンも頻繁に更新されます。個別に指定することで、どのパッケージがboto3の動作に不可欠なのかを把握しやすくなります。
pip downloadコマンドは、インストールは行わず、必要な.whlファイルをダウンロードするだけです。ダウンロードしたファイルは、boto3-1.xx.x-py3-none-any.whlのように、バージョン情報を含んだファイル名になっています。
ファイルの確認と転送
ダウンロードが完了したら、.whlファイルがすべて揃っていることを確認しましょう。
ls *.whl
上記のコマンドを実行すると、以下のようなファイルリストが表示されるはずです。
boto3-1.xx.x-py3-none-any.whlbotocore-1.xx.x-py3-none-any.whljmespath-1.xx.x-py3-none-any.whlpython_dateutil-2.x.x-py2.py3-none-any.whls3transfer-0.x.x-py3-none-any.whlsix-1.xx.x-py2.py3-none-any.whlurllib3-1.xx.x-py2.py3-none-any.whl
pipやsetuptoolsは、Raspberry Pi OSに標準でインストールされているため、特別な理由がない限りダウンロードする必要はありません。もしバージョンアップが必要な場合は、pip download setuptools pipでダウンロードしておきましょう。
これらの.whlファイルを、USBメモリやSCP(Secure Copy)などを使って、オフライン環境のRaspberry Piの任意のディレクトリにコピーします。
例えば、/tmp/whl_filesというディレクトリを作成してそこにファイルを置くのがおすすめです。
mkdir /tmp/whl_files
# PCからファイルをコピー
オフライン環境でのインストール
準備した.whlファイルをRaspberry Piにコピーしたら、いよいよオフライン環境でインストールを実行します。
今回は、システム全体ではなく、特定ユーザー(例:raspiuser)にインストールするため、root権限でスクリプトを実行し、suコマンドでユーザーを切り替える方法を採用します。
1. インストールスクリプトの作成
以下の内容をinstall_boto3.shというファイル名で保存します。
#!/bin/bash
# インストールする特定ユーザー名
INSTALL_USER="raspiuser"
# whlファイルが置いてあるディレクトリ
WHL_DIR="/tmp/whl_files"
# スクリプト実行にはroot権限が必要
if [ "$EUID" -ne 0 ]; then
echo "このスクリプトはroot権限で実行してください。"
exit 1
fi
# whlファイルのディレクトリに移動
cd "$WHL_DIR" || { echo "whlファイルのディレクトリに移動できません。パスを確認してください。"; exit 1; }
echo "boto3の依存パッケージを特定ユーザー $INSTALL_USER にインストールします..."
echo "---"
# 依存関係の順でインストール
su - "$INSTALL_USER" -c "pip3 install --no-deps six-*.whl"
echo "sixインストール完了"
su - "$INSTALL_USER" -c "pip3 install --no-deps python_dateutil-*.whl"
echo "python-dateutilインストール完了"
su - "$INSTALL_USER" -c "pip3 install --no-deps jmespath-*.whl"
echo "jmespathインストール完了"
su - "$INSTALL_USER" -c "pip3 install --no-deps urllib3-*.whl"
echo "urllib3インストール完了"
su - "$INSTALL_USER" -c "pip3 install --no-deps botocore-*.whl"
echo "botocoreインストール完了"
su - "$INSTALL_USER" -c "pip3 install --no-deps s3transfer-*.whl"
echo "s3transferインストール完了"
# pipやsetuptoolsをバージョンアップしたい場合のみ、以下のコメントを外す
# su - "$INSTALL_USER" -c "pip3 install --no-deps setuptools-*.whl"
# echo "setuptoolsインストール完了"
# su - "$INSTALL_USER" -c "pip3 install --no-deps pip-*.whl"
# echo "pipインストール完了"
echo "---"
echo "boto3本体をインストールします..."
# 最後にboto3本体をインストール
su - "$INSTALL_USER" -c "pip3 install --no-deps boto3-*.whl"
# 成功メッセージ
echo "---"
echo "boto3のインストールが特定ユーザー $INSTALL_USER で完了しました。"
スクリプトの解説
INSTALL_USER="raspiuser"- boto3をインストールしたいユーザー名を指定します。必要に応じて変更してください。
WHL_DIR="/tmp/whl_files".whlファイルを置いたディレクトリのパスを指定します。
su - "$INSTALL_USER" -c "..."- このコマンドが、root権限から指定したユーザーに切り替えてコマンドを実行する最も重要な部分です。
su -とすることで、$INSTALL_USERの環境変数が正しくロードされた状態でコマンドが実行されます。
- このコマンドが、root権限から指定したユーザーに切り替えてコマンドを実行する最も重要な部分です。
pip3 install --no-deps ...--no-depsオプションは、「依存関係のチェックを行わない」ことを意味します。事前にダウンロードした依存パッケージを、このスクリプト内で順番にインストールしていくため、このオプションを付けて依存チェックをスキップします。
なぜこの順番でインストールするのか?
boto3は、複数のパッケージに依存しています。具体的には、boto3はbotocoreとs3transferに依存しており、さらにbotocoreはjmespath、python-dateutil、urllib3に、これらのパッケージもsixに依存しているという階層構造になっています。
オフラインでインストールする際は、--no-depsオプションを使用するため、pipが自動で依存関係を解決してくれません。そのため、依存関係の「末端」にあるパッケージから順番にインストールしていく必要があります。
このスクリプトでは、最も基本的な依存パッケージであるsixから始め、階層を一段ずつ上がっていくようにインストールしています。
six:Python 2と3の互換性ライブラリ。多くのパッケージがこれに依存しています。python-dateutil、jmespath、urllib3:botocoreが依存する主要なパッケージです。urllib3はHTTP通信を担います。botocore:AWSサービスとの通信を行う中心的なライブラリ。boto3はこれに大きく依存しています。s3transfer:S3のマルチパートアップロードなどを担当するライブラリ。これもboto3の必須コンポーネントです。boto3:すべての依存パッケージが揃った状態で、最後に本体をインストールします。
この順番を守ることで、各パッケージが正しく機能するために必要な環境が、インストール時に確実に整っている状態になります。
2. スクリプトの実行
作成したスクリプトに実行権限を付与し、root権限で実行します。
chmod +x install_boto3.sh
sudo ./install_boto3.sh
スクリプトが正常に完了すれば、boto3とその依存パッケージが指定したユーザーの環境にインストールされます。
動作確認
インストールが完了したら、念のため正しく動作するか確認しましょう。
raspiuserとして以下のコマンドを実行します。
su - raspiuser -c "python3 -c 'import boto3; print(boto3.__version__)'"
このコマンドは、raspiuserの環境でPythonを実行し、boto3をインポートしてバージョン情報を表示します。
1.xx.xのようにバージョン番号が表示されれば、インストールは成功です。
もしエラーが表示された場合は、インストール順序や、.whlファイルの不足がないかを確認してください。特に、依存パッケージのインストール順序は重要です。
まとめ
この手順を使うことで、インターネットに接続できないRaspberry Piの環境でも、Pythonのライブラリを安全かつ確実にインストールできます。
- 依存パッケージの把握
boto3のように依存関係の多いライブラリは、事前に必要なパッケージをすべて把握し、ダウンロードしておくことが重要です。
- インストール順序
- 依存関係の根元にあるパッケージから順番にインストールしていくことで、
pipの依存チェックなしでも正しく環境を構築できます。
- 依存関係の根元にあるパッケージから順番にインストールしていくことで、
- 特定ユーザーでのインストール
su - username -cコマンドを使うことで、root権限でスクリプトを実行しつつ、実際のインストールは特定ユーザーで行うという安全な運用が実現できます。
この方法はboto3に限らず、オフライン環境でPythonライブラリをインストールする際の一般的な手法として応用できます。ぜひ、みなさんのRaspberry Pi開発に役立ててください。
本日も最後までお読みいただきありがとうございました。
それでは、よいRaspberry Piライフを!



