Armadilloフォーラム

pythonアプリケーションの実行時のライブラリ参照について

nakayama244

2023年4月10日 19時51分

お世話になっております。
Armadillo-IoT A6Eで開発を行っています。

ATDE vscodeでpythonのアプリケーションを作成して
「Generate decelopment swu」を行い
「App run on Armadillo」を実行したところ
ModuleNotFoundError:
no module named 'requests' というエラーが発生しました。

ATDE vscodeで編集している時に参照エラーなど
出ておらず、pip listコマンドでrequestsライブラリなどありましたが
armadillo上で動かす場合には何か設定が必要なのでしょうか。

マニュアルの10.2.4.1. サンプルアプリケーションの動作家確認と同様の手順で進めています。

コメント

at_dominique.m…

2023年4月11日 7時46分

nakayama244さん、

お世話になっています、
アットマークテクノのマルティネです。

> 「App run on Armadillo」を実行したところ
> ModuleNotFoundError:
> no module named 'requests' というエラーが発生しました。
>
> ATDE vscodeで編集している時に参照エラーなど
> 出ておらず、pip listコマンドでrequestsライブラリなどありましたが
> armadillo上で動かす場合には何か設定が必要なのでしょうか。

そうですね、仰るとおりに armadillo上のコンテナに python の依存はインストールされてないだけだと思います。
「Generate development swu」で使われているコンテナは vscode プロジェクトの container_armv7/dev/Dockerfile から python3 しかインストールされていませんので、この手順で追加できます:

- container_armv7/dev/Dockerfile に python3-requests などの必要なパッケージを追加してください。 pip をインストールして、 && pip install の形でもいいですが、debian にパッケージされているものでしたらパッケージを使った方がいいと思います。
- ファイルの変更でコンテナをリビルドする仕組みがまだできてませんので、「podman image rm python_app_dev_image」で前にビルドしたイメージを削除してください。
- 「Generate development swu」の task をもう一度実効して、作成された swu でコンテナのイメージを Armadillo で更新してください。

※ 「Generate release swu」の場合は 「container_armv7/release」ディレクトリが使われていますので、そのコンフィグも編集するか、 共通の base で試してみてください。 base の変更の場合は python_app_{base,release,dev}_image すべてを削除しないとうまく反映されないのでご注意ください。

これでアプリケーションが動くようになると思いますが、いかがでしょうか。
まだ不明な点がございましたらまた聞いてください。

よろしくお願いします。

アットマークテクノのマルティネ様
回答ありがとうございます。

> 「Generate development swu」で使われているコンテナは vscode プロジェクトの container_armv7/dev/Dockerfile から python3 しかインストールされていませんので、この手順で追加できます:
>
> - container_armv7/dev/Dockerfile に python3-requests などの必要なパッケージを追加してください。 pip をインストールして、 && pip install の形でもいいですが、debian にパッケージされているものでしたらパッケージを使った方がいいと思います。
> - ファイルの変更でコンテナをリビルドする仕組みがまだできてませんので、「podman image rm python_app_dev_image」で前にビルドしたイメージを削除してください。
> - 「Generate development swu」の task をもう一度実効して、作成された swu でコンテナのイメージを Armadillo で更新してください。
>
> ※ 「Generate release swu」の場合は 「container_armv7/release」ディレクトリが使われていますので、そのコンフィグも編集するか、 共通の base で試してみてください。 base の変更の場合は python_app_{base,release,dev}_image すべてを削除しないとうまく反映されないのでご注意ください。

以上の手順の内、Dockerfileにpip install requests を追加しましたが導入前と同じエラーになりました。
「Generate development swu」の実行後にイメージ自体はできている事と
ライブラリのインストールのログなども出力されていました。

- debian にパッケージされているものでしたらパッケージを使った方がいいと思います。
この部分について別の方法があると見受けられるのですが
詳しい手順をご教授いただけないでしょうか。

設定が間違っている可能性もあるのでDockerfileも添付いたします。

よろしくお願いいたします。

ファイル ファイルの説明
Dockerfile.txt 使用しているDockerfileになります。

at_dominique.m…

2023年4月13日 14時12分

nakayama244さん、

マルティネです。

逆の順番で答えます。

> - debian にパッケージされているものでしたらパッケージを使った方がいいと思います。
> この部分について別の方法があると見受けられるのですが
> 詳しい手順をご教授いただけないでしょうか。

