2022年1月2日日曜日

MINDSTORMS Pythonで if __name__ == "__main__"

 if __name__ == "__main__"

Pythonのドキュメントによると

モジュールは、自身の __name__ をチェックすることでメインスコープで実行されているかどうかを確認できます。これはモジュールがスクリプトとして、あるいはインポートでなく python -m で起動されたときに実行するコードの条件として使用できる一般的なイディオムです:

とあります。
ライブラリを作成している時にテストコードを書く場合に良く使用されますが、今回のLEGOでのライブラリ化では使用できませんでした。

色々試した結果以下の方法で実現できました。

LEGOでif __name__ == "__main__"

プロジェクトとして実行された場合にHUBのメモリやディスクの使用状況を表示しています。

if __file__.split('/')[3] == '__init__.mpy':
    import os
    import gc
    import micropython
    print('-----------------------------')
    stat = os.statvfs('/')
    total_size = stat[0] * stat[2]
    free_size = stat[0] * stat[4]
    print('each block is {} bytes big'.format(stat[0]))
    print("in bytes, that's {} bytes free out of a total of {}".format(free_size, total_size))
    print('-----------------------------')
    gc.collect()
    micropython.mem_info()
    print('-----------------------------')
    print('Initial free: {} allocated: {}'.format(gc.mem_free(), gc.mem_alloc()))
    print('-----------------------------')    
実行すると
-----------------------------
each block is 4096 bytes big
in bytes, that's 29052928 bytes free out of a total of 32505856
-----------------------------
mem: total=595907, current=402437, peak=404485
stack: 1052 out of 7168
GC: total: 242368, used: 193024, free: 49344
 No. of 1-blocks: 3072, 2-blocks: 892, max blk sz: 321, max free sz: 869
-----------------------------
Initial free: 49344 allocated: 193024
-----------------------------
ストレージとしては32Mバイトの殆どが空いていることがわかります。
また、MicroPythonの場合、実行中のプログラムがオブジェクトをインスタンス化すると、必要なメモリがヒープから割り当てられますが、その空き容量が49Kバイト程あることもわかります。

0 件のコメント:

コメントを投稿

MINDSTORMS Python まとめ

 MINDSTORMS Python 全部入り 今まで実装してきた非同期処理、ステートマシン、独自ライブラリについて全てまとめたソースについて GiHub へ公開しておきました。 非同期処理で距離センサーを使用しながら、ステートマシンで直進します。距離センサーが20cm以内に物体...