少し前からPythonのコードをWindowsで動作する実行ファイル化するという内容の内容を書いていました。WSLでは結構簡単にEXE化出来ていたにも関わらず、WindowsのNativeな実行ファイルを作成しょうとするとPythonのインストールに気をつけたり、C++のコンパイラが別途必要だったりと準備が大変でした。
【参考】
折角ならWSLで作成できた実行ファイル(ELFバイナリ)をWindowsでそのまま動作できたらいいのになと思っていたのですが、実は既に知っているものでした。そう、wsl.exeでした。あー忘れてました🙄
wslコマンドでWSLの実行ファイルを呼び出す
wslコマンドを使えば、WindowsからWSL内の実行ファイルを直接実行することができます。基本的な構文は以下のようになります:
PS> wsl -d ディストリビューション名 実行ファイルのパス
例えば、WSLのUbuntuディストリビューションがMyUbuntuで/home/username/myappという実行ファイルがある場合には、WindowsのコマンドプロンプトやPowerShellから以下のように実行できます。
PS> wsl -d Ubuntu /home/username/myapp
実際の使用例
私の環境で試してみました。まず、WSL内でPythonスクリプトをNuitkaでEXE化(実際にはELFバイナリ)したファイルがありそれを実行する場合には以下のようになります。
🐧WSL側での作業
# WSL内での作業(ユーザ名は`uesr2404`) $ cd /home/user2404/nuitka $ nuitka --onefile hello.py

これでカレントディレクトリにhello.binという実行ファイルができます。このファイルをWindowsから実行するには以下の様にします。
🪟WindowsのPowerShellでの作業
# PowerShellから実行 PS> wsl -d MyUbuntu /home/user2404/nuitka/hello.bin
ディストリビューションの指定をしないとエラーが発生します。また、実行するユーザ名はデフォルトユーザ名になります。もしユーザ名を変更する場合には-uを使用してユーザ指定を行います。
# ユーザ名を指定してPowerShellから実行(今回はroot) PS> wsl -d MyUbuntu -u root /home/user2404/nuitka/hello.bin
🪟コマンドラインでの引数の渡し方
実行ファイルに引数を渡したい場合は以下のように行います。プログラムを起動させる通りにコマンドラインを記述すればよいのですが、ファイルのパスはWindowsが認識できる形式である必要があります。プログラムの起動はLinux側のパスを使用するのに、引数で指定のファイル名はWindows形式というのがわかりにくくなっているかもしれません。
PS> wsl -d Ubuntu /home/username/dist/myscript.bin file.txt
🪟Windowsのショートカットを使用する場合
頻繁に使う実行ファイルの場合、Windowsのショートカットを作成すると便利です。
【デスクトップで右クリック】→ 【新規作成】→【ショートカット】

【項目の場所を入力してください】にPowerShellのプロンプトで実行するように入力して、【次へ】ボタンをクリックします。
wsl -d Ubuntu /home/username/dist/myscript

【ショートカット名】を設定して【完了】ボタンをクリック

作成されたショートカット

ショートカットからの実行

バッチファイル化
より柔軟に使いたい場合は、バッチファイル(.bat)やPowerShellスクリプト(.ps1)を作成することもできます。
【バッチファイルの例】run_myapp.bat
@echo off wsl -d MyUbuntu -u root /home/user2404/nuitka/hello.bin


引数を持つプログラムでは下記のようにします。%*により、バッチファイルに渡された引数がそのまま実行ファイルに転送されます。
wsl -d Ubuntu /home/username/dist/myscript %*
注意点とTips
🪟パスの指定について
WSL内のファイルパスは絶対パスで指定するのが確実です。相対パスを使う場合は、WSL内でのカレントディレクトリに注意が必要です。
🪟ファイルアクセスの考慮
WSLの実行ファイルからWindowsのファイルにアクセスする場合、/mnt/c/のようなマウントパスを使用する必要があります。
PS> wsl -d Ubuntu /home/username/dist/myscript /mnt/c/Users/username/data.txt
🪟環境変数の設定
WSL内で特定の環境変数が必要な場合は、実行前に設定するか、wslコマンドで直接指定できます。
PS> wsl -d Ubuntu -e PYTHONPATH=/custom/path /home/username/dist/myscript
おわりに
すっかり忘れていましたが、wslコマンドを使えばWSLで作成した実行ファイルをWindowsから簡単に実行できます。これで、わざわざWindows用にビルドし直す必要もなく、WSLの軽量で快適な開発環境をそのまま活用できるのが大きな利点です。ただ、WSLの中のバイナリを動作させるので初回起動ではちょっと時間がかかってしまうのが難点でしょうか。