パッケージ管理
mip によるパッケージのインストール
ネットワークに対応したボードには micropython-lib とサードパーティのサイト(GitHub や GitLab)からパッケージをインストールできる mip モジュールがあります。
mip ("mip installs packages")は、Python の pip ツールとコンセプトが同じものですが、PyPI インデックスを使わず、デフォルトのインデックスとして micropython-lib を使います。 mip は micropython-lib からダウンロードする際に、コンパイルされた .mpy ファイル を自動的に取得します。
mip を使う最も一般的な方法は REPL からです:
>>> import mip
>>> mip.install("pkgname") # "pkgname" (と依存するもの)の最新バージョンをインストール
>>> mip.install("pkgname", version="x.y") # "pkgname" のバージョン x.y をインストール
>>> mip.install("pkgname", mpy=False) # ソース版 (つまり .mpy ではなく .py ファイル)をインストール
mip は /lib で終わる最初のエントリを sys.path から検索することにより、ファイルシステム上のインストール場所を適切に検出します。 target を使ってインストール場所を上書きすることもできますが、後でインポートできるようにするには上書きしたパスが sys.path にあるようにしておく必要があります:
>>> mip.install("pkgname", target="third-party")
>>> sys.path.append("third-party")
mip は micropython-lib インデックスからパッケージをダウンロードするだけでなく、サードパーティのライブラリもインストールできます。最も簡単な方法は、直接ファイルをダウンロードすることです:
>>> mip.install("http://example.com/x/y/foo.py")
>>> mip.install("http://example.com/x/y/foo.mpy")
ファイルを直接インストールする場合でも target 引数をサポートしていますが、 mpy と version 引数は無視します。
The URL can also start with github: or gitlab: as a simple way of pointing to content
hosted on GitHub or GitLab:
>>> mip.install("github:org/repo/path/foo.py") # デフォルトブランチを使用
>>> mip.install("github:org/repo/path/foo.py", version="branch-or-tag") # ブランチまたはタグを指定するオプション
>>> mip.install("gitlab:org/repo/path/foo.py") # デフォルトブランチを使用
>>> mip.install("gitlab:org/repo/path/foo.py", version="branch-or-tag") # ブランチまたはタグを指定するオプション
より複雑なパッケージ(つまり、複数のファイルまたは依存関係を持つパッケージ)は、その package.json へのパスを指定することでダウンロードできます。
>>> mip.install("http://example.com/x/package.json")
>>> mip.install("github:org/user/path/package.json")
>>> mip.install("gitlab:org/user/path/package.json")
json ファイルが指定されていない場合、 "package.json" が暗黙的に追加されます。
>>> mip.install("http://example.com/x/")
>>> mip.install("github:org/repo") # デフォルトのブランチを使用
>>> mip.install("github:org/repo", version="branch-or-tag")
>>> mip.install("gitlab:org/repo") # デフォルトのブランチを使用
>>> mip.install("gitlab:org/repo", version="branch-or-tag")
Unixポートでの mip の使い方
Unix ポートでは上記のように REPL で mip を使えます。また -m でも使えます:
$ ./micropython -m mip install pkgname-or-url
$ ./micropython -m mip install pkgname-or-url@version
--target path 、 --no-mpy 、 --index 引数を指定できます:
$ ./micropython -m mip install --target third-party pkgname
$ ./micropython -m mip install --no-mpy pkgname
$ ./micropython -m mip install --index https://host/pi pkgname
mpremote を使ったパッケージのインストール
mpremote ツールには mip と同様の機能があり、ホストPCからローカルに(USB または UART などで)接続されたデバイスにパッケージをインストールするために使えます:
$ mpremote mip install pkgname
$ mpremote mip install pkgname@x.y
$ mpremote mip install http://example.com/x/y/foo.py
$ mpremote mip install github:org/repo
$ mpremote mip install github:org/repo@branch-or-tag
$ mpremote mip install gitlab:org/repo
$ mpremote mip install gitlab:org/repo@branch-or-tag
--target=path 、 --no-mpy 、 --index 引数を指定できます:
$ mpremote mip install --target=/flash/third-party pkgname
$ mpremote mip install --no-mpy pkgname
$ mpremote mip install --index https://host/pi pkgname
mpremote は、ホストのローカルファイルシステムに保存されているファイルからもパッケージをインストールできます。
$ mpremote mip install path/to/pkg.py
$ mpremote mip install path/to/app/package.json
$ mpremote mip install \\path\\to\\pkg.py
これは特に、開発中のパッケージのテストや GitHub リポジトリのローカルクローンからパッケージをインストールする際に便利です。なお package.json ファイル内の URL では、Windows 上でもディレクトリの区切りとしてスラッシュ("/")を使う必要があります。これは Web からのインストールとの互換性を確保するためです。
手動でのパッケージのインストール
パッケージのインストールは、(.py または .mpy 形式のいずれかの)ファイルを手動でデバイスにコピーすることでも可能です。ボードによって、USB Mass Storage 、mpremote ツール(たとえば mpremote fs cp path/to/package.py :package.py)、 webrepl などを介してコピーできます。
パッケージの作成と公開
micropython-lib に公開することは、MicroPython ユーザーに広くアクセス可能にする最も簡単な方法であり、 mip や mpremote から自動的に利用可能になり、バイトコードにコンパイルされます。詳細については https://github.com/micropython/micropython-lib を参照してください。
mip または mpremote からダウンロードできる "self-hosted" パッケージを作成するには、静的Webサーバー(または GitHub)を用意して、単一の .py ファイル、または複数の .py ファイルと一緒にした package.json ファイルをホストする必要があります。
GitHub にホストされている mlx90640 ライブラリの例は、次のようにインストールできます:
$ mpremote mip install github:org/micropython-mlx90640
GitHub 上のパッケージのレイアウトは次のようになります:
https://github.com/org/micropython-mlx90640/
package.json
mlx90640/
__init__.py
utils.py
package.json には、インストールするファイルの場所や他の依存関係を指定します:
{
"urls": [
["mlx90640/__init__.py", "mlx90640/__init__.py"],
["mlx90640/utils.py", "mlx90640/utils.py"]
],
"deps": [
["collections-defaultdict", "latest"],
["os-path", "latest"],
["github:org/micropython-additions", "main"],
["gitlab:org/micropython-otheradditions", "main"]
],
"version": "0.2"
}
urls リストには、次にしたがってインストールするファイルを指定します:
"urls": [
[destination_path, source_url]
...
destination_path には、デバイス上にインストールするファイルの保存場所および名前を指定します。 source_url にはインストールするファイルの URL を指定します。通常、source_url は package.json ファイルを含むディレクトリからの相対パスとして指定しますが、絶対URL(例: https://example.com/path/to/file.py)でも指定できます。
["mlx90640/utils.py", "github:org/micropython-mlx90640/mlx90640/utils.py"]
このパッケージは collections-defaultdict と os-path に依存しており、これらは micropython-lib から自動的にインストールされます。3つ目の依存関係は、GitHub リポジトリ org/micropython-additions の main ブランチの package.json ファイルで定義されている内容をインストールします。
パッケージの凍結
Python のモジュールやパッケージをデバイスのファイルシステムからインポートすると、VMで実行できるように RAM 上で バイトコード にコンパイルされます。 .mpy ファイル の場合、この変換はすでに行われていますが、それでもバイトコードは RAM 上にあります。
小メモリのデバイスや大規模なアプリケーションでは、バイトコードを ROM (フラッシュメモリ)から実行する方が有利です。これは、バイトコードを MicroPython ファームウェアに「凍結」してから、デバイスにフラッシュすることで実現できます。ランタイムパフォーマンスは同じですが(ただし、インポートはより高速です)、プログラムが使う RAM を大幅に解放できます。
このアプローチの欠点は、パッケージを変更たびにファームウェアをフラッシュしなければならないので開発がはるかに遅くなることですが、頻繁に変更されない依存パッケージを凍結することは依然として有用です。
マニフェストファイルを作成して、それをビルドで使うことで、通常はカスタムボード定義の一部として凍結を行います。詳細については MicroPython マニフェストファイル のガイドを参照してください。