パッケージ管理

mip でパッケージをインストールする

ネットワーク対応ボードには mip モジュールが含まれており、micropython-lib やサードパーティのサイト(GitHub、GitLab を含む)からパッケージをインストールできます。

mip("mip installs packages")は概念的に Python の pip ツールに似ていますが、PyPI インデックスを使用せず、既定では micropython-lib をインデックスとして使用します。mip は micropython-lib からダウンロードする際、コンパイル済みの .mpy file を自動的に取得します。

mip を使用する最も一般的な方法は REPL からです:

>>> import mip
>>> mip.install("pkgname")  # Installs the latest version of "pkgname" (and dependencies)
>>> mip.install("pkgname", version="x.y")  # Installs version x.y of "pkgname"
>>> mip.install("pkgname", mpy=False)  # Installs the source version (i.e. .py rather than .mpy files)

mip/lib で終わる最初のエントリを sys.path から検索することで、ファイルシステム上の適切な場所を検出します。target を使って宛先を上書きできますが、後でインポートできるようにするには、このパスが sys.path に含まれている必要があることに注意してください:

>>> mip.install("pkgname", target="third-party")
>>> sys.path.append("third-party")

micropython-lib インデックスからパッケージをダウンロードするだけでなく、mip はサードパーティのライブラリもインストールできます。最も簡単な方法はファイルを直接ダウンロードすることです:

>>> mip.install("http://example.com/x/y/foo.py")
>>> mip.install("http://example.com/x/y/foo.mpy")

ファイルを直接インストールする場合、宛先パスを設定する target 引数は引き続きサポートされますが、mpyversion は無視されます。

URL は、GitHub または GitLab でホストされているコンテンツを指す簡単な方法として、github: または gitlab: で始めることもできます:

>>> mip.install("github:org/repo/path/foo.py")  # Uses default branch
>>> mip.install("github:org/repo/path/foo.py", version="branch-or-tag")  # Optionally specify the branch or tag
>>> mip.install("gitlab:org/repo/path/foo.py")  # Uses default branch
>>> mip.install("gitlab:org/repo/path/foo.py", version="branch-or-tag")  # Optionally specify the 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")  # Uses default branch of that repo
>>> mip.install("github:org/repo", version="branch-or-tag")
>>> mip.install("gitlab:org/repo")  # Uses default branch of that repo
>>> mip.install("gitlab:org/repo", version="branch-or-tag")

Unix ポートで mip を使用する

Unix ポートでは、mip は上記のように REPL で使用できるほか、-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 [email protected]
$ 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 は、Web からのインストールと互換性を保つために、Windows 上でもディレクトリ区切りとしてスラッシュ("/")を使用する必要があることに注意してください。

パッケージを手動でインストールする

ファイルを手動でデバイスにコピーすることでも、パッケージを(.py または .mpy 形式で)インストールできます。ボードによっては USB マスストレージ、mpremote ツール(例: mpremote fs cp path/to/package.py :package.py)、webrepl などを経由することになります。

パッケージの作成と公開

micropython-lib への公開は、パッケージを MicroPython ユーザーに広くアクセス可能にする最も簡単な方法であり、mipmpremote を通じて自動的に利用可能となり、バイトコードにコンパイルされます。詳細は https://github.com/micropython/micropython-lib を参照してください。

mipmpremote でダウンロードできる「セルフホスト」パッケージを作成するには、単一の .py ファイル、または .py ファイルと並んだ package.json ファイルをホストするための静的 Web サーバー(または GitHub)が必要です。

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 です。ソース URL は通常、package.json ファイルを含むディレクトリからの相対で指定されますが、絶対 URL にすることもできます。例:

["mlx90640/utils.py", "github:org/micropython-mlx90640/mlx90640/utils.py"]

このパッケージは collections-defaultdictos-path に依存しており、これらは micropython-lib から自動的にインストールされます。3 番目の依存関係は、GitHub リポジトリ org/micropython-additionsmain ブランチの package.json ファイルで定義されたコンテンツをインストールします。

パッケージのフリーズ

Python モジュールやパッケージがデバイスのファイルシステムからインポートされると、VM によって実行できるよう RAM 内で bytecode にコンパイルされます。.mpy file の場合、この変換はすでに行われていますが、それでもバイトコードは RAM に置かれます。

メモリの少ないデバイスや大規模なアプリケーションでは、代わりにバイトコードを ROM(つまりフラッシュメモリ)から実行する方が有利な場合があります。これは、バイトコードを MicroPython ファームウェアに「フリーズ」し、それをデバイスにフラッシュすることで実現できます。実行時のパフォーマンスは同じ(ただしインポートは高速になる)ですが、プログラムが使用できる RAM をかなりの量解放できます。

この手法の欠点は、毎回ファームウェアをフラッシュしなければならないため開発がはるかに遅くなることですが、頻繁に変更されない依存関係をフリーズするのには依然として有用です。

フリーズは、マニフェストファイルを記述し、それをビルドで使用することによって行われ、多くの場合カスタムボード定義の一部として行われます。詳細は MicroPython マニフェストファイル ガイドを参照してください。