WSL2でmatplotlibをプロットしようと思ったら...
なぜか出力するディスプレイが見つからないということを言われてしまったので, いろいろと調べてみました.
(9/21/2021) 追加情報
現在、InsiderProgram上でWSLgの開発が走っているので、将来的にはVcXsrvを使わずともネイティヴにGUI環境を実行できるようになるかと思います!
参考記事: Windows 10 HomeでWSLgをさっそく試してみた
参考としたサイト
Can't use X-Server in WSL 2 #4106
こちらのサイトにほとんど解決策が載っておりますので, こちらの記事から抽出してまとめました.
VcXsrvの自動起動設定
-
xlaunch.exeという実行ファイルがあると思いますので, 起動します.
-
multiple window を選んで, 次へを選択します.
-
start no client を選んで, 次へを選択します.
-
clipboard を使用したければ, clipboardにチェックを入れます.
-
Additional parameters for VcXsrv という入力フォームに -ac と入力して, 次へを選択します.
-
Save configuration を押して, どこかアクセスしやすい場所(デスクトップとか)に保存してください.
-
完了を押してxlaunchを終了します.
-
続いて,
Windowsキー + r
を押して, shell:startupと入力して検索します. -
スタートアップというフォルダが開きますので, ここに先ほどxlaunchを用いて作成したファイルを移動してしまってください.
これで, 自動的にVcXsrvがパソコンの起動時に立ち上がるようになりました.
WSL上のディスプレイの設定
最後にVcXsrvの存在をWSLに教えてあげましょう.
- Windows PowerShell を開きます.
-
ipconfig
と入力します. -
イーサネット アダプター vEthernet (WSL)という項がありますので, その部分のIPv4 アドレス** をメモしておきます. 仮にここでは
aaa.bbb.ccc.ddd
としておきます. - WSLを開きます.
- vim や nano などで
~/.bashrc
を開きます. - 開いた.bashrcの最後の行に, 以下のコマンドを追記して保存してください.
export DISPLAY=aaa.bbb.ccc.ddd:0
最後にWSLを再起動すると, 先ほど編集した.bashrcが読み込まれて, 設定が反映されます.
まだ改善できていない点
WSLに割り当てられるIPアドレスは再起動を行うたびに変更してしまうそうです。今の所IPアドレスを固定する術が見当たらないため、なにか情報がありますとありがたいです。
2019年9月現在はps1ファイルを作成してIPアドレスの割当を行っております。
追記
MicrosoftのissueにIPアドレスの割当方法が解決されていましたのでご紹介します。
export DISPLAY=$(cat /etc/resolv.conf | grep nameserver | awk '{print $2}'):0
上の項で説明したexportの指示をこちらに変えていただけたらと思います。
追記2
taichi-ishitaniさまによると、次の方法で/etc/resolv.conf
を参照せずともIPアドレスを割り当てることができるとコメントしていただきました。情報提供のほど感謝いたします。
export DISPLAY=`hostname`.mshome.net:0.0
参考記事: WSL2 での DISPLAY 設定
最後に
VcXsrv側に-ac
というオプションを加えましたが, 参考サイトによりますとパブリックアクセスを許可するコマンドであるそうです. WSL2が新たなコンテナシステムを形成したことによるのかと思われます。