あづみのメモ帳

PlatformIO Coreを(グローバルな)Pythonインストールなしでインストールしてみた

ArduinoやESP32などを開発するための環境として主流なPlatformIOだが、これは通常VSCodeの拡張機能であるPlatformIO IDEを介して使うことが多い。しかし、VSCodeは使わないという人間もこの世界には存在するらしく、その場合はIDEが内部で使っているPlatformIO Coreを単独でインストールし、pioコマンドを直接使うことになる。CoreのインストールにはPythonが必要になるが、Windowsにはそんな邪悪なものは標準搭載されていない。そこで、きれいなWindowsを汚さずにPlatformIO Coreをインストールする方法を調べてみた。

公式の方法

まず、通常のPlatformIO Coreのインストール方法を確認してみる。公式ドキュメントによれば、get-platformio.pyなるスクリプトをダウンロードして実行すればよいだけのようだ。しかし、これはPythonスクリプトであり、実行にはPythonが必要である。システム要件にもしれっと「Python Interpriter」とか書かれている。

しかし、VSCodeでIDEを使うときには、Pythonのグローバル環境へのインストールは必要なかった。これも内部ではPlatformIO Coreを使っているはずで、Core単品インストールも同じようにPythonのインストールなしで達成できるはずである。

ポータブル版Pythonを使う

実は、PlatformIO IDEのようなPlatformIO Coreと連携して動作するアプリケーションにおけるCoreのインストール方法も、公式ドキュメントに記載されている。ここでもPythonが必要とされているが、「ユーザにPythonをインストールするよう要求」のほかに、「ポータブル版Pythonを落としてくる」という選択肢も提示されている。これを手動で行えば、IDEと同じように綺麗にPlatformIO Coreをインストールできるはずである。なお、本当にIDEと同じ状態にするだけなので、すでにPlatformIO IDEを使っている場合はこの手順は飛ばしてよい。

まずは言われた通りにポータブル版Pythonをダウンロードする。公式ドキュメントにあるAPIをブラウザで叩き、python-portable-windows_amd64-x.y.z.tar.gzみたいなやつのURLを見つけてダウンロード、展開する。Microsoft EdgeだとJSONの整形出力を有効にすると見やすかった。URL等からも分かる通り、これはPlatformIOがCoreの動作環境用に直々に提供しているもので、Python公式の埋め込み版と異なり、pipがそのまま使える(?)ようになっているようである(Python公式の埋め込み用パッケージみたいなのでやったらpipがどうこうで失敗した)。

これを任意の邪魔にならない場所(VSCode拡張に合わせるなら~\.platformio\python3\)に展開し、そこでターミナルを開いたら、あとは最初の方法と同じようにget-platformio.pyをダウンロードして実行するだけである。公式ドキュメントではWindowsではGUIをぽちぽちしてダウンロードすることが想定されているが、今時はWindowsにもcurl.exeがあるのでLinuxと同じようにすればよい。なお、.exeをつけないとPowerShellのコマンドが呼ばれてしまうので注意。

curl.exe -fsSL -o get-platformio.py https://raw.githubusercontent.com/platformio/platformio-core-installer/master/get-platformio.py
.\python.exe get-platformio.py

インストール後には~\.platformio\penv\にPythonのvenvの仮想環境が作成されるが、ここにあるpython.exe等はインストールに使用した環境に処理を流すだけのラッパーである。つまり、もし万が一グローバルのPythonを使っていたりしたら、このPlatformIOの環境もいつ破壊されるか分からないグローバルのPythonに依存するというおぞましいことになっていたということになる。したがって、もしすでにPythonがインストールされている場合でも、ポータブル版を使ったほうが都合がよい。

以上の手順で、PlatformIO IDEをVSCode上でインストールしたときと同様にpio.exeが存在する状態になった。

パスを通す

あとはインストールスクリプトが最後に表示するように、~\.platformio\penv\Scripts\にパスを通せばpioコマンドが使えるようになる……のだが、このディレクトリにはpython.exeが存在している。つまり、これに従ってしまうと、グローバルにパスの通ったPythonが存在している状態になってしまう。ひどいトラップである。そもそも仮想環境は都度有効化して使うものであって、グローバルにパスを通すものではない。

しかし、諦めるのはまだ早い。以下のように適当なディレクトリ(ここでは~\.platformio\penv\bin\)にpio.exeへのリンクを作成し、そのディレクトリのほうだけにパスを通せば、pioだけにパスが通るようになる。ちなみに、LinuxやmacOSだとvenvの環境は(環境名)/bin/に作成されるらしいのでそれをパクった。なお、PlatformIO IDEをVSCodeで使用しつつ、pioコマンドも単独で使えるようにしたいという場合は、この手順だけを実行すればよい。

cd ~\.platformio\penv\
mkdir bin
fsutil hardlink create .\bin\pio.exe .\Scripts\pio.exe

……なんなんすかねこれ。

あとがき

いつもPythonが関わるとロクなことにならない。どうせならポータブル版の用意も含めてPowerShellか何かのスクリプトにしておいてほしかった。ちなみに、PlatformIO IDEでの環境構築は独立したNode.jsパッケージに切り出されているが、単独で簡単に利用するようにはできていなさそうである。