この部分で「pip よりパッケージを使った方が debianっぽい」を意味していました。具体的に、編集した内容はこれから:

    && apt-get install -y pip \
    && pip install requests \

を以下の内容に編集することです:

  && apt install -y python3-requests \

それで、debian のパッケージで同じく requests を使えるようになります。理由としては色々考えがありますが、pip をインストールすると依存でインストールされているパッケージが多い(gcc、fontconfigなど)ので作成されるイメージが必要以上に大きいですね。
動作としてはどれも使えるはずなので、今回の問題と違います。

> 以上の手順の内、Dockerfileにpip install requests を追加しましたが導入前と同じエラーになりました。
> 「Generate development swu」の実行後にイメージ自体はできている事と
> ライブラリのインストールのログなども出力されていました。

添付していただいた Dockerfile でも無事に動かせることができましたので、コンテナが Armadillo で上手く更新されてないと思われます。
確認のため、以下のコマンドの出力を提供していただけますか?

# ATDE上で、vscode のプロジェクトディレクトリから
# ファイルの名前が違っていたらすみません、「find . -name "*.swu" -exec mkswu --show {} +」でお願いします
[ATDE ~/vscode/python_project]$ mkswu --show container_armv7/dev/python_app_dev_image.swu
[ATDE ~/vscode/python_project]$ podman image list localhost/python_app_dev_image
 
# Armadillo上で、インストールされているバージョンの確認します
armadillo:~# cat /etc/sw-versions 
armadillo:~# podman image list localhost/python_app_dev_image

その出力で:
* mkswu --show で表示されている --version python_app_dev_image X と /etc/sw-versions の pyhton_app_dev_image X が一致するはずです
* podman image list で表示されているIMAGE ID も一致するはずです。

mkswu のバージョンが一致しない場合は新しい development swu をインストールしてくだされば解決されると思います。
mkswu のバージョンが一致して、podman の image ID が異なる場合はもう少し確認します。image ID も一致したらコンテナの内容も確認したいので、その時に追加コマンドをいくつかお願いします。

よろしくお願いします。

マルティネ様

> 確認のため、以下のコマンドの出力を提供していただけますか?
>

> # ATDE上で、vscode のプロジェクトディレクトリから
> # ファイルの名前が違っていたらすみません、「find . -name "*.swu" -exec mkswu --show {} +」でお願いします
> [ATDE ~/vscode/python_project]$ mkswu --show container_armv7/dev/python_app_dev_image.swu
> [ATDE ~/vscode/python_project]$ podman image list localhost/python_app_dev_image
> 
> # Armadillo上で、インストールされているバージョンの確認します
> armadillo:~# cat /etc/sw-versions 
> armadillo:~# podman image list localhost/python_app_dev_image
> 

>
> その出力で:
> * mkswu --show で表示されている --version python_app_dev_image X と /etc/sw-versions の pyhton_app_dev_image X が一致するはずです
> * podman image list で表示されているIMAGE ID も一致するはずです。
>
> mkswu のバージョンが一致しない場合は新しい development swu をインストールしてくだされば解決されると思います。
> mkswu のバージョンが一致して、podman の image ID が異なる場合はもう少し確認します。image ID も一致したらコンテナの内容も確認したいので、その時に追加コマンドをいくつかお願いします。

上記のコマンド実行結果はテキストファイルにて添付しました。
armadillo側で実行したpodmanの結果にイメージが表示されない場合の対処法をご教授ください。

以上、よろしくお願いいたします。

ファイル ファイルの説明
command実行結果.txt mkswu --show やpodman image listの実行結果

at_dominique.m…

2023年4月26日 13時55分

nakayama244さん、

マルティネです。

> 上記のコマンド実行結果はテキストファイルにて添付しました。
> armadillo側で実行したpodmanの結果にイメージが表示されない場合の対処法をご教授ください。

すみません、本スレッドの最初のメッセージではコンテナが動いていると勘違いしていましたが、このコマンドの出力ではコンテナが起動されているどころか存在しないで、sw-versions では swu を一度もインストールされてないように見えますので、いくつか追加の確認をさせていただきます:

* Armadillo上の「podman ps」で a6e-gw-container だけがリストされると思いますが、それであっていますか?

