【ポートフォリオ 05 検証】Python CLI メッセージアプリをラズパイ内で実行してみた
はじめに
以下、UNIXドメインソケットを使って作成した CLI メッセージアプリがサーバ上(Ubuntu Serverをインストールした Raspberry Pi4)で動作するかを検証したプロセスをまとめていきます。
前提
- Ubuntu Server をインストールした Raspberry Pi 4(以下、「ラズパイ」と表記)をセット
- 使用PCは MacBook Pro(M2)
- ラズパイは MacBook・GitHubとSSH連携済み(
git pull
でプログラムを取得) - ラズパイ・使用中の MacBook は同じローカルネットワークに所属
- サーバはバックグラウンドで起動
ディレクトリ構成
backend-portfolio
└──local_chat_messenger/
├── src/
│ ├── server.py
│ └── client.py
├── tmp/
├── venv/ # 仮想環境構築後
├── config.json
├── README.md
└── requirements.txt
git pull
後の動作検証(途中のエラー解決手順込み)
実際の 1. 仮想環境の構築
python3 -m venv venv
通常のコマンド操作よりも少し実行後に時間がかかりました。
2. ディレクトリの確認
venv/ が作成されたことを確認
3. 仮想環境の有効化
source venv/bin/activate
4. 仮想環境内で依存関係をインストール
pip install -r requirements.txt
これでプログラムで使用するパッケージをインストールします。
5. サーバをバックグラウンドで起動
ここでエラー発生
python3 src/server.py &
フォアグラウンドで実行しても結果は同じ
6. ファイルの確認
ファイルまたはディレクトリがみつからないということなので、ファイルがあるかを確認
しかし、実際にファイルは存在していることを確認
もう一度エラーメッセージをチェック
ここで、server_address
がバインドできていないのでは?と仮説を持つ
7. ファイルパスの確認
ファイルパスは存在している。
ということは、ファイルパス自体が間違っている可能性がある。
8. vim でファイルパスを編集
9. プロジェクトディレクトリで再度サーバをバックグラウンドで起動
うまくいった
→ ファイルパスに問題があったと判明
10. クライアントを起動
11. メッセージを入力・送信
「Hello World」と入力
- クライアント側の送信
- サーバ側の受信
- サーバ側の送信
- クライアント側の受信
- サーバ待機
- クライアント終了
正しく動作することが確認できました。
エラーの原因: 実行するディレクトリによる違い
tmp/udp-server-socket-file という相対パスは、プログラムを実行したカレントディレクトリを基準とします。
この場合、tmp/ ディレクトリは 04_local_chat_messenger/ の中を探します。
しかし、server.py の中で相対パスを使用した場合、Pythonは server.py があるディレクトリ、つまり src/ を基準にしようとします。
そのため、src/tmp/udp-server-socket-fileというパスを探しに行ってしまい、ファイルが見つからずにエラーとなってしまっていたということです。
まとめ
この記事では、作成した CLI メッセージアプリが動作するか、検証したプロセスを一つの記事としてまとめさせていただきました。
カレントディレクトリをどことして判断するかによって、実行結果が変わってしまうことには気をつけていきたいと思います。
また、絶対パス・相対パスによる違いについて自分の弱点であることに気づけたことが今回の収穫でした。
最後までお読みいただき、ありがとうございました。
Discussion