* config/ssh_config のデフォルト状態では Hostname 0.0.0.0, Port 2222 で接続しているはずですが、Hostname だけを Armadillo IoT A6E の IP アドレスに修正して Port を変更してないですね?
ATDE のプロジェクトディレクトリから「ssh -F config/ssh_config Armadillo uname -a」を実行した時の出力を提供していただけますか?今の最後の返事の状態では接続できないエラーになるはずですが、「no module named 'requests'」のエラーは似たようなコマンドで実行されてますので何かに接続できていますね…ちょっと気になります。

上記の質問と関係なく、本来の流れに戻ってみたいと思います。

A6E の製品マニュアル[1]を参考にすると、 my_project/container_armv7/dev ディレクトリ下に python_app_dev_image.swu が作成されたはずで、その swu を Armadillo でインストールするとコンテナが展開されます。
インストール方法がいくつかありますが、USB メモリに python_app_dev_image.swu と、初期設定がまだ行われてない場合に /home/atmark/mkswu/initial_setup.swu をコピーして、armadillo に接続すればインストールされるはずです。
(initial_setup がまだインストールされてなければ二回再起動しますので、数分かかります。量産的な書き込みの場合は mkswu コマンドで initial setup とコンテナを一つの swu にまとめて効率よくできますが、少しややっこしいので今ある swu ファイルで進みたいと思います。)

[1] https://manual.atmark-techno.com/armadillo-iot-a6e/armadillo-iotg-a6e_p…

SWU がインストールされたら Armadillo にコンテナが書き込まれたはずで、デフォルト状態で起動しているはずです:
podman image list で表示されて、podman ps でも表示されて、上記の ssh コマンドでコンテナの中に入るはずです。

そのコンテナに requests が正しくインストールされていた場合に最初のエラーが発生しなくなるはずと思いますが、いかがでしょうか。

よろしくお願いします。

> * Armadillo上の「podman ps」で a6e-gw-container だけがリストされると思いますが、それであっていますか?
>
はい、a6e-gw-containerのみです。

> * config/ssh_config のデフォルト状態では Hostname 0.0.0.0, Port 2222 で接続しているはずですが、Hostname だけを Armadillo IoT A6E の IP アドレスに修正して Port を変更してないですね?

port22 に変更していました。指摘を受け、port 2222に戻しました。

> ATDE のプロジェクトディレクトリから「ssh -F config/ssh_config Armadillo uname -a」を実行した時の出力を提供していただけますか?今の最後の返事の状態では接続できないエラーになるはずですが、「no module named 'requests'」のエラーは似たようなコマンドで実行されてますので何かに接続できていますね…ちょっと気になります。

port 2222に戻した後の結果をテキストファイルにして添付しました。

> A6E の製品マニュアル[1]を参考にすると、 my_project/container_armv7/dev ディレクトリ下に python_app_dev_image.swu が作成されたはずで、その swu を Armadillo でインストールするとコンテナが展開されます。
> インストール方法がいくつかありますが、USB メモリに python_app_dev_image.swu と、初期設定がまだ行われてない場合に /home/atmark/mkswu/initial_setup.swu をコピーして、armadillo に接続すればインストールされるはずです。

initial setupのイメージをインストールしたところエラーとなりました。
テキストファイルにして添付しています。

以上、ご確認お願い致します。

ファイル ファイルの説明
command実行結果2.txt

at_dominique.m…

2023年4月27日 17時00分

nakayama244さん、

> > ATDE のプロジェクトディレクトリから「ssh -F config/ssh_config Armadillo uname -a」を実行した時の出力を提供していただけますか?今の最後の返事の状態では接続できないエラーになるはずですが、「no module named 'requests'」のエラーは似たようなコマンドで実行されてますので何かに接続できていますね…ちょっと気になります。
>
> port 2222に戻した後の結果をテキストファイルにして添付しました。

なるほど、コンテナではなく armadillo (ホスト Armadillo Base OS の方)に ssh サーバーを追加していて、そちらに接続していましたね。
そこはマニュアルの説明が足りてなかったと思いますが、ABOS の sshd を port 2222 に実行してほしいのではなく、開発コンテナに sshd サーバーを入れていて port 2222 で listen させていますので、app run on armadillo の際は直接にコンテナ内に ssh する仕組みです。

出力で2点が気になりました:
* 結局 base OS の方に接続していたら、python もインストールされてないはずですので、requests not found ではなくそもそも python の実行が失敗していたと思いますが、python は別でインストールしていますか?
* `no such identity: config/ssh/id_rsa: No such file or directory` のメッセージは、task の「Setup environment」を実行していませんと思いますが、「Generate development swu」の際に setup で生成する鍵がないとエラーするはずです。とりあえず無視します。

> > A6E の製品マニュアル[1]を参考にすると、 my_project/container_armv7/dev ディレクトリ下に python_app_dev_image.swu が作成されたはずで、その swu を Armadillo でインストールするとコンテナが展開されます。
> > インストール方法がいくつかありますが、USB メモリに python_app_dev_image.swu と、初期設定がまだ行われてない場合に /home/atmark/mkswu/initial_setup.swu をコピーして、armadillo に接続すればインストールされるはずです。
>
> initial setupのイメージをインストールしたところエラーとなりました。
> テキストファイルにして添付しています。

ありがとうございます。
monitoring_container.conf は container_armv7/dev/root/etc/atmark/containers/python_app.conf を編集した物でしょうか?それか persist_file で試したものでしょうか?

エラーメッセージを日本語にすると「/etc/atmark/containers/
monitoring_container.conf で使われている「docker.io/alpine」コンテナがコンテナのイメージストレージにありません(ので、今のまま更新して再起動してしまったらこの monitoring_container を起動できません。よって、アップデートを失敗させます)」

解決方法は目的によりますが、vscode のプロジェクトのコンフィグではなければコンフィグファイルに「set_autostart no」を追加してアップデートが通るようになります。(コンフィグファイルを persist_file -d で削除するか、abos-ctrl podman-storage --disk で alpine のコンテナイメージを eMMC に保存するのも OK です)

その問題を解決できたらおそらく initial_setup.swu がインストール可能になって、次は python_app_dev_image.swu もインストールできるようになるはずです。
そこで再起動しておけば、python開発のコンテナが sshd を port 2222 で立てている状態で自動起動するはずで、「App run on armadillo」で使うことになります。

分かりにくい仕組みでお手数をおかけして申し訳ございません。vscode での開発は始めたばかりで荒いところがございますので、今のやりとりを参考にして今後の改善になります。とても助かります。

よろしくお願いします。

長々とお付き合いいただきありがとうございました。
無事、実行できました。
コンテナの仕組みについて勉強不足でお手間かけました。

最後に一つだけ質問なのですが
イメージは再起動後も自動的に起動しするのでしょうか。
電源投入時にイメージ内のpythonプログラムを自動起動する設定などマニュアルにありましたら
ページ番号をご教授ください。

at_dominique.m…

2023年4月28日 9時39分

nakayama244さん、

マルティネです。

> 長々とお付き合いいただきありがとうございました。
> 無事、実行できました。
> コンテナの仕組みについて勉強不足でお手間かけました。

こちらこそ仕組みが必要以上に難しくてすみません。
無事に動作できてよかったです。

> 最後に一つだけ質問なのですが
> イメージは再起動後も自動的に起動しするのでしょうか。
> 電源投入時にイメージ内のpythonプログラムを自動起動する設定などマニュアルにありましたら
> ページ番号をご教授ください。

この点も今週に気づいて改善しようと思います。
現在では、コンテナ自体は再起動の際に起動していますが、コピーしたアプリケーションがなくなって起動されません。

/etc/atmark/containers/python_app.conf (プロジェクトでは container_armv7/dev/root/etc/atmark/containers/python_app.conf )に以下の2ヶ所を編集すればアプリケーションが残って自動起動できるようになります:

set_image localhost/python_app_dev_image:latest
 
# /sys ※このコメントも無意味で改善する予定です… これがなくても /sys がコンテナにマウントされますが、
# デフォルトでは読み取り専用になっているため led に書き込みできません。これで書き込み可能になります。
add_volumes /sys:/sys
 
※ /root をボリュームにすることで、再起動しても保存されるようになります
add_volumes python_app:/root
 
# for ssh
add_ports 2222:22
 
# launch app at container startup
※ ここにスクリプトあったら実行させるようにします。
※ もっとマシなやり方があるかもしれませんが、とりあえず動きます…
set_command /bin/bash -c "/usr/sbin/sshd && if [ -e /root/python_app/src/main.py ]; then python3 /root/python_app/src/main.py; else sleep infinity; fi"

その後にpodman_start -aでコンテナを再起動させてもう一度 app run on armadillo を実行すれば、アプリが保存されて自動起動するはずです。

よろしくお願いします。

マルティネ様

> /etc/atmark/containers/python_app.conf (プロジェクトでは container_armv7/dev/root/etc/atmark/containers/python_app.conf )に以下の2ヶ所を編集すればアプリケーションが残って自動起動できるようになります:
>
>

> set_image localhost/python_app_dev_image:latest
> 
> # /sys ※このコメントも無意味で改善する予定です… これがなくても /sys がコンテナにマウントされますが、
> # デフォルトでは読み取り専用になっているため led に書き込みできません。これで書き込み可能になります。
> add_volumes /sys:/sys
> 
> ※ /root をボリュームにすることで、再起動しても保存されるようになります
> add_volumes python_app:/root
> 
> # for ssh
> add_ports 2222:22
> 
> # launch app at container startup
> ※ ここにスクリプトあったら実行させるようにします。
> ※ もっとマシなやり方があるかもしれませんが、とりあえず動きます…
> set_command /bin/bash -c "/usr/sbin/sshd && if [ -e /root/python_app/src/main.py ]; then python3 /root/python_app/src/main.py; else sleep infinity; fi"
> 

>
> その後にpodman_start -aでコンテナを再起動させてもう一度 app run on armadillo を実行すれば、アプリが保存されて自動起動するはずです。

confファイル編集後、
アプリをArmadilloで実行をすると権限エラー(permission denied)となります。
開始時にsshのキーを入力するWarning: Permanently added (ECDSA) to the list of known hosts.
のパスワードを要求される部分でパスワードを入力します。この操作で正しいパスを入力しますが
Permission denied, please try again.とされます。

設定を元に戻すと同じ操作でパスワードを入力してプログラムの実行はできる状態に戻りました。
ご教授頂いたrootのディレクトリに権限設定が必要でしょうか。

at_dominique.m…

2023年4月28日 14時59分

nakayama244さん、

> confファイル編集後、
> アプリをArmadilloで実行をすると権限エラー(permission denied)となります。
> 開始時にsshのキーを入力するWarning: Permanently added (ECDSA) to the list of known hosts.
> のパスワードを要求される部分でパスワードを入力します。この操作で正しいパスを入力しますが
> Permission denied, please try again.とされます。

すみません、最後まで確認しておらず誤った手順を提供しました。
コンテナの /root/.ssh/authorized_keys にプロジェクトの公開鍵が記載されていますので、 /root をまるごとボリュームにすると ssh できなくなります。
(ちなみにコンテナのパスワードが設定されてませんので、パスワード入力でログインでいないことは正常です)

ソースファイルは /root/python_app にコピーされてますので、ボリュームもそのパスに合わせたら再び接続できるようになると思います:

add_volumes python_app:/root/python_app

これもまだ試していませんので、今から確認します。何か別の問題があったらすぐに返事します。

よろしくお願いします。

at_dominique.m…

2023年4月28日 16時27分

nakayama244さん、

度々すみません。

> これもまだ試していませんので、今から確認します。何か別の問題があったらすぐに返事します。

/root/python_app のボリュームで無事に使えましたが、もう一点やや不便なところがあります。
今朝のコマンドでは python のアプリケーションを実行して、無事に終了したら sshd も同時に停止されますので、run app on armadillo は効かなくなります。

また、起動されているとしても、run app on armadillo ボタンはそれを無視してもう一度実行しているだけです。また、stop app のボタンでは pkill -f を使っているためコンテナをまるごと停止する結果になって、アプリケーションが再起動されます。

一つ目は以下のコンフィグにすることで、アプリケーションの実行後に sleep を実行すると解決されます。

add_volumes python_app:/root/python_app
set_command /bin/bash -c "/usr/sbin/sshd; if [ -e /root/python_app/src/main.py ]; then python3 /root/python_app/src/main.py; fi; exec sleep infinity"

二つ目は vscode プロジェクトの .vscode/tasks.json の pkill -f python3 を pkill python3 に変更することで stop が解決されます。
start の修正は scripts/run_armadillo.sh の copy_run 直前に task と同じ「ssh -F config/ssh_config Armadillo pkill python3」を追加すれば停止されてから実行します。

大変お手数をおかけして本当にすみません…そこまでしないと使えないなら、今のままの方がいいかもしれません。
(それか私から新しいスクリプトディレクトリを提供した方がはやい?かもしれません)
また何かエラーが発生したらまた聞いてください。

よろしくお願いします。